異常のあるサーブレットを例として、トレース情報の見方について説明します。
■例:応答がなくなるFreezeServlet
1: import javax.servlet.http.*;
2: import javax.servlet.*;
3: import java.io.*;
4: public class FreezeServlet extends HttpServlet
5: {
6: public void service (HttpServletRequest request, HttpServletResponse response)
7: throws ServletException, IOException {
8: try {
9: response.setContentType("text/html; charset=iso-2022-jp");
10: PrintWriter out = response.getWriter();
11: FreezeClass fc=new FreezeClass();
12: String outString = fc.getString();
13: String tmpStr = request.getParameter("SampleParameter");
14: out.println(outString+tmpStr);
15: } catch (Exception e) {}
16: }
17: }このサーブレットを実行して採取したトレース情報が以下であるときの説明をします。日時、スレッド名、および16進出力は省略しています。
1: in, FreezeServlet, service,
PARAM:(RequestFacade):org.apache.catalina.connector.RequestFacade@1526e3:
(ResponseFacade):org.apache.catalina.connector.ResponseFacade@ac2d3c
2: in, org.apache.catalina.connector.ResponseFacade, setContentType,
PARAM:(String):text/html; charset=iso-2022-jp
3: in, org.apache.catalina.connector.ResponseFacade, isCommitted, PARAM:
4: out, org.apache.catalina.connector.ResponseFacade, isCommitted,
RET:(boolean):false
5: out, org.apache.catalina.connector.ResponseFacade, setContentType, RET:void
6: in, org.apache.catalina.connector.ResponseFacade, getWriter, PARAM:
7: in, org.apache.catalina.connector.ResponseFacade, isFinished, PARAM:
8: out, org.apache.catalina.connector.ResponseFacade, isFinished,
RET:(boolean):false
9: out, org.apache.catalina.connector.ResponseFacade, getWriter,
RET:(CoyoteWriter):org.apache.catalina.connector.CoyoteWriter@19f9c7a
(以降、出力なし)この情報より、以下のことがわかります。
FreezeServlet.javaの9行目、10行目で呼び出しているHttpServletResponseのメソッドは、メソッド呼び出し時、メソッドからの復帰時にそれぞれのトレース情報が出力されていることから、呼び出された後、復帰していることがわかります。
トレース対象である13行目のHttpServletRequestのgetParameterメソッドのトレース情報が出力されていないことより、この行が実行されていないことがわかります。
1、2より、FreezeServlet.javaの11行目、12行目のどちらかの処理が復帰していない、ということがわかります。
FreezeServletが正常に動作する場合には、上記のトレース情報に続いて以下の情報が出力されます。
10: in, org.apache.catalina.connector.RequestFacade, getParameter,
PARAM:(String):SampleParameter
11: out, org.apache.catalina.connector.RequestFacade, getParameter, RET:(String):[]
・・・(略)・・・
12: out, FreezeServlet, service, RET:void■例:出力が文字化けするCodeMissServlet
1: import javax.servlet.http.*;
2: import javax.servlet.*;
3: import java.io.*;
4: public class CodeMissServlet extends HttpServlet
5: {
6: public void service (HttpServletRequest request, HttpServletResponse response)
7: throws ServletException, IOException {
8: response.setContentType("text/html; charset=iso-2022-jp");
9: PrintWriter out = response.getWriter();
10: out.println("<HTML><HEAD><TITLE>CodeMissServlet</TITLE></HEAD><BODY><H1>");
11: String str=request.getParameter("param");
12: out.println("data = "+ str );
13: out.println("</H1><BR></BODY></HTML>");
14: }
15: }下記のHTMLから“富士通太郎”と入力します。
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=shift_jis">
<TITLE>CodeMissServlet</TITLE>
</HEAD>
<BODY>
<FORM method="post" action="CodeMissServlet">
<INPUT name="param" size="30">
<INPUT type="submit" value="Submit">
<INPUT type="reset" value="Reset">
</FORM>
</BODY>
</HTML>Webブラウザへの出力
data = ?x?m?????Y
採取したトレース情報が以下であるときの説明をします。日時、スレッド名、および16進出力は省略しています。
1: in, CodeMissServlet, service,
PARAM:(RequestFacade):org.apache.catalina.connector.RequestFacade@d41f3:
(ResponseFacade):org.apache.catalina.connector.ResponseFacade@64dd79
2: in, org.apache.catalina.connector.ResponseFacade, setContentType,
PARAM:(String):text/html; charset=iso-2022-jp
3: in, org.apache.catalina.connector.ResponseFacade, isCommitted, PARAM:
4: out, org.apache.catalina.connector.ResponseFacade, isCommitted,
RET:(boolean):false
5: out, org.apache.catalina.connector.ResponseFacade, setContentType, RET:void
・・・(略)・・・
6: in, org.apache.catalina.connector.RequestFacade, getParameter,
PARAM:(String):param
・・・(略)・・・
7: out, org.apache.catalina.connector.RequestFacade, getParameter,
RET:(String):?x?m?????Y
8: in, org.apache.catalina.connector.CoyoteWriter, println,
PARAM:(String):data = ?x?m?????Y
・・・(略)・・・
9: out, org.apache.catalina.connector.CoyoteWriter, println, RET:void
・・・(略)・・・
10: out, CodeMissServlet, service, RET:voidこのとき、引数および戻り値の情報の出力が有効になっていた場合、トレース情報の7行目、8行目において、引数および戻り値はそれぞれ次のように出力されます。
なお、getParameterメソッドの戻り値は、Webブラウザから受け取ったデータを%デコードして戻り値としています。HEXvalue=[0095 0078 008e 006d・・・]は、Shift JISの富(0x9578)、士(0x8e6d)、通(0x92ca)を表しています。
7 :(略) RET:(String):?x?m?????Y HEX=0095 0078 008e 006d 0092 00ca 0091 00be 0098 0059
8 :(略) PARAM:(String):data = ?x?m?????Y HEX=0064 0061 0074 0061 0020 003d 0020 0095
0078 008e 006d 0092 00ca 0091 00be 0098 0059 この値より、サーブレットのソースの12行目(トレース情報の8行目)においてPrintWriterオブジェクトのprintlnメソッドに引数として渡した文字列がUNICODEではなく、Shift JISであることがわかります。この例の場合、サーブレットで受け取ったコード系をUNICODEで処理したいため、たとえば、次のようにします。
Interstage管理コンソールで、該当するWebアプリケーションの[環境設定]タブ > [エンコーディング]に入力文字コードを指定します。
この例の場合には、HTMLで指定されている“shift_jis”を指定します。
この方法では、サーブレットのソースの11行目(トレース情報の7行目)で取得した文字列はUNICODEに変換されています。
サーブレットで文字コード変換をします。
サーブレットのソースの11行目と12行目の間に以下の処理を加えます。
str=new String(str.getBytes("8859_1"), "shift_jis");上記の処理を行うことによって、サーブレットのソースの12行目に正しくUNICODEの文字列が渡され、トレース情報の8行目の引数の値は以下のようになります。
PARAM:(String):data = 富士通太郎 HEX=0064 0061 0074 0061 0020 003d 0020 5bcc 58eb 901a 592a 90ce