Struts2的Action

来源:互联网 发布:女尊小说软件 编辑:程序博客网 时间:2024/04/30 19:55

     Struts2框架中的Action是业务控制器,是Struts2框架的核心。用户提交的所有请求,都是通过Action进行业务逻辑处理的。在Struts2框架中,Action是实现企业应用的关键部分。

一、    Action实现类

   1.  Struts2最大的特点是实现了ActionServlet API的分离,Struts2中的Action就是一个普通的Java类  

   (POJO),该类通常包含一个execute()方法,该方法没有任何参数,只是返回一个字符串类型值。

    例如:用户登录Action

package ch02;

import com.opensymphony.xwork2.ActionSupport;

public class UserLogin extends ActionSupport{

       /**

        *

        */

       private static final long serialVersionUID = 1L;

      

       private String userName;

       private String password;

      

       public String getUserName() {

              return userName;

       }

       public void setUserName(String userName) {

              this.userName = userName;

       }

       public String getPassword() {

              return password;

       }

       public void setPassword(String password) {

              this.password = password;

       }

    public String execute() throws Exception{

       if(userName!=null&&getPassword().equals(("123")&&!getUserName().trim().equals("")){

                     return SUCCESS;

              }

              else{

                     return INPUT;

              }           

       }

}

 

 

 

2.  那么Struts2Action是如何获得用户Http请求中的参数的?

      通常情况下,Struts2框架中的Action会直接封装Http请求参数,一般的Action会包含与请求参数对应的属性,并提供该属性的gettersetter方法。

1.       比如上面的UserLoginAction的实现类,该类中定义了userNamepassword两个属性,分别对应用户提交的form表单中的参数值。

2.       同时UserLogin类为每个属性设置了gettersetter方法。

注意: 1. 并不是Action必须要定义一个与用户Form中名字相同的属性,但是一定要有对应Form参数值的gettersetter方法。

2.       Action不但可以设置与Http请求参数对应的属性,也可以定义Http参数中没有的属性,而用户可以访问这些属性。

 

        说明: 对于Struts2框架来说,不会区分Action的属性是否为传入的还是传出的,Struts2提供了一个类似“仓库”的机制,Action可以使用gettersetter方法从“仓库”中存入或者取出属性值,只要包含用户Http请求参数的gettersetter方法即可。用户的Http也是通过post向“仓库”中传入值或者从“仓库”中取出值。

                                                                                                                         

二、  Action接口和ActionSupport工具类

1.      为了规范用户开发Action的实现类,Struts2框架提供了一个Action接口,该接口提供了一个通用的规范。如下所示:Action接口

public abstract interface Action{

  //定义静态常量

  public static final String SUCCESS="success";

public static final String NONE="none";

public static final String ERROR="error";

public static final String INPUT="input";

public static final String LOGIN="login";

//定义抽象接口

public abstract String execute() throws Exception;

}

 

说明:1. Action接口很简单,定义了SUCCESSNONEERRORINPUTLOGIN常量,开发者在编写自己的Action类时,实现Action接口,就可以在execute()方法中返回SUCCESSNONEERRORINPUTLOGIN,而不是自己随意书写字符串,这样就规范了代码。

 

            2. Action接口声明了一个抽象execute()方法,Action类需要对该方法进行重新编写,实现自己的业务控制逻辑。

 

2.      Struts2预设了一个工具类ActionSupport,该类已经实现了Action接口,并定义了execute()方法和数据校验validate()方法;除此之外,还包含了很多如异常处理、国际化等一些常用的方法。

说明: 开发者在编写自己的Action时,只要继承ActionSupport类就可以了,这样可以更加方便、快

       捷地实现业务控制器。

三、  Action访问ActionContext

Struts2框架的Action强调的是与Servlet API完全分离,这种非耦合性给开发者的测试提高了便利。但是,Struts2Action不访问Servlet API是不能实现业务逻辑的,用户请求中的参数值,对业务逻辑的实现有着至关重要的意义,例如访问SessionApplication状态等。

  1. 一般Web应用中,需要访问的Servlet API就是HttpServletHttpSessionServletContext,这三个类就包含了JSP内置对象中所对应的RequestSessionApplication  Struts2框架中有一个ActionContext类,该类中包含了所有将会访问的数据,Struts2框架的Action可以通过访问ActionContext来获得Servlet API,如下图所示:

 

ActionContext是一个Action执行的上下文,Action执行期间所用到的对象都保存在ActionContext中,例如Session、参数等数据。

说明:ActionContext是一个局部线程,这意味着每个线程中的ActionContext内容都是唯一的。所以不用担心Action的线程安全。

 

2.      访问ActionContext

1. 开发者可以使用下面的代码访问ActionContext

ActionContext ctx=ActionContext.getContext();

                      2. 下面是该类的常用方法:

  1. public static ActionContext getContext() :获得当前ActionActionContext实例。   
  2. public Object get(Object key) :此方法类似于调用HttpServletRequestgetAttribute(String name)方法。   
  3. public void put(Object key, Object value):此方法类似于调用  HttpServletRequestsetAttribute(String name, Object o)   
  4. public Map getParameters() :获取所有的请求参数。类似于调用HttpServletRequest对象的getParameterMap() 方法。   
  5. public Map getSession() :返回一个Map对象,该Map对象模拟了HttpSession实例。   
  6. public void setSession(Map session)  直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名-属性值对。   
  7. public Map getApplication() :返回一个Map对象,该对象模拟了该应用的ServletContext实例。   
  8. public void setApplication(Map application) :直接传入一个Map实例,将该Map实例里的key-value对转换成application的属性名-属性值对。  

四、  Action直接访问ServletAPI

1.  Struts2框架的Action可以通过ActionContext来访问Servlet,除此之外,Struts2框架还提供了

      ServletActionContext辅助类来帮助开发者获得ServletAPI 可以通过下面的方式获得:

      HttpServletRequest request=ServletActionContext.getRequest();

      HttpServletResponse response=ServletActionContext.getResponse();

      HttpSession session=request.getSession();

 

   说明:使用ActionContext类和ServletActionContext辅助类来访问ServletAPI都属于非IoC(Inversion of

            Control)方式,Struts2框架还提供了IoC方式来访问ServletAPI

2. 使用IoC方式访问Servlet APIAction必须要实现下面的接口:

 

   1ServletContextAware:实现该接口的类可以直接访问Web应用的ServletContext实例。

      该接口中定义了一个void setServletContext(ServletContext context)方法,实现该接口的类必须实现void

      setServletContext(ServletContext context)方法。

   2ServletRequestAware:实现该接口的类可以直接访问用户请求的HttpServletRequest实例。该接口定义

     了一个void setServeltRequest(HttpServletRequest request)方法,实现接口的类必须实现  void

           setServeltRequest(HttpServletRequest request)方法。

   3ServletResponseAware:实现该接口的类可以直接访问服务器响应的HttpServletResponse实例。该接口

     中定义了void setServletResponse(HttpServletResponse response)方法,实现该接口的类必须实现void

           setServletResponse(HttpServletResponse response)方法。

 

五、  Action的配置

Action配置模块就是Web项目的“模块”,正是通过struts.xml文件或者其包含的配置文件来实现Action的配置的。在Struts2框架中每一个Action都是一个工作单元。Action负责将一个请求对应到一个Action处理上去,每当一个Action类匹配一个请求的时候,这个Action类就会被Struts2框架调用。下面给出一个Action的配置示例:

  <action name="Regist" class="struts.HelloWorld.Regist">               

        <result name="success">/success.jsp</result>                          

       <result name="input">/regist.jsp</result>

 </action>

说明:1. 每一个Action可以配置多个result、多个ExceptionHandler、多个拦截器Interceptor,但是只能有一个name,这个namepackagenamespace来唯一区别一个Action

2. 每当Struts2框架接受到一个请求的时候,会去掉HostApplication和后缀等信息,得到Action的名字。 

 

 

六、  Action的动态方法调用

1. Struts2框架中,可以使用DMI(Dynamic Method Invocation,动态方法)来调用同一个Action中的不同

  业务逻辑方法,一般需要在JSP的表单属性中指定具体的调用方法,一般格式如下:

 

    <form method=" post " action="Action名称!方法名称.action">

     ……

</form>

        注意:1. 使用Action的动态方法调用,需要将Struts2框架的相应常量struts.enable.DynamicMethodInvocation设置为true,这样框架才支持动态方法调用。Struts2中该常量的默认值就是true

                    2. Action中建立不同的业务逻辑方法,规范与execute()是完全一样的,也是一个没有参数的方法,返回值也是字符串类型。实际上,一般Action都是继承ActionSupport类,但是ActionSupport类并不强制其子类必须实现execute()方法。

 

2.      Struts2框架还提供了另外一种方式来实现动态方法调用,就是修改配置文件,定义多个Action名称,不同的方法对应不同的Action配置。要配置不同的Action名对应一个Action类的不同方法,必须配置method属性。

例如:将Bank类的“存款”和“转账”两个业务逻辑配置成两个Action,并在配置中指定method值。配置文件代码如下:

       <action name="Bank_saving" class="ch02.Bank" method="saving">

               <result name="success">/success.jsp</result>                                          

       </action>

       <action name="Bank_transfer" class="ch02.Bank" method="transfer">

              <result name="success">/success.jsp</result>                                        

       </action>

             注意:这种增加Action配置的方式访问Action动态方法会导致Struts2框架中的配置文件内容增加,如果应用项目开发量大,那么会给配置文件的管理带来很大的麻烦。

 

 

七、  通配符配置

前面的示例中Bank_savingBank_transfer配置中,如果使用通配符Bank_*来配置那会更加方便。 Struts2框架为开发者提供了非常好的通配符配置支持。在Action配置中,一般需要指定nameclassmethod属性,Struts2框架支持这三个属性使用通配符来定义。

 示例:

                  <action name="Bank_*" class="ch02.Bank" method="{1}">

     <result name="success">/success.jsp</result>

 </action>

该配置使用了通配符,定义了一系列Action,只要用户请求为Bank_*.action,就可以找到相应的Action。这一系列Action都指向了类ch02.Bank,该类中有对应的不同方法。method={1}指的是用户请求Bank_*.action中的第一个参数。 例如:如果用户请求为Bank_saving.action,那么method=saving;如果用户请求为Bank_transfer.action,那么method=transfer

 

说明:Struts2框架的配置文件中可以指定多个通配符,例如可以配置为:

      <action name="Bank_*_*" class="ch02.Bank{1}Action" method="{2}">

   <result name="success">/success.jsp</result>                            

    </action>

如果用户请求为Bank_transfer_ccb.actionStruts2框架会将Action配置“翻译”为:

<action name="Bank_transfer_ccb" class="ch02.BanktransferAction" method="ccb">

原创粉丝点击