Struts 1.2.1新特点简介(1)
目前Struts得到了广泛的应用,有人称它为Java Web框架默认的事实标准,自2003年6月apache推出Struts 1.1版本以来,apache对Struts修改和升级工作,其中Struts 1.2.1版本是这一年修改和升级工作的直接结果。Struts 1.2.1版本改正了Struts 1.1版本中存在的错误和不足,同时,增强、改进以及增加了许多新的功能,这些特点,值得广大Struts学习、开发者的关注。建议有条件的开发人员,可升级到Struts 1.2.1版本来开发,这样能充分利用Struts的新功能。有关Struts 1.2.1版本的介绍,可到Struts官方网站http://struts.apache.org/userGuide/release-notes-1.2.1.html查看,还可以到http://cvs.apache.org/dist/struts/v1.2.1/下载。JavaWebStudio开发工具的Visual Struts最新版本也完全支持Struts 1.2.1版本的开发(http://javawebstudio.51.net/)。
1、不再提供GenericDataSource和GenericConnection接口
从http://struts.apache.org/userGuide/release-notes-1.2.1.html看,GenericDataSource和GenericConnection接口都已不再提供,从下载的jakarta-struts-1.2.1也看出,已去掉了Struts1.1中的struts-legacy.jar,即整个legacy都去掉了。但struts.jar中还是保留了DataSourceConfig类。还保留了datasources管理功能。
GenericDataSource并不是非常必要的好用,其中因为之一是这个datasource需要用ActionServlet中定义的方法从Action类访问数据源,不能从其它类中用它。
在Struts实现自定义数据库连接池的方法很多,其中JavaWebStudio(详情可参考《Struts开发实例》)提供的自定义数据库连接池,通过web.xml配置引入是一种方法,另外,也可采用Struts1.2.1建议的通过Plug Ins Configuration (插件配置)的方法实现,例如struts自带例子struts-config.xml中的配置:
<plug-in className="org.apache.struts.webapp.example.memory.MemoryDatabasePlugIn">
<set-property property="pathname" value="/WEB-INF/database.xml"/>
</plug-in>
另外,Jakarta的DBCP也是一个选择。
2、增加的数据验证组件(Validator enhancements)
· ValidWhen:Struts的 Validator支持 ValidWhen 规则,可实现一个数据的验证依赖于另一个数据的验证;
· IntRange:可验证单选select-one标签和radio标签功能. Example: This allows populating combo boxes with valid choices plus one additional choice with a caption something like "Choose one" and a value 0f "-1". Then when the user attempts to submit the form, you can look for the value of "-1" and advise if nothing was selected.
· 可强制客户端Javascript validation去较验所有的约束,代替在第一次出错造成的中断。
· "required" 数据的验证处理checkboxes, radio,select-one, 和 select-multiple标签.
· 标准的validateUrl规则可检查URL的有效性.
Designing Complex Validations with validwhen
一个常用的数据验证设计是验证一个数据域依赖于另一个数据域的情况(例如,如果你要用户输入两次密码,如果这两个密码相同才能通过),还有就是只有当某一个数据域依赖于有效时其它的一个数据域才有效. validwhen 数据验证规则提供上述情况的实现方法.
例如:
(1)
<field property="emailAddress" depends="validwhen">
<arg0 key="userinfo.emailAddress.label"/>
<var>
<var-name>test</var-name>
<var-value>((sendNewsletter == null) or (*this* != null))</var-value>
</var>
</field>
(2)
<field property="quantity" indexedListProperty="orderLines" depends="validwhen">
<arg0 key="orderform.quantity.label"/>
<var>
<var-name>test</var-name>
<var-value>((orderLines[].partNumber == null) or (*this* != null))</var-value>
</var>
</field>
(3)
<field property="nbaPointGuard" depends="validwhen">
<arg0 key="careers.nbaPointGuard.label"/>
<var>
<var-name>test</var-name>
<var-value>((heightInInches >= 60) or (*this* == null))</var-value>
</var>
</field>
Unstoppable JavaScript Validations
可强制客户端Javascript validation去较验所有的约束,代替在第一次出错造成的中断。通过设置一个新的属性stopOnFirstError在Validator PlugIn实现来完成第一次出错设置. 例如struts-config.xml设置片段:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validation.xml,/WEB-INF/validator-rules.xml"/>
<set-property property="stopOnFirstError" value="false"/>
</plug-in>
3、通配符
在action-mappings配置中,可采用通配符的配置方式,例如Struts自带的例子中的struts-config-registration.xml文件中有:
<!-- Generic edit* mapping -->
<action
path="/edit*"
type="org.apache.struts.webapp.example.Edit{1}Action"
name="{1}Form"
scope="request"
validate="false">
<forward
name="failure"
path="/mainMenu.jsp"/>
<forward
name="success"
path="/{1}.jsp"/>
</action>
“/edit*”代表了所有以“edit”开头的路径,{1}代表了“*”在实际表单提交中的内容(字符串)。
通配符模式可包含一个或多个如下的专门符号:
*
不含斜线 ('/') 字符.
**
含斜线 ('/') 字符.
\character
反斜线字符用于分隔顺序. \* 匹配 ('*'), and \\匹配('\').
在action mapping 和 action forwards中, 通配符{N}的序号取值N 可取从 1 到 9 . 所有的请求 URI 可采用通配符{0}.
目前action mapping支持通配符的属性有:
· type
· name
· roles
· parameter
· attribute
· forward
· include
· input
action mapping将要支持通配符的属性有:
· path
4、Maven 项目文件
在Struts项目本身的开阶段就已用到了Maven的管理. 核心JAR 和 TLDs可利用Maven编译生成. 在Struts 源代码概目录中我们可看到当前的 maven.xml and project.xml 文件. 当然,在当前,原来的Ant编译文件还是官方编译Struts的方法.
值得关注的是,Maven将为我们的项目开发带来很大的方便,详细情况可参考http://maven.apache.org/start/use.html。
5、新的 Configuration DTD
Configuration 1.1 DTD 已不推荐使用, struts-config_1_2.dtd 成为首选,struts-config_1_2.dtd为struts-config新增了两个元素<display-name> 和 <description>.可用于描述项目(或配置)的版本号等信息。例如:
<display-name><![CDATA[
account maintenance
]]>
</display-name>
<description><![CDATA[
Allows the updating of users accounts and subscriptions.
]]>
</description>
6、Session-scoped ActionMessages
可在session中保存ActionMessages及在第一次使用后进行清除。通过 Action.saveMessages() 保存信息到 session中.可通过 ActionMessages.isAccessed() 返回已保存的信息. 如果要清除信息,RequestProcessor.processCachedMessages() 通过 isAccessed()进行检查.
这一功能对于信息的重复使用是非常有效的。
7、JA Mailreader
Struts 自带的例子Mailreader Example包含了日本资源文件,虽然我们不需要日本资源,但它对于我们学习如何实现“国际化信息”是非常有好处的,实现方式很简单,例如自带的例子welcome.jsp有如下语言类型选择:
<ul>
<li><html:link action="/Locale?language=en">English</html:link></li>
<li><html:link action="/Locale?language=ja" useLocalEncoding="true">Japanese</html:link></li>
<li><html:link action="/Locale?language=ru" useLocalEncoding="true">Russian</html:link></li>
</ul>
在LocaleAction.java中进行处理:
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
String language = request.getParameter(LANGUAGE);
String country = request.getParameter(COUNTRY);
Locale locale = getLocale(request);
if ((!isBlank(language)) && (!isBlank(country))) {
locale = new Locale(language, country);
}
else if (!isBlank(language)) {
locale = new Locale(language, "");
}
HttpSession session = request.getSession();
session.setAttribute(Globals.LOCALE_KEY, locale);
String target = request.getParameter(PAGE);
if (!isBlank(target)) return new ActionForward(target);
target = request.getParameter(FORWARD);
if (isBlank(target)) target = mapping.getParameter();
if (isBlank(target)) {
log.warn(LOCALE_LOG);
return null;
}
return mapping.findForward(target);
}
.
8、Tiles EL
Tiles标签支持基于JSTL 的Struts EL标签库.
9、truts-mailreader
对struts 自带例子struts-mailreade进行改进。特别是增加了Welcome页。
在index.jsp中,只有两行代码,主要是实现到"/Welcome"的转发功能。
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<logic:redirect action="/Welcome"/>
从struts-config.xml可看出"/Welcome"的Action处事文件是WelcomeAction.java文件:
<action path="/Welcome"
type="org.apache.struts.webapp.example.WelcomeAction">
<forward name="failure" path="/Error.jsp" />
<forward name="success" path="/welcome.jsp" />
</action>
WelcomeAction.java文件的execute()函数如下:
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// Setup message array in case there are errors
ArrayList messages = new ArrayList();
// Confirm message resources loaded
MessageResources resources = getResources(request);
if (resources==null) {
messages.add(Constants.ERROR_MESSAGES_NOT_LOADED);
}
// Confirm database loaded
UserDatabase userDatabase = getUserDatabase(request);
if (userDatabase==null) {
messages.add(Constants.ERROR_DATABASE_NOT_LOADED);
}
// If there were errors, forward to our failure page
if (messages.size()>0) {
request.setAttribute(Constants.ERROR_KEY,messages);
return findFailure(mapping);
}
// Forward to our success page
return findSuccess(mapping);
}
其中核心代码是:
UserDatabase userDatabase = getUserDatabase(request);
if (userDatabase==null) {
messages.add(Constants.ERROR_DATABASE_NOT_LOADED);
}
用户检查用户数据是否已存在。
10、Action 包
Action Package是修改最多的部分,其中大的修改有25处,