Struts2的体系与Struts1体系的差别非常的大,因为Struts2使用了WebWork的设计核心,而不是使用Struts1的设计核心.Struts2大量使用拦截器来处理用户请求,从而允许用户的业务逻辑器与ServletAPI分离.
1. Struts2的框架结构.
从数据流上面来看,Struts2与WebWork相差不大,Struts2同样使用拦截器作为处理(Advice),以用户的业务逻辑控制器为目标,创建一个控制器代理.
控制器代理负责处理用户的请求,处理用户请求时回调业务控制器的execute方法该方法的返回值决定了Struts2将怎样的试图资源呈现给用户.
Struts2框架的大致处理流程如下:
① 浏览器发送请求,比如说请求/mypage.action,/reports/myreport.pdf等等.
② 核心控制器FilterDispatcher根据请求决定调用何时的Action
③ WebWork的拦截器链自动对请求应用通用功能,比如说workflow,validation或者文件上传等功能
④ 回调Action的execute方法,该execute方法先获取用户请求参数,然后执行某种数据库操作,既可以是将数据库保存到数据库,也可以是从数据库中检索信息,实际上,因为Action只是一个控制器,它会调用业务逻辑组件来处理用户的请求.
⑤ Action的execute方法处理结果信息将被输出到浏览器当中,可以是HTML页面,图像,也可以使PDF文档或者其他的文本.此时支持的试图技术非常多,可以是JSP,也支持Velocity,FreeMaker等技术.
2. Struts2的配置文件
当Struts2创建系统的Action代理时,需要使用到Struts2的配置文件.
Struts2的配置文件有两份:
① 配置Action的Struts.xml文件
② 配置Struts2全局属性的struts.properties文件
Struts.xml文件内定义了Struts2的系列Action,定义Action的时候,应该指定Action的实现类,并且定义该Action处理结果与视图资源之间的映射关系.下面是Struts.xml的示例:
<struts>
<!—Struts2的Action都必须配置在package里 -->
<package name=”defalut” extend=”struts-default”>
<!-- 定义一个logon的Action,实现类为lee.Logon -->
<action name=”logon” class=”lee.Logon”>
<!—配置Action返回input的时候转入logon.jsp页面 -->
<result name=”input”>/page/logon.jsp</result>
<!-- 配置Action返回cancel的时候转会welcom的Action -->
<result name=”cancel” type=”redirect-action”>Welcom</result>
<!-- 配置Action返回seccess的时候重定向到MainMenu的Action -->
<result type=”redirect-action”>MainMenu</result>
<!—配置Action返回expried的时候,进入ChangPassword的Acton链-->
<result name=”expried” type=”chain”>ChangePassword</result>
</action>
<action name=”logoff” class=”lee.Logoff”>
<!—配置Action返回success的时候重定向到Welcom的Action -->
<result type=”redirect-action”>Welcome</result>
</action>
</package>
</struts>
在上面的struts.xml文件中,定义了两个Action,定义Action的时候,不仅定义了Action的实现类,而且得定义Action的处理结果时,指定了多个result,result元素指定execute方法返回值和视图资源之间的映射关系.
除了上面的配置文件之外,Struts2还有一个配置Struts2全局属性的Properties文件,Struts.propeties.该文件的示例如下:
//指定Struts2的开发状态
struts.devMode-false
//指定当Struts2配置文件之后,Web框架是否应该重新加载Struts配置文件
struts.configuration.xml.reload=true
正如上面看到的,struts.propertis文件的形式是系列的key,value对,它指定了Struts2应用的全局属性.
3. Struts的标签库
Struts2的标签库也是Struts2的重要组成部分,Struts2的标签库提供了非常丰富的功能,这些标签库不仅提供了表现层数据处理,而且提供了基本的流程控制功能,还提供了国际化,Ajax技术支持等功能.
通过使用Struts2的标签,开发者可以最大限度的减少页面代码的书写.
看下面的JSP页面的表单定义片段.
<!—定义一个form -->
<form method=”post” action=”basicvalid.action”>
<!—下面定义表单域 -->
名字:<input type=”text” name=”name”/><br>
年级:<input type=”text” name=”age”/><br>
喜欢的颜色:<input type=”text” name=”favorite”/><br>
<input type=”submit” value=”提交”/>
</form>
上面的页面使用了传统的HTML标签定义表单元素,还不具备校验信息的功能,但是如果换成了如下使用Struts2标签的定义方式:
<!—使用Struts2的标签来定义一个表单 -->
<s:form method=”post” action=”basicvalid.action”>
<!—下面定义表单域 -->
<s:textfield label=”名字” name=”name”/>
<s:textfield label=”年级” name=”age”/>
<s:textfield label=”喜欢的颜色” name=”favorite”?>
<s:submit/>
</form>
Struts2的标签库的功能非常的复杂,该标签库几乎可以完全的替代JSTL标签库,而且Struts的标签支持表达式语言,这种表达式语言支持一个强大和灵活的表达式语言OGNL,因此功能十分的强大.
Struts2框架解析
6467

被折叠的 条评论
为什么被折叠?



