Struts2框架是MVC设计思想的实现,Action就是业务控制器,能够调用业务逻辑模块进行业务处理,Action的处理结果是经过在配置文件中设定result属性来实现的。这是一种典型的松耦合方式,Action没必要关心result对应的视图是什么,只是返回一个字符串便可。浏览器
1、 处理结果流程框架
Struts2框架拦截用户请求后,会匹配相关的Action来处理,Action执行处理完毕后,将返回一个标准的字符串,该字符串在配置文件中对应了一个视图资源名称。Struts2框架是经过配置文件中的result属性将Action和视图资源联系在一块儿的,这样就实现了独立模块化的设计思想。Result对应的视图资源,就是MVC模式中的视图部分(View)。jsp
2、 配置result模块化
1. 配置result的目的就是告诉Struts2框架,在执行完一个Action后,须要系统作什么。是把一个视图资源呈现给用户仍是执行另一个Action,result配置起到了一个“路标”的做用。编码
2. result按照做用范围能够分为局部result和全局result。spa
局部result: 包含在Action定义中,result属性是一个Action的子元素。起做用范围只能在本Action中。插件
全局result: 使用<global-results…/>来定义,其做用范围是全部的Action均可以使用。设计
下面是result的示例:xml
<package name="ch03 " extends="sturts-default " namespace=" /ch03" >ci
<!—定义全局返回类型 -->
<global-results>
<result name="global-result">/welcome.jsp</result>
</global-results>
<action name="Regist" class="ch03.Regist">
<!—定义局部返回类型 -->
<result name="success" type="dispatcher">/ch03/success.jsp</result>
<result name="input">/ch03/regist.jsp</result>
</action>
</package>
3、 result的类型
Struts2框架支持多种视图技术,例如JSP、FreeMarker等。当一个Action执行完用户请求后,会返回一个标准的字符串,这个字符串就是逻辑视图名称,该逻辑视图名称并无与任何视图技术联系在一块儿。视图技术或者说使用的result类型,是在配置文件中指定的,即指定result元素的type属性来实现。
Struts2框架默认支持的result类型以下:
chain:Action链式处理的result类型。
chart:用于整合JfreeChart的result类型。
dispatcher:用于整合JSP的result类型。
freemarker:用于整合FreeMarker的result类型。
httpheader:用于处理特殊HTTP行为的result类型。
jasper:用于整合JasperReport的result类型。
jsf: 用于整合JSF类型。
redirect:用于重定向的result类型。
redirect-action:用于重定向到其余Action的result类型。
stream:用于向浏览器返回一个Inputstream。
tites:用于整合Tiles的result类型。
velocity:用于整合Velocity的result类型。
xslt:用于整合XML/XSLT的result类型。
plaintext:用于显示页面的原始代码的result类型。
说明:以上是Struts2框架的内建的result类型,都在struts-default.xml中定义的,系统会自动加载该result类型。另一种result类型是采用插件的方式来支持的。
Action-chain类型示例:
<package name="ch03 " extends="sturts-default " >
<!—定义user, result指向Regist Action -->
<action name="user" class="…">
<result type="chain" >Regist</result>
</action>
<action name="Regist" class="…">
<!—连接到另一个命名空间-->
<result type="chain">
<param name="namespace">/secure</param>
<param name="actionName">check</param>
</result>
</action>
</package>
<!—定义包secure,命名空间为secure -->
<package name="secure " extends="sturts-default " namespace="/secure" >
<action name="check" class="…">
<result>/secure/check.jsp</result>
</action>
</package>
4、 动态配置result
前面介绍的result配置都是以硬编码的方式保存在struts.xml文件中,实际上,Struts2框架提供了动态配置result的功能。动态配置result是指在struts.xml配置文件中,配置Action中的result时,可使用表达式或通配符来定位视图资源,经过这种方式,来动态实现返回不一样的视图资源。
1. 使用通配符动态配置result
在struts.xml的Action配置中,通配符不单单可使用在method配置上,class和result均可以使用通配符。 以下示例:
<package name="ch02" extends="sturts-default " >
<!—通配符配置result -->
<action name="Login_*" class="ch02.Login_{1}">
<result name="success" >/ch02/{1}.jsp</result>
</action>
</package>
如上代码中使用了通配符,配置了一个名为Login_*的Action,这个Action能够处
理全部匹配Login_*.action的用户请求。例如,用户产生一个URL请求
Login_Bank.action,Struts2框架会先在struts.xml文件中查找是否有名字为
Login_Bank的配置,若是找不到,则匹配Login_*的Action配置,
框架会将ch02.Login_{1}中的{1}匹配为Bank,即对应ch02.Login_Bank的
Action实现类。一样在result配置中,也会匹配为/ch02/Bank.jsp的实际视图资
源。
2. 使用OGNL动态配置result
通常状况下,若是访问Action实例中的属性,可使用${属性名}表达式,实际上,一个OGNL的完整表达式应该是${属性名.属性名.属性名}。下面的实例演示使用OGNL动态配置result。
<package name="ch02" extends="sturts-default " >
<!—使用OGNL表达式配置result-->
<action name="Login_Bank" class="ch02.Login_Bank">
<result name="success" >/ch02/${bankname}.jsp</result>
</action>
</package>
注意: ${bankname}是指Action中的bankname的属性值,Action实例赋予
bankname不一样的值,就会指向不一样的视图资源。