[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00445] Re: <jsp:setProperty>, <jsp:getProperty> はスレッドセーフでしょうか。



自己レスです。

どうも、「スレッドセーフ」について勘違いをしていました。
「スレッドセーフ」かどうかを考える対象は、「操作(メソッド)」ではなく
変数ですよね。

従って、そもそもの問いが検討違いでした。

今回は、session スコープに属するビーンのインスタンスはスレッドセーフ
ではないということで、特に問題はありませんでした。

以上です。宜しくお願い致します。

Yukie Oshima wrote:

>こんにちわ。大島です。
>現在、Java 認定試験の Web コンポーネントデベロッパを勉強しております。
>
>JSP について勉強しているのですが、<jsp:setProperty> アクションと
><jsp:getProperty> アクションは、JSP から作成されたサーブレットの
>コードを見る限りスレッドセーフではないと思ってしまったのですが、
>そんなはずはないですよね。。。以下、jsp のコードと、それより生成
>されたサーブレットのコードと、どうしてスレッドセーフではないと
>思ったのかの理由を示します。
>
>私の考えはどこか間違っていると思うのですが、ご意見を宜しくお願い
>いたします。
>
>■ test2.jsp
><%@ page language="java" %>
><jsp:useBean id="sakana" class="testapp9.SakanaBean" scope="session" />
><jsp:setProperty name="sakana" property="*" />
>
><!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
><html>
><head>
><title>Lomboz JSP</title>
></head>
><body bgcolor="#FFFFFF">
>
><p><jsp:getProperty name="sakana" property="name" /></p>
><p><jsp:getProperty name="sakana" property="sanchi" /></p>
>
></body>
></html>
>
>■test2_jsp.java
>package org.apache.jsp;
>
>import javax.servlet.*;
>import javax.servlet.http.*;
>import javax.servlet.jsp.*;
>
>public final class test2_jsp extends org.apache.jasper.runtime.HttpJspBase
>implements org.apache.jasper.runtime.JspSourceDependent {
>
>private static java.util.Vector _jspx_dependants;
>
>public java.util.List getDependants() {
>return _jspx_dependants;
>}
>
>public void _jspService(HttpServletRequest request, HttpServletResponse
>response)
>throws java.io.IOException, ServletException {
>
>JspFactory _jspxFactory = null;
>PageContext pageContext = null;
>HttpSession session = null;
>ServletContext application = null;
>ServletConfig config = null;
>JspWriter out = null;
>Object page = this;
>JspWriter _jspx_out = null;
>PageContext _jspx_page_context = null;
>
>
>try {
>_jspxFactory = JspFactory.getDefaultFactory();
>response.setContentType("text/html");
>pageContext = _jspxFactory.getPageContext(this, request, response,
>null, true, 8192, true);
>_jspx_page_context = pageContext;
>application = pageContext.getServletContext();
>config = pageContext.getServletConfig();
>session = pageContext.getSession();
>out = pageContext.getOut();
>_jspx_out = out;
>
>out.write('\n');
>testapp9.SakanaBean sakana = null;
>synchronized (session) {
>sakana = (testapp9.SakanaBean) _jspx_page_context.getAttribute("sakana",
>PageContext.SESSION_SCOPE);
>if (sakana == null){
>sakana = new testapp9.SakanaBean();
>_jspx_page_context.setAttribute("sakana", sakana,
>PageContext.SESSION_SCOPE);
>}
>}
>out.write('\n');
>org.apache.jasper.runtime.JspRuntimeLibrary.introspect(_jspx_page_context.findAttribute("sakana"),
>request);
>out.write("\n");
>out.write("\n");
>out.write("<!DOCTYPE HTML PUBLIC \"-//w3c//dtd html 4.0
>transitional//en\">\n");
>out.write("<html>\n");
>out.write("<head>\n");
>out.write("<title>Lomboz JSP</title>\n");
>out.write("</head>\n");
>out.write("<body bgcolor=\"#FFFFFF\">\n");
>out.write("\n");
>out.write("<p>");
>out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((testapp9.SakanaBean)_jspx_page_context.findAttribute("sakana")).getName())));
>out.write("</p>\n");
>out.write("<p>");
>out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((testapp9.SakanaBean)_jspx_page_context.findAttribute("sakana")).getSanchi())));
>out.write("</p>\n");
>out.write("\n");
>out.write("</body>\n");
>out.write("</html>");
>} catch (Throwable t) {
>if (!(t instanceof SkipPageException)){
>out = _jspx_out;
>if (out != null && out.getBufferSize() != 0)
>out.clearBuffer();
>if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
>}
>} finally {
>if (_jspxFactory != null)
>_jspxFactory.releasePageContext(_jspx_page_context);
>}
>}
>}
>
>■<jsp:setProperty> と <jsp:getProperty> が スレッドセーフでないと
>思った理由
>
>上記の test2_jsp.java を見ると、ビーンのインスタンスである sakana を取得
>するコードは session 関して同期がとられているが、<jsp:setProperty> が変
>換されたコード(おそらく、
>org.apache.jasper.runtime.JspRuntimeLibrary.introspect
>(_jspx_page_context.findAttribute("sakana"), request);)と、<jsp:
>getProperty> のコードは 同期がとられていないから。
>
>以上です。宜しくお願い致します。
>
>  
>
>> 
>>
>>    
>>
>
>
>
>  
>