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の規約