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=messagetrue使{message},在程序运行时将被替换成具体的值,该值由Action类的message属性决定。如果Action中message属性没有定义,那么表达式${message}的值为null。
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>

备注:有些知识点是看别人的总结,但是不知具体是出自谁之手,再次不能表明出处了,还望原作者海涵,如有需要,请告之!!

1 0
原创粉丝点击