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_yuling
255      *
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 }

 

posted on 2014-08-22 13:54  扭头撞到墙  阅读(2043)  评论(0编辑  收藏  举报