首页 > 代码库 > 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不同