Seasar2
単にDIコンテナではなく、フルスタックのWebアプリケーションフレームワークに進化した。
Seasar2 = SAStruts + S2Container + S2JDBC + α
※古いのは、S2Struts、S2Daoも存在
主な特徴:
設定ファイルの記述量が少ない
HOT deploy機能を備えている
★web.xml
<servlet>
<servlet-name>s2servlet</servlet-name>
<servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>
<init-param>
<param-name>configPath</param-name>
<param-value>app.dicon</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>s2servlet</servlet-name>
<url-pattern>/s2servlet</url-pattern>
</servlet-mapping>
request、session、applicationでインスタンス管理をしたい場合
<filter>
<filter-name>s2filter</filter-name>
<filter-class>org.seasar.framework.container.filter.S2ContainerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>s2filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
★注意点
S2Containerが管理するコンポーネントのライフサイクルはデフォルトでSingletonとなるため、
状態を保持するフィールド変数を定義しないこと(スレッドセーフではない)
public class SampleService {
private HashMap<String, String> map = new HashMap<String, String>(); ×
...
}
※Actionは対象外、Serviceは対象
★S2CSVサンプル
@Resource
protected S2CSVCtrlFactory csvCtrlFactory;
private <TDto, TCsv> void writeCsvFile(
String fileName,
List<TDto> dtos,
Class<TCsv> cls,
String charset
) throws FileNotFoundException, UnsupportedEncodingException {
try (PrintWriter writer = new PrintWriter(fileName, charset);
S2CSVWriteCtrl<TCsv> csvWriter
= csvCtrlFactory.getWriteController(cls, writer)) {
csvWriter.setValidateFlag(false);
for (TDto dto : dtos) {
TCsv csv = Beans.createAndCopy(cls, dto).execute();
csvWriter.write(csv);
}
}
}
@CSVEntity(header=true)
public class XXXCsv() {
@CSVColumn(columnIndex=0, quote=true, columnName="名称")
public String name;
@CSVColumn(columnIndex=1, quote=true, columnName="部署")
public String department;
}
★推奨パッケージ構成
convention.dicon
<component class="org.seasar.framework.convention.impl.NamingConventionImpl">
<initMethod name="addRootPackageName">
<arg>"example.web"</arg>
<arg>false</arg>
</initMethod>
</component>
※falseを指定することで、 example.webはHOT deploy非対象になる
creator.dicon
<components>
<include path="convention.dicon"/>
<include path="customizer.dicon"/>
<component
class="org.seasar.framework.container.creator.ActionCreator"/>
<component
class="org.seasar.struts.creator.FormCreator"/>
<component
class="org.seasar.framework.container.creator.ServiceCreator"/>
<component
class="org.seasar.framework.container.creator.LogicCreator"/>
<component
class="org.seasar.framework.container.creator.DaoCreator"/>
<component
class="org.seasar.framework.container.creator.DtoCreator"/>
<component
class="org.seasar.framework.container.creator.DxoCreator"/>
<component
class="org.seasar.framework.container.creator.PageCreator"/>
<component
class="org.seasar.framework.container.creator.HelperCreator"/>
<component
class="org.seasar.framework.container.creator.InterceptorCreator"/>
<component
class="org.seasar.framework.container.creator.ValidatorCreator"/>
<component
class="org.seasar.framework.container.creator.ConverterCreator"/>
<component
class="org.seasar.s2csv.creator.CsvCreator"/>
<!-- Singleton設定 -->
<component class="xxx"/>
<property name="instanceDef">
@org.seasar.framework.container.deployer.InstanceDefFactory@SINGLETON
</property>
</component>
</components>
※青字:SMART deployの規約