首页 > 代码库 > WebSphere中对response.sendError()的处理与Tomcat不同

WebSphere中对response.sendError()的处理与Tomcat不同

不同的地方在于,同样的代码【response.sendError(1);】

在Tomcat下,response.getResponseCode()的值是 1,而在Websphere下面则是 500。

而且500这个东西比较尴尬,一般的web框架都会在web.xml里面默认让它迁移到错误页面。

由此,对于调用远端服务器servlet进行验证,需要给出结果的时候,可以根据response.getResponseCode()

进行分支判断的想法就不能借助response.sendError()来实行。

解释下,web后台调用远端服务器的时候一般使用HttpURLConnection,调用完毕之后,需要进行分支处理的时候,

最好使用response.getResponseCode(),而不是通过

BufferedReader rd = new BufferedReader(new InputStreamReader(con.getInputStream(), CommonValue.CHAR_SET));

String line = "";

while ((line = rd.readLine()) != null) {

}

来读这个stream内容,为什么呢,因为有可能返回的stream内容不同,有的时候是字符串,有的时候是一个文件流。

而且InputStream十分不好备份,因为为了备份而提供的两个方法mark()和reset()也是需要先自己实现了之后才能用的。

远端servlet的response不能用刚才的sendError()那用什么呢,用setStatus();

下面给出例子:

 

本地Server

 1     public boolean downloadLogFromAp(String apNo) throws Exception { 2  3         super.currentForm.set(WebConst.WS0120Form.CAN_DOWNLOAD_FLG, CommonValue.NULL_SPACE); 4         String filepath = CommonValue.NULL_SPACE; 5         String httpsURL = CommonValue.NULL_SPACE; 6  7         if (CommonValue.STRING_ONE.equals(apNo)) { 8  9             filepath = PropertyFileReader.getTachiaiProperties("AP01PATH") + super.currentForm.getString(WS0120Form.AP1LOGFILEPATH);10             httpsURL = PropertyFileReader.getTachiaiProperties("AP01URL");11         } else {12 13             filepath = PropertyFileReader.getTachiaiProperties("AP02PATH") + super.currentForm.getString(WS0120Form.AP2LOGFILEPATH);14             httpsURL = PropertyFileReader.getTachiaiProperties("AP02URL");15         }16 17         String logfileparam = "logfilepath" + ServletConst.SIGN_OF_EQUALITY + filepath;18         URL myurl = new URL(httpsURL);19         HttpURLConnection con;20         if ("https".equals(httpsURL.substring(0, 5))) {21             con = (HttpsURLConnection) myurl.openConnection();22         } else {23             con = (HttpURLConnection) myurl.openConnection();24         }25 26         con.setRequestMethod("POST");27         con.setConnectTimeout(60000);28         con.setReadTimeout(60000);29         con.setInstanceFollowRedirects(false);30         con.setUseCaches(false);31         con.setDoOutput(true);32 33         OutputStream out = con.getOutputStream();34         Writer wout = new OutputStreamWriter(out);35         wout.write(logfileparam);36         //wout.flush();37         wout.close();38 39         if (con.getResponseCode() == 200) {40 41             HttpServletResponse response = super.currentResponse;42             response.setHeader("Content-Type", "text/plain");43             String zipfileName = getServerZipFileName(filepath);44             response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(zipfileName, "UTF-8"));45             OutputStream os = response.getOutputStream();46             InputStream is = con.getInputStream();47             DownloadUtil.transfer(is, os);48             con.disconnect();49             return true;50         } else if (con.getResponseCode() == 1) {51             // ログファイルが存在しない場合、エラーメッセージを表示する。52             super.dispatchAction.getActionMessages().add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(MessageId.MSG_E_001_082));53             con.disconnect();54             return false;55         } else {56             con.disconnect();57             return false;58         }59     }

 

远端Servlet

  1 package jp.co.kentaku.kanri.tachiai.web.servlet;  2   3 import java.io.BufferedReader;  4 import java.io.File;  5 import java.io.FileInputStream;  6 import java.io.FileOutputStream;  7 import java.io.IOException;  8 import java.io.InputStream;  9 import java.io.InputStreamReader; 10 import java.io.OutputStream; 11 import java.io.PrintWriter; 12 import java.net.URLEncoder; 13  14 import javax.servlet.ServletException; 15 import javax.servlet.http.HttpServlet; 16 import javax.servlet.http.HttpServletRequest; 17 import javax.servlet.http.HttpServletResponse; 18  19 import jp.co.kentaku.common.tools.LogUtil; 20 import jp.co.kentaku.kanri.tachiai.common.TachiaiConst; 21 import jp.co.kentaku.kanri.tachiai.common.util.DownloadUtil; 22 import jp.co.kentaku.kanri.tachiai.renkei.common.ServletConst; 23  24 import org.apache.commons.lang.StringUtils; 25 import org.apache.tools.ant.BuildException; 26 import org.apache.tools.ant.Project; 27 import org.apache.tools.ant.taskdefs.Zip; 28 import org.apache.tools.ant.types.FileSet; 29  30  31 public class LogFileDownloadServlet extends HttpServlet { 32  33     /** シリアル?バージョンID */ 34     private static final long   serialVersionUID = 1L; 35  36     private static final String FILE_SEPARATOR   = File.separator; 37  38  39     /** 40      * GET方式でサーブレット主処理を行う。 41      * 42      * @param req リクエスト 43      * @param resp レスポンス 44      */ 45     @Override 46     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 47  48         this.doPost(req, resp); 49     } 50  51  52     /** 53      * POST方式でサーブレット主処理を行う。 54      * 55      * @param req リクエスト 56      * @param resp レスポンス 57      */ 58     @Override 59     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 60  61         LogUtil.debug("jp.co.kentaku", "ログファイルダウンロードサーブレット開始。"); 62         //ログファイルパスを取得する。 63         String filepath = null; 64         BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream())); 65         String line = ""; 66         if ((line = br.readLine()) != null) { 67             if (!StringUtils.isEmpty(line)) { 68                 String[] arr = line.split(ServletConst.SIGN_OF_EQUALITY); 69                 if (arr.length == 2) { 70                     filepath = arr[1]; 71                 } 72             } 73         } 74  75         //ログファイル名正確の場合、ログファイルをダウンロードする。 76         if (!StringUtils.isEmpty(filepath)) { 77             downloadZip(filepath, resp); 78         } else { 79             resp.setHeader("Content-Type", "text/plain;charset=Shift_JIS"); 80             PrintWriter out = resp.getWriter(); 81             out.print("ログファイルダウンロードサーブレットで、ログファイル" + filepath + "がNULLであるから、エラーとする。"); 82             LogUtil.error("jp.co.kentaku", "ログファイルダウンロードサーブレットで、ログファイル" + filepath + "がNULLであるから、エラーとする。"); 83             out.flush(); 84             out.close(); 85         } 86  87         LogUtil.debug("jp.co.kentaku", "ログファイルダウンロードサーブレット終了。"); 88     } 89  90  91     /** 92      * ログファイルをダウンロードする 93      *  94      * @param filepath ダウンロードパス 95      * @param response レスポンス 96      * @throws IOException 例外 97      */ 98     private void downloadZip(String filepath, HttpServletResponse response) throws IOException { 99 100         boolean isMultiFilesName = isMultiFilesName(filepath);101         File zipfolder = null;102         if (isTargetExists(filepath, isMultiFilesName)) {103             zipfolder = getZipTargetDir(filepath, isMultiFilesName);104             String zippath = zipfolder.getName() + ".zip";105             zipFile(zippath, zipfolder);106             response.setHeader("Content-Type", "application/zip");107             response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(zippath, "UTF-8"));108             OutputStream os = response.getOutputStream();109             File zipfile = new File(zippath);110             InputStream is = new FileInputStream(zipfile);111             DownloadUtil.transfer(is, os);112             zipfile.delete();113             for (File file : zipfolder.listFiles()) {114                 file.delete();115             }116             zipfolder.delete();117             LogUtil.debug("jp.co.kentaku", "ログファイルダウンロードサーブレット経由し、ファイル" + filepath + "をダウンロードした。");118         } else {119             response.setHeader("Content-Type", "text/plain;charset=Shift_JIS");120             response.setStatus(1);121             LogUtil.error("jp.co.kentaku", "ログファイルダウンロードサーブレットで、ログファイル" + filepath + "が存在しないから、エラーとする。");122         }123 124     }125 126 127     /**128      * 圧縮対象フォルダを取得する129      * 130      * @param filepath ダウンロードパス131      * @param isMultiFilesName 複数件フラグ132      * @return 圧縮対象フォルダ133      * @throws IOException 例外134      */135     private File getZipTargetDir(String filepath, boolean isMultiFilesName) throws IOException {136 137         File targetDir = null;138         if (isMultiFilesName) {139             int lastIndex = filepath.lastIndexOf(FILE_SEPARATOR) + 1;140             String toFileName = filepath.substring(lastIndex, filepath.length() - 1);141             File toFolder = new File(TachiaiConst.TachiaiProperties.TACHIAI_DATA_DIR + toFileName + ".log.all");142             if (!toFolder.exists()) {143                 toFolder.mkdirs();144             }145             File fromFolder = new File(filepath.substring(0, lastIndex));146             for (File file : fromFolder.listFiles()) {147                 if (file.isFile() && file.getName().startsWith(toFileName)) {148                     copyFile(new File(fromFolder, file.getName()), new File(toFolder, file.getName()));149                 }150             }151             targetDir = toFolder;152 153         } else {154             File fromFile = new File(filepath);155             File toFile = new File(TachiaiConst.TachiaiProperties.TACHIAI_DATA_DIR + fromFile.getName());156             if (!toFile.exists()) {157                 toFile.mkdirs();158             }159             copyFile(fromFile, new File(toFile, fromFile.getName()));160             targetDir = toFile;161 162         }163         return targetDir;164     }165 166 167     /**168      * ログファイルを圧縮する169      * 170      * @param zippath 圧縮先パス171      * @param zipfolder 圧縮対象フォルダ172      * @throws BuildException 例外173      */174     private void zipFile(String zippath, File zipfolder) throws BuildException {175 176         //ログファイルをZIPに圧縮する。177         ZipCompressor zc = new ZipCompressor(zippath);178         zc.compress(zipfolder);179 180     }181 182 183     /**184      * 複数件ダウンロードするかどうか185      * 186      * @param filepath ダウンロードパス187      * @return 複数件フラグ188      */189     private boolean isMultiFilesName(String filepath) {190 191         boolean isMultiFiles = false;192         isMultiFiles = !StringUtils.isEmpty(filepath) && filepath.matches("^.+\\*$");193         return isMultiFiles;194     }195 196 197     /**198      * ログファイル存在チェック199      * 200      * @param filepath ダウンロードパス201      * @param isMultiFilesName 複数件フラグ202      * @return チェック結果203      */204     private boolean isTargetExists(String filepath, boolean isMultiFilesName) {205 206         boolean isTargetExists = false;207         if (isMultiFilesName) {208             int lastIndex = filepath.lastIndexOf(FILE_SEPARATOR);209             String fileName = filepath.substring(lastIndex + 1, filepath.length() - 1);210             File folder = new File(filepath.substring(0, lastIndex));211             if (folder.exists()) {212                 for (File file : folder.listFiles()) {213                     if (file.getName().startsWith(fileName)) {214                         isTargetExists = true;215                         break;216                     }217                 }218             }219         } else {220             File file = new File(filepath);221             isTargetExists = file.exists();222         }223         return isTargetExists;224     }225 226 227     /**228      * ファイルをコピーする229      * 230      * @param fromFile コピー元231      * @param toFile コピー先232      * @throws IOException 例外233      */234     private void copyFile(File fromFile, File toFile) throws IOException {235 236         FileInputStream fis = new FileInputStream(fromFile);237         FileOutputStream fos = new FileOutputStream(toFile);238         try {239             int byteRead = 0;240             byte[] buffer = new byte[1024];241             while ((byteRead = fis.read(buffer)) != -1) {242                 fos.write(buffer, 0, byteRead);243             }244         } finally {245             fis.close();246             fos.flush();247             fos.close();248         }249     }250 251     /**252      * CSVファイルをZIPに圧縮する用クラス253      * 254      * @author zang_yuling255      *256      */257     private static class ZipCompressor {258 259         private File zipFile;260 261 262         /**263          * コンストラクタ264          * 265          * @param pathName zipファイアのファイアパス266          */267         public ZipCompressor(String pathName) {268 269             zipFile = new File(pathName);270         }271 272 273         /**274          * ファイアを圧縮する275          * 276          * @param file 圧縮されたファイア名277          */278         public void compress(File file) {279 280             FileSet fileSet = new FileSet();281             Project prj = new Project();282             Zip zip = new Zip();283             zip.setProject(prj);284             zip.setDestFile(zipFile);285             fileSet.setProject(prj);286             fileSet.setDir(file);287             zip.addFileset(fileSet);288             zip.execute();289         }290 291     }292 293 }

 

WebSphere中对response.sendError()的处理与Tomcat不同