struts2重要知识点总结(2)
来源:互联网 发布:英雄无敌 for mac 编辑:程序博客网 时间:2024/04/29 14:02
Action的配置
的配置
通过上面的示例可以看出,Action需要在struts.xml中配置才可以使用,而且Action应该配置成为元素的子元素,那么元素的功能是什么呢?
元素可以把逻辑上相关的一组Action、Result、Intercepter等元素封装起来,形成一个独立的模块,package可以继承其他的package,也可以作为父包被其他的package继承,比如前面示例中配置的“”,helloworld这个包就继承了struts-default这个包。
元素有如下属性:
name:包的名称。必须配置
extends:要继承的包,后面配置的是被继承的包的名称。可选
namespace:包的命名空间。可选
abstract:定义包为抽象的,也就是不能包含Action的定义。可选
上面的属性中name和extends在前面已经示例过了,接下来看看另外两个属性的应用。
1:namespace
namespace配置的是包的命名空间,同一个命名空间里面不能有同名的Action,当然不同的命名空间里面是可以有同名的Action的。类似于Java的包的功能,namespace可以有效的防止action重名的冲突,因为配置了namespace后,在访问action的时候就需要添加namespace来作为action的前缀。
如果不配置namespace,表示是默认的namespace,那么访问的时候不需要添加namespace前缀。比如前面HelloWorld的示例,struts.xml的配置如下:
1.
namespace=" /ch10" > <!—定义全局返回类型 --> <global-results> <result name="global-result">/welcome.jsp</result></global-results> <action name="Register" class="ch10.Register"> <!—定义局部返回类型 --><result name="success" type="dispatcher">/ch10/success.jsp</result><result name="input">/ch10/register.jsp</result></action></package>
name类型:
chain:Action链式处理的result类型,将两个连续执行的Action串联,通过前一个Action的getter方法与后一个Action的对应setter方法完成Action的传递。
chart:用于整合JfreeChart的result类型。
dispatcher:默认类型,用于整合JSP的result类型。相当于Servlet中的请求转发,返回的JSP页面并不显示其真正的URL,仍是Action的URL。
freemarker:用于整合FreeMarker的result类型。
httpheader:用于处理特殊HTTP行为的result类型。
jasper:用于整合JasperReport的result类型。
jsf: 用于整合JSF类型。
redirect:用于重定向的result类型。重定向到另一个JSP页面,并且会显示该页面的真正URL。
redirectAction/redirect-action:用于重定向到其他Action的result类型。
stream:用于向浏览器返回一个Inputstream,一般用于文件下载。
tites:用于整合Tiles的result类型。
velocity:用于整合Velocity的result类型。
xslt:用于整合XML/XSLT的result类型,用于Action执行完毕后属性信息的转换。
plaintext:用于显示页面的原始代码的result类型。
说明:以上是Struts2框架的内建的result类型,都在struts-default.xml中定义的,系统会自动加载该result类型。另外一种result类型是采用插件的方式来支持的。
type属性
dispatcher类型是Struts2框架默认的结果类型,相当于是转发。所以它具备转发的特征,比如,dispatcher的目标只能是同一个浏览器中的url不会改变,调用者和被调用者之间共享相同的内置对象(request和response对象)。其中如果有location,该location只能是页面,不能是action,如果需要是action,则可以用chain来解决此问题。
“dispatcher”的ResultType,在struts-default.xml里的配置如下:
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
通过配置可以看出,它对应的实现类是ServletDispatcherResult。
如果采用JSP作为视图的实现技术,那么这个ResultType是最常用的。在这个ResultType的实现中,调用了javax.servlet.RequestDispatcher类的forward方法,也就是说它相当于是对RequestDispatcher的一个再包装。
那么在Servlet中使用RequestDispatcher来进行页面跳转的特性,也就自然被“dispatcher”这个ResultType继承下来了。那么Servlet中的RequestDispatcher,到底有什么特性呢?
那就是通过RequestDispatcher来进行页面跳转,将会保持是同一个请求对象。这有什么好处呢?由于是同一个对象,那就意味着有同样的数据,而请求对象里面数据众多,在Servlet的request对象里面,典型有如下数据:
参数区(parameter),就是用户在页面上填写并提交的数据
Head区,由浏览器在发出请求的时候,自动加入到请求包的数据
属性区(Attribute),由开发人员存储在属性区的值,通常是通过request.setAttribute方法、request.getAttribute方法来进行访问
Cookie区,由浏览器在发出请求的时候,自动把相关的Cookie数据通过request传递到服务端
对于dispatcher的使用范围,除了可以配置jsp外,还可以配置其他的web资源,比如其他的Servlet等。
如果在web.xml中有如下配置:
1.
2. login
3. servlet.LoginServlet
4.
5.
6. login
7. /login
8.
那么在struts.xml中可以如下配置:
/login
但是请注意,如果这个web资源是另一个Action的话,不能这么配置,需要使用Struts2的另一种名称为“chain”的ResultType。
使用“dispatcher”的ResultType,不能访问其他web应用中的web资源。当然,这个特性是由javax.servlet.RequestDispatcher类的forward方法决定的。
redirect相当于是重定向,因此,不仅可以重定向同一个Web应用的其他JSP页面,还可以定向到其他外部资源。url也是更改为重定向之后的页面地址。调用者和被调用者之间不共享内置对象。如:
/WEB-INF/page/hello.jsp?msg=
redirectActin/redirect-action用于重定向到另一个Action。如:
helloworld
/test
chain用于串联两个连续执行的Action,如:
1. package action; 2. 3. import com.opensymphony.xwork2.ActionInvocation; 4. import com.opensymphony.xwork2.interceptor.PreResultListener; 5. 6. public class MyPreResult implements PreResultListener{ 7. public void beforeResult(ActionInvocation actionInvocation, String result) { 8. System.out.println("现在处理Result执行前的功能,result="+result); 9. } 10. }
这个类中出现了ActionInvocation对象,这个对象封装了Action运行所需要的东西,包括数据、代理对象等,甚至可以通过它来执行Action。
然后在Action的execute方法里面,注册这个监听器对象,示例如下:
1. package cn.javass.action.action; 2. import com.opensymphony.xwork2.ActionContext; 3. import com.opensymphony.xwork2.ActionSupport; 4. import com.opensymphony.xwork2.interceptor.PreResultListener; 5. public class HelloWorldAction extends ActionSupport { 6. private String account; 7. private String password; 8. private String submitFlag; 9. 10. public String execute() throws Exception { 11. this.businessExecute(); 12. PreResultListener pr = new MyPreResult(); 13. ActionContext.getContext().getActionInvocation().addPreResultListener(pr); 14. return this.SUCCESS; 15. } 16. /** 17. * 示例方法,表示可以执行业务逻辑处理的方法, 18. */ 19. public void businessExecute(){ 20. System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag); 21. } 22. //属性对应的getter/setter方法,省略了 23. } struts.xml没有什么变化,就是最简单的配置,如下:1. <?xml version="1.0" encoding="UTF-8" ?> 2. <!DOCTYPE struts PUBLIC 3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4. "http://struts.apache.org/dtds/struts-2.0.dtd"> 5. 6. <struts> 7. <constant name="struts.devMode" value="true" /> 8. <constant name="struts.locale" value="zh_CN"/> 9. <constant name="struts.i18n.encoding" value="utf-8"/> 10. 11. <package name="helloworld" extends="struts-default"> 12. <action name="helloworldAction" class="action.HelloWorldAction"> 13. <result>/s2impl/welcome.jsp</result> 14. </action> 15. </package> 16. </struts>
为了看出PreResult确实是在Result之前运行的,可以在welcome.jsp里面简单的输出一句话,如下所示:
1. <%@ page language="java" contentType="text/html; charset=utf-8" 2. pageEncoding="utf-8"%> 3. <html> 4. <head> 5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 6. <title>Insert title here</title> 7. </head> 8. <body> 9. <% 10. System.out.println("现在输出Result页面"); 11. %> 12. </body> 13. </html>
备注:有些知识点是看别人的总结,但是不知具体是出自谁之手,再次不能表明出处了,还望原作者海涵,如有需要,请告之!!
- struts2重要知识点总结(2)
- Struts2重要知识点总结
- struts2重要知识点总结(1):
- 重要知识点总结
- c++重要知识点总结
- Swift - 重要知识点总结
- Java重要知识点总结
- Java重要知识点总结
- HashMap重要知识点总结
- html重要知识点总结
- java基础重要知识点总结
- C/C++重要知识点总结
- 安卓重要知识点总结
- smarty模板重要知识点总结
- Service重要的知识点总结
- Struts2学习知识点总结
- struts2:知识点总结
- Struts2知识点总结大全
- 首记
- 杭电OJ4496 并查集 D-City
- 二叉树排序树中查找的路径
- WiFi万能钥匙蹭网原理详细剖析
- Objective-C语言——NSMutableString可变字符串
- struts2重要知识点总结(2)
- leetcode -- Permutation & Permutation II--重点
- typedef的用法
- 从Container内存监控限制到CPU使用率限制方案
- CSS z-index 属性
- 为什么梯度下降慢而用随机梯度下降
- android-Debugging Web Apps
- C#中的DllImport使用笔记
- SFM-based positioning(基于建模的视觉定位)