`
Goro
  • 浏览: 174020 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

TERASOLUNA学习笔记

阅读更多
下面的项目可能要用到TERASOLUNA。
为了逼自己每天都能学习点东西,特此写这个博客记录学习结果。
虽然可能性很大,但还是希望不要半途而废。
PS:Spring没学过。

【Transaction管理功能】
下例为对于以execute开头的方法,进行Transaction管理。
<!-- 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的QueryDAOiBatisImpl提供了以下的方法。
executeForObject (String sqlID, Object bindParams, Class clazz)
executeForObjectArray(String sqlID, Object bindParams, Class clazz)
executeForObjectArray(String sqlID, Object bindParams, Class clazz, int
beginIndex, int maxCount)

executeForObjectList(String sqlID, Object bindParams)
executeForObjectList(String sqlID, Object bindParams, int beginIndex, int
maxCount)

【Util类】
Terasoluna提供以下Util类
ClassUtil:通过指定的Class名和参数生成object。
DateUtil:日期,时间和日历相关的共同方法。 例如:日本的暦元号相关的方法。
PropertyUtil:操作Property文件的类。
StringUtil:操作String的类。
例如:
1)取文件名的扩展名 (为什么这个不是FileUtil的内容。。。)
2)byte数组 转换成16进制的String
3)日文全半角转换
4)html的escape  < & > ¥"  → &lt; &amp; &gt; &quot;
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的定义。
……
<bean id="sampleAuthenticationController"
class="jp.sample.SampleAuthenticationController"/>
……


AuthenticationController的例子
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>

threshold:同时有几个request由于同步在等待时,中断。 设为-1时,不发生中断。
interruptResponseCode:上面提到的中断时的responsecode。
例如例子里就是同时有2个request在等待时(同时有3个request被提交),向客户端返回503错误。


【增强版Form】
FormEx
DynaValidatorActionFormEx
ValidatorActionFormEx

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个业务迁移到另1个业务时,之前业务的_form将被删除。

例:
假设有_sampleForm 和 _helloForm
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时, _helloForm将被删除。

指定了clearForm为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的值恢复到初始值,
Terasoluna提供了ResetterImpl。
(这里也看得不是很懂。)

【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。
硬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>


code的使用
jsp时
<%@ taglib prefix="t" uri="/WEB-INF/terasoluna.tld"%>
<html><head><body>
<html:form action="/codeList">
<t:defineCodeList id="sampleCodeList"/>
<html:select property="codeListId">
<html:options collection="sampleCodeList" property="id"
labelProperty="name"/>
</html:select>
数据:<t:writeCodeCount id="sampleCodeLIst" />个
</html:form></body></html>

业务处理时使用
Bean的定义
<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,好像是实现ReloadableCodeListLoader接口。
不是太懂。。。需要时再调查吧。嘿嘿。

【例外处理】
Terasoluna提供了
SystemExceptionHandler和DefaultExceptionHandler
并可以指定log的输出等级。
当然,可以在struts-config的global-exceptions里定义例外handler。
也可以在action-mappings里定义,各个action自己的例外handler。
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例
SystemExceptionHandler的时候,用的PageContext.EXCEPTION
<%@ taglib uri="/terasoluna-struts" prefix="ts"%>
(略)
<%
java.lang.Exception sysExp =
(java.lang.Exception) request.getAttribute(PageContext.EXCEPTION);
%>
<ts:errors/>
<%=sysExp.getMessage()%>
(略)


DefaultExceptionHandler的时候,用的Globals.EXCEPTION_KEY
<%@ taglib uri="/terasoluna-struts" prefix="ts"%>
(略)
<%
java.lang.Exception exp =
(java.lang.Exception) request.getAttribute(Globals.EXCEPTION_KEY);
%>
<ts:errors/>
<%=exp.getMessage()%>
(略)


【Session临时目录】
HttpSession session = (HttpSession) request.getSession();
boolean result = FileUtil.makeSessionDirectory(session.getId());


【文件上传和下载】
文件上传好像和普通的Struts一点点都没区别,略。
看看文件下载。
Bean的定义
<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是继承了AbstractDownloadObject的类。
但是关于继承AbstractDownloadObject应该注意什么,怎么写教程里被略了。
要好好做的话,可以看一下Terasoluna的源代码。

其他,教程里倒是关于文件下载多浏览器对应(Encode文件名),写了不少。
实现DownloadFileNameEncoder,然后在服务器启动时,
jp.terasoluna.fw.web.struts.actions.FileDownloadUtil#setEncoder。
(但我发现FileDownloadUtil#setEncoder不是静态的,一定要用Bean定义来设。)
实现例:Firefox时用,利用Jakarta的commons-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;
}
}
}


【DispatchAction】
有两种Dispatch方法。
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定义
<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等来选择Dispatch。
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定义
<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>


分享到:
评论

相关推荐

    TERASOLUNA Framework For Java Development Guideline.pdf

    TERASOLUNA Framework For Java Development Guideline TERASOLUNA Framework 是日本 NTT 开源的 Java 开发框架,特别详细,基于 Spring 5.x。该框架提供了丰富的开发指南,涵盖了 Java 后端开发的各个方面。 首先...

    terasoluna-batch-3.6.1机能Guideline全

    《Terasoluna Batch 3.6.1 功能指南详解》 Terasoluna Batch 是一个高效、可扩展的批量处理框架,专为Java开发人员设计,用于处理大规模数据和执行复杂的业务流程。在Terasoluna Batch 3.6.1版本中,其功能...

    TERASOLUNA Batch Framework for Java 機能説明書1

    【TERASOLUNA Batch Framework for Java 功能说明书1】 TERASOLUNA Batch Framework for Java 是由NTT DATA Corporation开发的一个批量处理框架,适用于Java环境。该框架为构建批处理系统提供了执行基础和通用功能...

    TERASOLUNA Batch Framework for Java Version 3.x 説明資料1

    1. **易于学习和使用**:即使是不熟悉批处理的开发者,也能迅速掌握如何使用该框架进行开发。 2. **组件化设计**:将批处理所需的各个功能模块化,如同步和异步作业执行、事务管理、数据库访问、文件处理和异常处理...

    Terasoluna勉強資料

    ### Terasoluna框架知识点详解 #### 一、框架简介 **Terasoluna**是日本NTT Data公司开发的一款开源应用框架,主要用于构建大型企业级应用系统。它基于Java技术栈,尤其针对高可用性、高并发性的需求场景进行了...

    TERASOLUNA_Server_Framework_for_Java.zip_terasoluna_tersoluna

    《TERASOLUNA Server Framework for Java》是针对Java开发者的一款服务器框架,主要与Terasoluna项目相关,尤其强调了其与Spring框架的集成。Terasoluna是一个开源项目,旨在提供高效、灵活的Java应用程序开发解决...

    最新TERASOLUNAServerFrameworkForJavaDevelopmentGuideline

    ### 最新TERASOLUNA Server Framework for Java Development Guideline #### 1. 概述与背景 TERASOLUNA Server Framework for Java (5.x) Development Guideline 是由 NTT DATA Corporation 发布的一份详细文档,...

    standard-crud-sample:使用 TERASOLUNA Server Framework 5.x 的标准 CRUD 示例应用程序

    标准样品 使用 TERASOLUNA Server Framework 5.x (5.0.0.RELEASE) 的标准 CRUD 示例应用程序 框架和库 班级 图书馆 版本 DI容器 弹簧框架 4.1.4. 发布 MVC框架 SpringMVC ... 笔记: 请将 lombok 安装到 IE

    TERASOLUNAServerFrameworkForJavaDevelopmentGuideline.pdf

    TERASOLUNA Server Framework for Java是NTT DATA公司开发的一个Java EE应用程序框架,主要用于企业级应用的开发。其最新的文档版本为5.3.1.RELEASE,涵盖了软件架构概要、SpringMVC架构和应用开发等方面的详细指南...

    TERASOLUNABatch-DevelopmentGuideline-5.0.0.pdf

    - **目的**:该指南旨在为开发人员提供有关如何使用 Terasoluna Batch Framework for Java(5.x)进行高效、可靠的批处理应用开发的方法论指导。 - **対象読者**:主要针对参与批处理应用程序设计与开发的技术人员,...

    spring-framework-5.0.0.RELEASE官方完整包加官方文档

    官方文档包含详细的API参考、用户指南和教程,是学习和理解Spring Framework 5.0.0.RELEASE的关键资源。通过阅读这些文档,开发者可以了解如何配置Spring,使用其各种模块,以及如何利用新特性来优化应用。对于初次...

    Struts框架讲解

    Struts框架是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它旨在简化开发过程,提供一种规范化的开发结构。MVC模式是软件设计中的一个重要概念,它将应用程序分为三个核心组件:模型、...

    Spring版アーキテクチャ説明書(Webブラウザ対応版)

    TERASOLUNA Server Framework for Java (Spring版)基于Spring 1.2和Struts 1.2进行了扩展,并针对Web浏览器应用进行了特别设计。以下是对文档中提及的主要功能的深入解析: ### 1. 认证与访问控制功能 TERASOLUNA...

    soap-sample:使用 Spring Framework 的 JAX-WS(SOAP) 示例应用程序

    此示例应用程序使用 TERASOLUNA Server Framework for Java (5.x)。 Spring 框架 4.1.4.RELEASE Bean验证(Hibernate Validator 5.1.3.Final) 等等 ... 笔记: 在这个应用程序中,依赖 lombok 自动生成 ...

Global site tag (gtag.js) - Google Analytics