Javaについてあまり詳しくなかったので、フレームワークと言語勉強をかねてStruts2 + hibernateでお勉強用Webアプリを制作していますが、なれない言語のため正直手こずっています(C/Perlの方が簡単・・)
でJavaといえば気になるのがスレッドセーフ(thread safe)。他言語でのスレッドセーフの作り方はわかるので、共用変数にステータスを持たせる等を行わなければスレッドセーフになることはわかるのですが、Struts2のサンプルプログラムを見ていて疑問に思ったことが。
import com.opensymphony.xwork2.ActionSupport;
public class indexAction extends ActionSupport {
public String execute() throws Exception {
return "success";
}
public String message;
public String hello() throws Exception {
message = “いえいえこちらこそこんにちは。”;
return "hello";
}
}
上記はatmarkitの記事で@いう間にWebアプリを作れる「Struts 2」入門から抜き出した物ですが、ActionSupportのサブクラスにインスタンス変数を持たせた上、インスタンス変数にメッセージを代入した物を、JSPにはき出すようにしています。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<s:property value=”%{message}”/>
</body>
</html>
ふと思ったのが、そういえばStruts1系だとActionサブクラスは一つだけインスタンス化されるという記事。
- http://www.itmedia.co.jp/enterprise/0310/06/epn03_4.html
- http://rutake.ddo.jp/blog/techmemo/2007/07/strutsaction.html
atmarkit記事掲載のstruts2のサンプルだと、スレッドセーフではないのでは?と思っていたら、以下の記事が。
- Struts 1.x : Actionサブクラスはsingletonだから、スレッドセーフ or synchronizedにしないとだめ。Actionサブクラスにインスタンス変数を持たせてリクエスト毎の状態やメッセージを管理してはいけないということですね。
- Struts 2.x : ActionSupportサブクラスはHTTPリクエスト毎に生成されるため、スレッドセーフ問題は発生しない。ActionSupportサブクラスにインスタンス変数を持たせて、リクエスト毎のメッセージを代入しても、問題なくスレッドセーフです
struts 1.x系と違ってstruts 2.x系のサンプルがActionSupportサブクラスにインスタンス変数を持たせた上で、それをJSPに出力する物しか見つけられなかったのでどきどきしましたが、問題なしということですね。ほっとしました。