1、业务控制器
业务控制器组件指用户实现的action类的实例。业务控制器组件不会对用户的请求进行任何实际处理,而是调用业务模型组件处理。这也是为什么称action为控制器的原因。
2、多视图支持
struts2返回逻辑视图名时,逻辑视图未与任何的视图技术关联,只是返回一个字符串。如果需要在struts2中使用其他视图,可以在struts.xml中的<action>的<result>中指定type属性即可。如果没有指定,模式的是jsp视图。
3、struts2标签库
如果web应用使用的servlet2.3规范,web应用不会自动加载struts2框架的标签文件,需要在web.xml中指定。
如果web应用使用的是servlet2.4规范,不需要指定,web应用会自动加载。
4、Action
4.1、Action方位Servlet API
struts2提供了一个ActionContext类,通过此类Action可以访问Servlet API。
4.2、默认Action处理类
在struts.xml中,如果action没有指定class属性,因为该action所在的package直接或者间接地继承了struts-defalut包,所以默认的action处理类就是ActionSupport。可以通过<default-action-ref>改变默认的处理类。
4.3动态方法调用
在Action中,可以包含多个业务处理逻辑,不同的请求调用同一个Action的不同的方法。此时可以通过动态方法调用来处理这种请求。
动态方法调用指表单元素的action并不直接等于某个Action的名字,而是以如下形式来指定form的action属性:
action=”action!methodName.action”
例如:
document.forms[0].action=”login!register.action”,意思是将该表单提交给login Action的register方法处理。
对于动态调用的方法,与execute方法只是方法名不同,返回值和参数与execute方法应该绝对相同。
4.4 为action元素指定method方法
可以将一个Action处理类映射成多个逻辑Action。
例如:
<action name=”login” class=”com.cc.action.LoginAction” method=”login”>
<action name=”regist class=”com.cc.action.LoginAction” method=”regist”>
虽然都是调用LoginAction处理类,但是指定不同的method,映射成多个逻辑action。
4.5 使用通配符
使用通配符是另外一种形式的动态方法调用。。
在配置<action>元素时,需要指定name,class和method属性。其中name使用通配符,class和method属性使用表达式。
例如:
<action name=”*Action” class=”com.cc.action.LoginAction” method=”{1}”>
上面的配置定义了一系列逻辑action。只要用户的请求是*Action.action的形式,都可以通过该处理类处理。如果用户的请求是loginAction.action,那么通过该Action的login方法来处理。
另外一个例子:
<action name=”*Action” class=”com.cc.action.{1}ControlAction”>
上面的配置也定义了一系列逻辑action。因为没有指定method属性,所以总是默认使用execute方法来处理。
凡是请求符合*Action.action的形式,都匹配到不同的Action处理类中处理。例如用户的请求时RegistAction.action,则将请求发送到RegistControlAction类中处理。
如果需要,struts2允许同时在class和method属性中使用表达式,例如:
<action name=”*_*" class=”com.cc.action.{1}Action method=”{2}>
如果用户请求为Book_save.action,那么{1}表达式的值为Book,{2}表达式的值为save。
表达式不但可以使用在<action>元素的class 和method属性中,还可以使用在<action>的子元素<result>元素中
除非用户请求的URL与Action的name属性完全相同,否则如果在struts.xml中,有多个通配符都可以匹配客户的请求,是按照定义的先后顺序来决定由哪个Action来处理客户请求。
4.6配置默认action
struts2框架允许定义一个默认action,当用户的请求的URL在框架中找不到一个对应的action时,系统将使用默认的action。
配置默认action通过<default-action-ref>元素来完成。
例如:
<default-action-ref name=”simpleViewResultAction”/>
<action name=”simpleViewResultAction” class=”com.cc.action.SimpleViewResultAction”>
</action>
5、处理结果视图
5.1 struts2内建支持的结果类型
chain:Action链式处理的结果类型。
chart:整合JFreeChart的结果类型
dispatcher:用户JSP整合的结果类型
freemarker:
httpheader:
jasper:
jsf:
redirect:用于直接跳转到其他URL的结果类型
redirectAction:用于直接跳转到其他Action的结果类型。
stream:
tiles:
velocity:
xslt:用于与XML/XSLT整合的结果类型。
plainText:用于显示某个页面原始代码的结果类型。
5.2 redirect结果类型
redirect结果类型与dispatcher结果类型相对,dispatcher表示将请求转发”Forward“到指定的jsp资源。而redirect表示将请求重定向"redirect”到指定的视图资源。转发与重定向的区别是重定向会丢失所有的请求参数、请求属性,也包括action的处理结果。
6、struts2的异常处理
struts2提供了一种声明式异常处理机制。声明式异常处理可以让开发者不需要在action方法中通过try..catch方法捕捉异常,而是在struts.xml中进行定义。
在struts.xml中,声明式异常是通过<exception-mapping>元素来完成的,该元素有两个属性,一个是exception,一个是result。
根据<exception-mapping>元素出现的位置不同,可分为局部异常映射和全局异常映射。