NLD

HttpServletRequest#setAttributeの重複

setAttributeはどのようにしてServletからJSPへ値を渡しているのか。
その疑問に対して答えは得られなかったが、挙動を調べることはできる。
ここでは、同じ名前(Stringオブジェクト)で指定した複数回のsetAttributeメソッドを実行してみた。

実行環境は以下の通り。
Windows NT Workstation 4.0
java version "1.2.2"
JavaTM Servlet API 2.2
WebLogic Server 5.1
Internet Explorer 5


--- サンプルソース Sat.java ---
import java.io.*;
import javax.servlet.http.*;
public class Sat extends HttpServlet
{

public void service
    ( HttpServletRequest request, HttpServletResponse response )
        throws ServletException, IOException
{
  try
  {
    request.setAttribute( "ERRORCODE", new Integer( 123 ) );
    request.setAttribute( "ERRORCODE", new Integer( 987 ) );
    response.setContentType( "text/html" );
    ServletContext gsc = getServletContext();
    RequestDispatcher rd = gsc.getRequestDispatcher( "/jsp/Satjsp.jsp" );
    rd.forward( request, response );
  }  //  try block ends...

  catch( Exception e ) { }

}  //  service method ends...

}  //  class block ends...


--- サンプルソース Satjsp.jsp ---
<%@ page contentType="text/html; charset=Shift_JIS" %>
<HTML><BODY>
<%
Integer checkInt = (Integer)request.getAttribute("ERRORCODE");
out.println( checkInt.intValue() );
%>
</BODY></HTML>


実行結果
987


結果は、このように後で指定したsetAttributeの値が出力されている。

setAttributeの引数は、
public void setAttribute(java.lang.String name, java.lang.Object o)
のようになっているが、これはHashMapクラスのputメソッドと似ている。
public Object put(Object key, Object value)
HashMapクラスでは、同じキーを指定してputメソッドを使用した場合、後から実行した値が前の値を上書きする。
これと同様のことがHttpServletRequest#setAttributeでも考えられるようだ。

Servlet API の Javadoc を、よくよく見れば
public void removeAttribute(java.lang.String name) なんてものがあるではないか。これは
Removes an attribute from this request. This method is not generally needed as attributes only persist as long as the request is being handled.
などと説明がある。どうやらattributeを削除するものらしい。
このことからも、やはりsetAttributeは、HashMap#putのような働きをすると考えてよさそうだ。


2000.11.29 実行環境にIE5を追加。
2000.11.28 produceD bY NI-Lab.


NLD