hao1nan 发表于 2015-8-8 10:33:51

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;
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;
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 }
  
页: [1]
查看完整版本: WebSphere中对response.sendError()的处理与Tomcat不同