テラスマン学習ノート

18619 ワード

次のプロジェクトはTERS OUNAを使うかもしれません.
毎日何か勉強できるようにするために、このブログで勉強結果を記録します.
可能性は大きいですが、途中でやめないでほしいです.
PS:Springは習ったことがありません.
【Transation管理機能】
次の例は、executeで始まる方法について、Transation管理を行う.

<!-- DataSourceの  。 -->
<bean id="dataSource" class="……">……</bean>

<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<!--   のJDBCデータソース けのトランザクションマネージャ。 -->
<tx:advice id="transactionInterceptor" transaction-manager="transactionManager">
  <tx:attributes>
    <tx:method name="execute*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
  </tx:attributes>
</tx:advice>

<!-- AOPの   -->
<aop:config>
<aop:pointcut id="blogicBeans" expression="bean(*BLogic)"/>
<aop:pointcut id="serviceBeans" expression="bean(*Service)"/>
<aop:advisor
pointcut-ref="blogicBeans"
advice-ref="transactionInterceptor"/>
<aop:advisor
pointcut-ref="serviceBeans"
advice-ref="transactionInterceptor"/>
</aop:config>
上記の例は例外が発生した場合、rollbackを行います.
例外を捨てたくない時もありますが、rollbackだけを考えたらこのように書いてもいいです.

if(     ){
//   rollback
TransactionUtil.setRollbackOnly();
}
【データベース操作】
SQLの定義などはiBATISと同じ構成です.
TerasolunaのQuery DAOiBatis Implは、以下の方法を提供しています.
executeForObject(String sql ID,Object bindParams,Class clazz)
executeForObject Aray(String sql ID、Object bindParaams、Class clazz)
executeForObject Aray(String sql ID,Object bindParaams,Class clazz,int
beging Index,int maxCount)
executeForObject List(String sql ID、Object bindParaams)
executeForObject List(String sql ID,Object bindParaams,int beging Index,int
maxCount)
【Util類】
Terasounaは以下のUtilクラスを提供します.
Class Util:指定されたクラス名とパラメータでobjectを生成します.
DateUtil:日付、時間とカレンダーに関する共通の方法.例えば、日本の暦の元号に関する方法です.
ProptyUtil:Proptyファイルを操作するクラス.
StringUtil:Stringのクラスを操作します.
たとえば:
1)ファイル名の拡張子を取る(なぜこれはFileUtilの内容ではないですか?)
2)byte配列を16進数のStringに変換する.
3)日本語の全半角変換
4)のescape  < & > ¥「  →<&>
5)encodeを指定して、Stringのbyte長さを取得する
【Message管理と国際化】
省略する
【ログイン状態チェック】
やっと実用的な機能ができたようです.
web.xmlの配置

<web-app>
<filter>
……
<filter-name>authenticationControlFilter</filter-name>
<filter-class>
jp.terasoluna.fw.web.thin.AuthenticationControlFilter
</filter-class>
<init-param>
<param-name>controller</param-name>
<param-value>
sampleAuthenticationController
</param-value>
</init-param>
</filter>
……
<filter-mapping>
<filter-name>authenticationControlFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
……
<error-page>
<exception-type>
jp.terasoluna.fw.web.thin.UnauthenticatedException
</exception-type>
<location>/authenticatedError.jsp</location>
</error-page>
……
ビーンの定義

……
<bean id="sampleAuthenticationController"
class="jp.sample.SampleAuthenticationController"/>
……
Authentication Controllerの例

package jp.terasoluna.sample;
import javax.servlet.ServletRequest;
import jp.terasoluna.fw.web.thin.AuthenticationController;
public class SampleAuthenticationController
implements AuthenticationController {
// ログオン みチェックが  ないパス
private String noCheckRequiredPath = “/sample/index.jsp”;
// アクセス  がある  はtrueを し、ない  はfalseを す
public boolean isAuthenticated(String pathInfo,
ServletRequest req) {
// セッションを  
HttpSession session = ((HttpServletRequest) req).getSession();
// セッションからUserValueObjectを  
SampleUserValueObject uvo = (SampleUserValueObject)
session.getAttribute(UserValueObject.USER_VALUE_OBJECT_KEY);
//  はログオンした  のみセッションにUserValueObjectを  するという  なので
// UserValueObjectがセッションにあった  はログオン みとする
if (uvo != null) {
return true;
}
return false;
}
// ログオン みチェックが  ならtrue、  ないならfalseを す
public boolean isCheckRequired(ServletRequest req) {
if (noCheckRequiredPath.equals(RequestUtil.getPathInfo(req))) {
return false;
}
return true;
}
}
【いくつかの拡張子ファイルの直接アクセスを禁止する】
web.xml

<filter>
<filter-name>extensionFilter</filter-name>
<filter-class>
jp.terasoluna.fw.web.thin.ExtensionFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>extensionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
system.properties

#  
access.control.prohibited.extension.1=.jsp
access.control.prohibited.extension.2=.htm
access.control.prohibited.extension.3=.html
access.control.prohibited.extension.4=.css

#   (   )
restrictionEscape.1=/index.jsp
restrictionEscape.2=/common.css
【Session同期機能】
機能は説明して、同一のSessionは同時に一つのrequestを処理することしかできません.
同時に発生した業務ミスを処理することを防止する.
欠点は、性能低下の原因になります.
web.xml

<filter>
<filter-name>sessionLockControlFilter</filter-name>
<filter-class>
jp.terasoluna.fw.web.thin.SessionLockControlFilter
</filter-class>
<init-param>
<param-name>interruptResponseCode</param-name>
<param-value>503</param-value>
</init-param>
<init-param>
<param-name>threshold</param-name>
<param-value>2</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>sessionLockControlFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
……
<error-page>
<error-code>503</error-code>
<location>/error.jsp</location>
</error-page>
また、いくつかのrequestが同期して待機中に中断されています.-1に設定すると、中断は発生しません.
interrupt ResonseCode:上記の中断時のレスポンスecode.
例えば、2つのrequestが同時に待っている間に(同時に3つのrequestが提出されている)、クライアントに503エラーを返します.
【拡張版Form】
FormEx
DynaValidation Action FormEx
Validation Action FormEx

DynaValidatorActionFormEx formEx = (FormEx) form;
String[] stringArray = new String[] {
"a", "b", "c"
};
formEx.set("hoge", stringArray); 
formEx.get("hoge", 5); //       ,   null
formEx.set("hoge", 3, "c");  //       ,   4 item,  "c"
ひを帯びる「のform名
formの前に指定したら、「ウ」「次のような特別な効果があります.
各業務の定義が異なる_formの後、1つの業務から別の業務に移る場合、前の業務の_formは削除されます.
例:
もしあると仮定します.
struts-config.xml

<action-mappings
type=” jp.terasoluna.fw.web.struts.action.ActionMappingEx”>
<action
path=”/hogeSCR”
type=” jp.terasoluna.fw.web.struts.actions.ForwardAction”
parameter="/sample/hoge.jsp"
name=”_sampleForm”
scope=”session” />
</action-mappings>
上で定義した時、また/hogeSCRに移行すると、_hello Formが削除されます.
clear Formをtrueと指定した場合

<action-mappings
type=” jp.terasoluna.fw.web.struts.action.ActionMappingEx”>
<action
path=”/hogeSCR”
type=” jp.terasoluna.fw.web.struts.actions.ForwardAction”
parameter="/sample/hoge.jsp"
name=”_sampleForm”
scope=”session” />
<set-property property="clearForm" value="true" />
</action-mappings>
すべての「_」を削除します「先頭のform
(この機能のメリットはよく分かりません(@)~)
FormのResetは、scopeをsessionのformの値を初期値に戻すため、
TerasounaはReetterImplを提供しています.
(ここもよく分かりません.)
【CodeList】
もう一つの実用的な機能.
web.xml

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
コードを定義します
ハード・codeの書き方
beanの定義

<bean id="sampleCodeList"
class="jp.terasoluna.fw.web.codelist.MappedCodeListLoader"
init-method="load">
<property name="codeListMap">
<map>
<entry key="001">
<value>value001</value>
</entry>
<entry key="002">
<value>value002</value>
</entry>
<entry key="003">
<value>value003</value>
</entry>
</map>
</property>
</bean>
データベースから取り出した書き方.

<bean id="sampleDBCodeList"
class="jp.terasoluna.fw.web.codelist.DBCodeListLoader"
init-method="load">
<property name="dataSource"
ref="TerasolunaDataSource"/>
<property name="sql">
<value>SELECT KEY, VALUE FROM CODE_LIST ORDER BY KEY</value>
</property>
</bean>
コードの使用
jsp時
<%@taglib prefix="t"uri="/WEB-INF/terasoluna.tld">
<>
<html:form action=「/codeList」>
<t:defineCodeList id=「sampleCodeList」/>
<html:select property=「codeListId」>
<html:options collection=「sampleCodeList」property=「id」
label Property=「name」/>
<):select>
データ:
<):form>
業務処理に使う
ビーンの定義

<bean id="sampleCodeList"
class="jp.terasoluna.fw.web.codelist.MappedCodeListLoader"
……
</bean>
<bean id="sampleBusinessLogic"
class="jp.terasoluna.sample.SampleBusinessLogic">
<property name="codeListLoader" ref="sampleCodeList"/>
</bean>
業務処理のjavaコード

public class SampleBusinessLogic {
private CodeListLoader codeListLoader = null;
public void setCodeListLoader(CodeListLoader codeListLoader) {
this.codeListLoader = codeListLoader;
}
public void someBusiness() {
CodeBean[] beans = codeListLoader.getCodeBeans();
……
}
}
また、codelistを動的に更新することもできます.Reloadable CodeListLoaderインターフェースを実現するようです.
よく分かりません..必要な時に調べてみます.へへ.
【例外処理】
Terasounaは提供しました
System Exception HandlerとDefault Exception Handler
ロゴの出力レベルを指定できます.
もちろん、struts-configのglobal-exceptionsで例外handlerを定義できます.
actionn-mappingsで定義することもできます.各actionは自分の例外です.
struts-config.xml例

<struts-config>
・・・
<global-exceptions>
<exception key="errors.E001" path="/systemError.do"
className="jp.terasoluna.fw.web.struts.action.ExceptionConfigEx"
handler="jp.terasoluna.fw.web.struts.action.SystemExceptionHandler"
type="jp.terasoluna.fw.exception.SystemException" >
<set-property property="module" value="/sub" />
<set-property property="logLevel" value="fatal"/>
/>
<exception key="errors.E001" path="/systemError.do"
className="jp.terasoluna.fw.web.struts.action.ExceptionConfigEx"
handler="jp.terasoluna.fw.web.struts.action.DefaultExceptionHandler"
type="java.lang.Exception" >
<set-property property="module" value="/sub" />
<set-property property="logLevel" value="error"/>
/>
</global-exceptions>
</struts-config>
systemError.do対応のjsp例
System Exception Handlerの時に使うPageConttext.EXCEPTION

<%@ taglib uri="/terasoluna-struts" prefix="ts"%>
( )
<%
java.lang.Exception sysExp =
(java.lang.Exception) request.getAttribute(PageContext.EXCEPTION);
%>
<ts:errors/>
<%=sysExp.getMessage()%>
( )
Default Exception Handlerの時に使うGlobals.EXCEPTIONuKEY

<%@ taglib uri="/terasoluna-struts" prefix="ts"%>
( )
<%
java.lang.Exception exp =
(java.lang.Exception) request.getAttribute(Globals.EXCEPTION_KEY);
%>
<ts:errors/>
<%=exp.getMessage()%>
( )
【セッション一時ディレクトリ】

HttpSession session = (HttpSession) request.getSession();
boolean result = FileUtil.makeSessionDirectory(session.getId());
【ファイルアップロードとダウンロード】
ファイルアップロードは普通のStrutsと少しも違いがないようです.
ダウンロードを見てください.
ビーンの定義

<bean name="/downloadBLogic"
class="jp.terasoluna.fw.web.struts.actions.DownloadBLogicAction"
scope="singleton">
<property name="businessLogic" ref="downloadBLogic"/>
</bean>
<bean id="downloadBLogic"
class="jp.sample.project.blogic.DownloadBLogic" scope="singleton"/>
BLogicのコード

public class DownloadBLogic implements BLogic {
public BLogicResult execute(DownloadInput param) {
BLogicResult result = new BLogicResult();
File file = new File("filepath¥¥download.txt");
DownloadFile downloadFile = new DownloadFile(file);
result.setResultObject(downloadFile);
return result;
}
}
上記のBLogicResultはAbstract DownloadObjectを継承したクラスです.
しかし、Abstract DownloadObjectの継承については注意すべき点があります.
しっかりやるなら、Terasounaのソースコードを見てもいいです.
その他、チュートリアルでは、ファイルダウンロードに関するマルチブラウザ対応について、かなり書きました.
DownloadFileNameEncoderを実現し、サーバーが起動する時、
jp.terasoluna.fw.web.struts.actions.FileDownloadUtil咻set Encoder.
(ただし、FileDownloadUtil菗set Encererは静的ではないことを発見しました.必ずBean定義で設定します.)
実現例:Firefoxの時に使う、Jakataのcomons-codecを利用してencodeを行う

public class MyEncoder implements DownloadFileNameEncoder {
public String encode(String original, HttpServletRequest request,
HttpServletResponse response) {
String userAgent = request.getHeader("User-Agent");
// IE の  
if (StringUtils.contains(userAgent, "MSIE")) {
return encodeForIE(original);
// Firefox の  
} else if (StringUtils.contains(userAgent, "Gecko")) {
return encodeForGecko(original);
}
return encodeForIE(original);
}
protected String encodeForGecko(String original) {
try {
return new BCodec().encode(original);
} catch (EncoderException e) {
return original;
}
}
protected String encodeForIE(String original) {
try {
return URLEncoder.encode(original,
AbstractDownloadObject.DEFAULT_CHARSET);
} catch (UnsupportedEncodingException e) {
return original;
}
}
}
【Displatchアクション】
二つの方法があります.
1)複数のsubmitボタンを使用する
struts-config.xml

<struts-config>
……
<action-mappings type="jp.terasoluna.fw.web.struts.action.ActionMappingEx">
……
<action path="/fileUploadConfirmDSP" name="_fileForm">
<forward name="back" path="/initFileUploadAction.do"/>
<forward name="default" path="/fileUploadConfirmSCR.do"/>
<forward name="regist" path="/fileRegistBLogic.do"/>
</action>
<action-mappings>
……
</struts-config>
ビーン定義

<bean name="/fileUploadConfirmDSP" scope=”singleton”
class="jp.terasoluna.fw.web.struts.actions.DispatchAction">
</bean>
JSPファイル

<html:html>
……
<html:form action=”/fileUploadConfirmDSP”>
……
<html:submit property=”forward_back” value=”  る ”/>
<html:submit property=”forward_regist” value=”    ”/>
……
</html:form>
……
</html:html>
2)checkbox、radioboxなどによって、Displatchを選択します.
struts-config.xml

<struts-config>
……
<action-mappings type=" jp.terasoluna.fw.web.struts.action.ActionMappingEx">
…
<action path="/fileUploadConfirmDSP" name="_fileForm">
<forward name="back" path="/initFileUploadAction.do"/>
<forward name="default" path="/fileUploadConfirmSCR.do"/>
<forward name="regist" path="/fileRegistBLogic.do"/>
</action>
<action-mappings>
……
</struts-config>
ビーン定義

<bean name="/sample/selectDispatch" scope=”prototype”
class="jp.terasoluna.fw.web.struts.actions.DispatchAction">
<property name=”event”>
<value>dispatchName</value>
</property>
</bean>
JSP

<html:html>
……
<html:form action=”/fileUploadConfirmDSP”>
……
<html:radio property=”dispatchName” value=”forward_back”/>  る
<html:radio property=”dispatchName” value=”forward_regist”/>   
……
<html:submit property=”decide” value=”    ”>
</html:form>
……
</html:html>