0:
先要搭建环境:到Apache下载Struts 2.0包 。将Struts 2.0 lib下的jar文件填加到工程的构建路径下面(build path:/WEB-INF/lib)
1:
Struts 2.0有两个配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。
struts.xml用于应用程序相关的配置
struts.properties用于Struts 2.0的运行时(Runtime)的配置.
2:
struts-default.xml文件不用您自己加,它位于struts2-core-2.0.0.jar包中。
Struts 2默认会读取classpath下的struts-default.xml,struts-plugin.xml,struts.xml这三个文件。
3:
默认情况下,当请求HelloWorld.action发生时,Struts运行时(Runtime)根据struts.xml里的Action映射集(Mapping),实例化tutoiral.HelloWorld类,并调用其execute方法。当然,我们可以通过以下两种方法改变这种默认调用。这个功能(Feature)有点类似Struts 1.x中的LookupDispathAction。
在classes/sturts.xml中新建Action,并指明其调用的方法,eg: method=" xxx";
在新建的Action类中书写 xxx() 的方法;
访问Action时,在Action名后加上“!xxx”(xxx为方法名)。
4:
这就是Struts 2.0的一个优势,因为它默认支持EL,所以我们可以用getText方法来简洁地取得国际化字符串。
如: <s:textfield name="name" label="%{getText('UserName')}"/>
5:国际化字符串也可以参数化,这时国际化字符串 相当与一个变量,如:
在Struts 2.0中,我们通过以下两种方法做到这点:
1>:在资源文件的国际化字符串中使用OGNL,格式为${表达式},例如:
validation.require=${getText(fileName)} is required
2>:使用java.text.MessageFormat中的字符串格式,格式为{ 参数序号(从0开始), 格式类形(number | date | time | choice), 格式样式},例如:
validation.between=Date must between {0, date, short} and {1, date, short}
在显示这些国际化字符时,同样有两种方法设置参数的值,这样就可以动态显示了:
1>:使用标志的value0、value1...valueN的属性,如:
<s:text name="validation.required" value0="User Name"/>
2>:使用param子元素,这些param将按先后顺序,代入到国际化字符串的参数中,例如:
<s:text name="validation.required">
<s:param value="User Name"/>
</s:text>
6:LangSelector.jsp 的部分代码:
<%@taglib prefix="s" uri="/struts-tags"%>
<script type="text/javascript">
<!--
function langSelecter_onChanged() {
document.langForm.submit();
}
//-->
</script>
<s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/>
<s:bean id="locales" name="tutorial.Locales"/>
<form action="<s:url includeParams="get" encode="true"/>" name="langForm"
style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;">
Language: <s:select label="Language"
list="#locales.locales" listKey="value" listValue="key"
value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"
name="request_locale" id="langSelecter"
οnchange="langSelecter_onChanged()" theme="simple"/>
</form>
上述代码的原理为,LangSelector.jsp先实例化一个Locales对象,并把对象的Map类型的属性locales赋予下拉列表(select) 。如此一来,下拉列表就获得可用语言的列表。大家看到LangSelector有<s:form>标志和一段Javascript脚本,它们的作用就是在用户在下拉列表中选择了后,提交包含“reqeust_locale”变量的表单到Action。在打开页面时,为了下拉列表可以选中当前区域,我们需要到session取得当前区域(键为“WW_TRANS_I18N_LOCALE”的属性),而该属性在没有设置语言前是为空的,所以通过值栈中locale属性来取得当前区域(用户浏览器所设置的语言)。
7:
在AddProducts.jsp的<s:textfield>中,name为“%{'products['+#stat.index+'].name'}”,%{exp}格式表示使用OGNL表达式,上述表达式的相当于<%= "products[" + stat.index + "].name" %>.
8:
<result >/login/login.jsp</result> // 缺省name,标示Action返回 "success" 字符串时转入/login/login.jsp
<result name="cancel">/login/cancel.jsp</result> // 标示Action返回“cancel”字符串时转入/login/login.jsp
<result name="xxx" type="redirect-action" >Welcome</result> // 标示 Action返回“xxx”字符串时重定向到 Welcome 的Action中。
<result name="expired" type="chain" >XXX</result> // 标示 Action返回“expired”字符串时转入 XXX 的 Action 链。