struts 2安装包的下载地址:http://struts.apache.org/download.cgi#Struts206
0:struts 2可以看做是 WebWork2.3 的版本。
struts 2应用默认需要Java 5运行环境,需要支持ServletAPI2.4和JSPAPI2.0的web容器。笔者建议读者使用Java 5运行环境,使用
Tomcat5.5或更高版本。
1:WebWork采用了一种松耦合的设计,让系统的action不再与servlet API 耦合,使得 action 单元测试更加方便。允许系统从b/s结构向c/s转换。WebWork支持更多的表现层技术,如velocity、FreeMaker等。
不同于struts 1 使用ActionServlet作为核心控制器,WebWork 使用 FilterDispatcher 作为核心控制器,处理HTTP响应和请求。
2:OGNL对集合和索引属性的支持非常强大。
3:struts 2 大量使用拦截器来处理用户请求,从而允许用户的业务逻辑控制器与 Servlet API分离。
4:struts 1 Action是单例模式,并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。
struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
struts 2直接使用Action属性来封装用户请求的属性,避免了开发者需要大量开发ActionForm类的繁琐。当然,这些属性还可以 是包含了子属性的Rich对象类型。
struts 2 不仅整合了JSTL,还整合了OGNL,使得 struts 2的表达式语言功能更加强大。
struts 2使用OGNL进行类型转换,支持基本的数据类型和常用对象之间的转换。
struts 2和 struts 1 一样支持在ActionForm中重写validate方法来进行手动校验,也支持整合校验框架进行校验。
5: struts 2以Spring的IoC容器作为默认的OBject工厂,而不再支持内建的IoC容器。
6: ActionContext.getContext().getSession.put("user",getUsername());
在传入页面上就可以输出该Session的属性值了:
<body> 欢迎你,${sessionScope.user} ! </body>
7:不应该在我们的控制器中实例化一个业务逻辑组件。比较好的方法是利用工厂模式管理逻辑组件,或是使用依赖注入将组件的实例注入控制器组件中。
8:当某个Action设置了某个(些)属性值后,Struts 2 会将它们封装在一个叫“struts.valueStack”的请求属性中的,该属性保存在 requset 范围中。
valueStack vs = (ValueStack)request.getAttribute("struts.valueStack");
上面的代码返回一个ValueStack 对象(Struts 2 的一个内置对象),它封装了所有的属性输出信息,这些信息可以方便地使用OGNL表达式获取。
也可是使用下面的方法获取:(其实实质上 就是这样获取的)
<% String username = (String)vs.findValue("username"); %>
9:资源文件的文件名命名格式为:
basename_语言代码_国家代码.properties,例如:messageResource_zh_CN.properties .
注意:对于包含非西欧字符(如:中文)的资源文件,一定要使用 nativ2ascii 命令来转换这些文件,如执行:
native2ASCII messageResource.properties messageResource_zh_CN.properties (其中messageResource.properties中含有中文)。
10:可以在 struts.properties 中定义Web应用的全局资源文件。
Struts2 默认会去加载WEB-INF/classes/ 下面的所有资源文件。如:
struts.custom.il8n.resources=lee.messageResource
上述代码标示 WEB-INF/classes/lee/messageResource.property 是该应用的主资源文件。
11:Struts2提供了如下的两种方式来输出国际化信息:
<s:text name="messageKey"/> ,使用s:text 标签输出。
<s:property value=" %{getText("messageKey")} ">,使用表达式输出。
12:
<tabel border="1" >
<caption><s:text name="bookPageTitle"/></caption>
<s:iterator value="books" status="index">
<s:if test=" #index.odd==true ">
<tr style="background-color:#cccccc">
</s:if>
<s:else >
<tr>
</s:else>
<td><s:text name="bookName"></td>
<td><s:property /></td>
</tr>
</s:iterator>
</table>
13: ActionSupport类是一个工具类,它实现了Action接口,还实现了Validateable接口,提供了数据校验功能。通过继承该ActionSupport类,可以简化struts 2的Action的开发。
在继承了 ActionSupport类的Action类中重写 validate()方法,该方法会在执行系统的execute()方法之前执行。如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后可以通过OGNL表达式输出它们。此时请求会自动被转发到input逻辑视图处。为此需要配置改Action的input属性:<result name="input">/../xxx.jsp</result>
addFieldError("username","username is required!"); // 添加表单校验错误。
上面的代码之处要是登录页面的username输入为空就提交,这相应转发到input指定的页面,并在username表单域边上输出 username is required!>。这是因为<s:form>标签已经具备了输出校验错误的能力。
或是:addFieldError("username",getText("username is required") ); // 添加表单校验错误,使用ActionSupport类的getText()方法来根据资源文件获取国际化提示信息,实现了校验输出信息的国际化。
14:struts 2还允许通过定义校验配置文件来完成数据校验,及使用校验框架。校验配置文件是通过使用struts 2已有的校验器(s),完成(非)表单的校验工作。即在该文件中配置校验规则即可。
校验配置文件的命名应该遵循一下规则:
ActionName-validation.xml ,其中ActionName就是需要校验的Action类名。
该文件需要放在该类的class文件同级目录下。