Interstage Application Server J2EE ユーザーズガイド
目次 索引 前ページ次ページ

第2部 Servlet/JSP編> 第12章 Servletサービスの運用> 12.3 トレース情報> 12.3.4 トレース情報の見方

12.3.4.3 異常のあるサーブレットの例

 異常のあるサーブレットを例として、トレース情報の見方について説明します。

■例:応答がなくなる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:  }

 このサーブレットを実行して採取したトレース情報が以下であるときの説明をします。(日時およびスレッド名は省略しています。)

/Freeze/servlet/FreezeServlet:in FreezeServlet.service
/Freeze/servlet/FreezeServlet:in HttpServletResponse.setContentType(String)
/Freeze/servlet/FreezeServlet:out HttpServletResponse.setContentType(String)
/Freeze/servlet/FreezeServlet:in HttpServletResponse.getWriter()
/Freeze/servlet/FreezeServlet:out HttpServletResponse.getWriter()

(以降、出力なし)

 この情報より、以下のことがわかります。

  1. FreezeServlet.javaの9行目、10行目で呼び出しているHttpServletResponseのメソッドは、メソッド呼び出し時、メソッドからの復帰時にそれぞれのトレース情報が出力されていることから、呼び出された後、復帰していることがわかります。
  2. トレース対象である13行目のHttpServletRequestのgetParameterメソッドのトレース情報が出力されていないことより、この行が実行されていないことがわかります。
  3. 1、2より、FreezeServlet.javaの11行目、12行目のどちらかの処理が復帰していない、ということがわかります。

 FreezeServletが正常に動作する場合には、上記のトレース情報に続いて以下の情報が出力されます。

/Freeze/servlet/FreezeServlet:in HttpServletRequest.getParameter(String)
/Freeze/servlet/FreezeServlet:out HttpServletRequest.getParameter(String)
/Freeze/servlet/FreezeServlet:in PrintWriter.println(String)
/Freeze/servlet/FreezeServlet:out PrintWriter.println(string)
/Freeze/servlet/FreezeServlet:out FreezeServlet.service

■例:出力が文字化けする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="servlet/CodeMissServlet" >
<INPUT name="param" size="30">
<INPUT type="submit" value="Submit">
<INPUT type="reset" value="Reset">
</FORM>
</BODY>
</HTML>

 WWWブラウザへの出力

data = ?x?m?????Y

 採取したトレース情報が以下であるときの説明をします。(日時およびスレッド名は省略しています。)

1:  /codemiss/servlet/CodeMissServlet:in CodeMissServlet.service
2:  /codemiss/servlet/CodeMissServlet:in HttpServletResponse.setContentType(String)
3:  /codemiss/servlet/CodeMissServlet:out HttpServletResponse.setContentType(String)
4:  /codemiss/servlet/CodeMissServlet:in HttpServletResponse.getWriter()
5:  /codemiss/servlet/CodeMissServlet:out HttpServletResponse.getWriter()
6:  /codemiss/servlet/CodeMissServlet:in PrintWriter.println(String)
7:  /codemiss/servlet/CodeMissServlet:out PrintWriter.println(String)
8:  /codemiss/servlet/CodeMissServlet:in HttpServletRequest.getParameter(String)
9:  /codemiss/servlet/CodeMissServlet:out HttpServletRequest.getParameter(String)
10:  /codemiss/servlet/CodeMissServlet:in PrintWriter.println(String)
11:  /codemiss/servlet/CodeMissServlet:out PrintWriter.println(String)
12:  /codemiss/servlet/CodeMissServlet:in PrintWriter.println(String)
13:  /codemiss/servlet/CodeMissServlet:out PrintWriter.println(String)
14:  /codemiss/servlet/CodeMissServlet:out CodeMissServlet.service

 このとき、引数および戻り値の情報の出力が有効になっていた場合、トレース情報の9行目、10行目において、引数および戻り値はそれぞれ次のように出力されます。(valueに表示される文字は環境により異なります。)
 なお、getParameterメソッドの戻り値は、WWWブラウザからの受け取ったデータを%デコードして戻り値としています。HEXvalue=[0095 0078 008e 006d・・・]はこの場合、Shift JISの富(0x9578)、士(0x8e6d)、通(0x92ca)を表しています。

9:(略) RET :(String):length=10:value="?x?m?????Y" HEXvalue=[0095 0078 008e 006d 0092 00ca 0091 00be 0098 0059 ]10:(略) PARAM:(String):length=17:value="data = ?x?m?????Y" HEXvalue=[0064 0061 0074 0061 0020 003d 0020 0095 0078 008e 006d 0092 00ca 0091 00be 0098 0059 ]

 この値より、サーブレットのソースの12行目(トレース情報の10行目)においてPrintWriterオブジェクトのprintlnメソッドに引数として渡した文字列がUNICODEではなく、Shift JISであることがわかります。
 この例の場合、サーブレットで受け取ったコード系をUNICODEで処理したいため、たとえば、次のようにします。

str=new String(str.getBytes("8859_1"), "shift_jis");


 上記の処理を行うことにより、サーブレットのソースの12行目に正しくUNICODEの文字列が渡されるようになり、トレース情報の10行目の引数の値は以下のようになります。

PARAM:(String):length=12:value="data = 富士通太郎" HEXvalue=[0064 0061 0074 0061 0020 003d 0020 5bcc 58eb 901a 592a 90ce ]


目次 索引 前ページ次ページ

All Rights Reserved, Copyright (C) 富士通株式会社 2006