Struts2中的action类

转载 同时被 2 个专栏收录
282 篇文章 1 订阅
121 篇文章 0 订阅

Struts2中的action类


action类在Struts2中承担了Model(模型)的角色,主要用于处理业务逻辑并存放HTTP请求处理过程中各个变量的值。
在Struts2里面,Action充当着MVC中模型的角色,也就是Action既封装了业务数据,又要处理业务功能。


action类

在Struts2中,作为action的Java类不需要继承任何父类,也不需要实现任何接口。只要包含一个叫做execute()的方法,同时该execute()方法返回类型为String,那么这个Java类就可以作为Struts2应用程序中的action类而出现。这么做的原因很明显:降低了应用程序代码和Struts代码之间的耦联,让应用代码更加的独立。


Action接口

Struts2提供了一个叫做Action的接口(com.opensymphony.xwork2.Action),凡是实现该接口的Java类
均可作为action类来使用。Action接口的作用有两个:
保证Java类满足Struts2对action类的要求 — 具有一个返回类型为String的execute()方法。
public String execute() throws Exception;
提供几个标准的返回值以供execute()方法使用。
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";


ActionSupport类


除了Action接口,Struts2还提供了一个叫做ActionSupport的类


(com.opensymphony.xwork2.ActionSupport),凡是从该类继承的Java类均可作为action类来使用。


ActionSupport类的作用有以下几点:


实现了Action接口,于是保证了Struts2对action类的要求。值得注意的是,ActionSupport类实现的


execute()方法所返回的值为SUCCESS,因此如果从ActionSupport类继承的action类不覆写execute()方法


,那么最终返回的值为SUCCESS。
public String execute() throws Exception {
    return SUCCESS;
}
实现了其它几个与拦截器(interceptor)相关的接口,从而让action类能使用这些拦截器所提供的功能


。action类通过实现相关接口来配合使用拦截器,是Struts2中的一个特点。通过对几个常用的拦截器接


口进行实现,ActionSupport向继承自它的action类提供了更多的支持。
提供一些工具方法以供子类使用,如:
public String input() throws Exception {
    return INPUT;
}


public String doDefault() throws Exception {
    return SUCCESS;
}


========

Action基础



Action是什么
  在Struts2中,一个Action类代表一次请求或调用,每个请求的动作都对应于一个相应的Action类,


一个Action类是一个独立的工作单元。也就是,用户的每次请求,都会转到一个相应的Action类里面,由


这个Action类来进行处理,因此一个Action类代表了用户的一次请求或调用。简单来说,Action就是用来


处理一次用户请求的对象。


Action能干什么


public class HelloWorldAction implements Action {  


        private String account;  
        private String password;   


        public String execute() throws Exception {  
            System.out.println("用户输入的参数为===" + "account=" + account + ",password=" + 


password);  
            return "toWelcome";  
        }  


        public String getAccount() {  
            return account;  
        }  


        public void setAccount(String account) {  
            this.account = account;  
        }  


        public String getPassword() {  
            return password;  
        }  


        public void setPassword(String password) {  
            this.password = password;  
        }  


    }  


  根据上面的Action实现,在Struts2里面,Action充当着MVC中模型的角色,也就是Action既封装了业


务数据,又要处理业务功能。在实际的JavaEE开发中,逻辑部分会放到逻辑层去实现,这就变成Action只


是去调用逻辑层来进行业务逻辑的处理,并不是真的在Action里面去实现业务逻辑的处理。上面Action的


属性和属性对应的getter/setter方法,就是用来接收用户请求的数据,并把这些数据封装在Action中,


在后续处理中可以访问这些数据。上面Action的实现中的execute方法的实现,你会发现execute方法里面


实现的功能,正是前面学习的MVC的控制器部分的功能。从另外一个角度说,Struts2的Action也充当着


MVC中控制器的角色。


那Struts2的Action相当于MVC中的控制器还是模型?


  虽然两种说法都过得去,但是目前大家的共识是把Struts2的Action作为MVC中的模型角色来看待。原


因是在Struts2运行的时候,是由Struts2中的前端控制器FilterDispatcher分发并调用相应的Action,此


时Action仅仅相当于一次请求的命令处理,层面比较小,再加上已经有FilterDispatcher来做控制器进行


分发调度,因此,一般不把 Struts2的Action当作MVC的控制器来看,而是当作MVC的模型来看。


Action的配置
  不管Action采用何种实现方式,要正确运行,都需要在struts.xml中进行配置,这是使用Action的基


础。


<package>的配置
  Action需要在struts.xml中配置才可以使用,而且Action应该配置成为<package>元素的子元素,那


么<package>元素的功能是什么?


  <package>元素可以把逻辑上相关的一组Action、Result、Intercepter等元素封装形成一个独立的模


块,package可以继承其他的package,也可以作为父包被其他的package继承,比如配置“<package 


name="helloworld"  extends="struts-default">”,helloworld这个包就继承了struts-default这个包





       <package>元素有如下属性:


  name:包的名称。必须配置


  extends:要继承的包,后面配置的是被继承的包的名称。可选


  namespace:包的命名空间。可选


  abstract:定义包为抽象的,也就是不能包含Action的定义。可选


  namespace配置的是包的命名空间,同一个命名空间里面不能有同名的Action,当然不同的命名空间


里面是可以有同名的Action的。类似于Java的包的功能,namespace可以有效的防止action重名的冲突,


因为配置了namespace后,在访问action的时候就需要添加namespace来作为action的前缀。如果不配置


namespace,表示是默认的namespace,那么访问的时候不需要添加namespace前缀。


  abstract用来定义包为抽象的,也就是不能包含Action的定义,但是抽象包可以被其他包继承,因此


里面可以定义其他包需要的元素,比如ResultType、Interceptor等等。


<action>的配置
虽然Action在Struts2的开发中非常重要,但是其配置非常简单,基本的规则如下:


  <action>元素是<package>元素的子元素,应该配置在<package>元素里面


  <action>元素通常需要配置name和class属性,其中name是必须的


  <action>元素可以包含其他的子元素:比如<param>、<result>、<interceptor-ref>、<exception-


mapping >


通常也就是配置name和class属性,然后配置<result>子元素。


为何可以不配置<action>的class属性?


   <package>元素的extends属性配置“struts-default”,说明了这个包继承了一个叫“struts- 


default”的包,这是Struts2默认配置好的各个<package>元素的公用配置。打开它,可以发现这个文件


类似于我们熟悉的struts.xml。根元素也是<struts>,<struts>元素下面有一个子元素<package>,这个


<package>的name属性的值正是“struts-default”。看最后的配置<default-class-ref 


class="com.opensymphony.xwork2.ActionSupport" />,这说明<action>元素不写class属性的时候,默


认配置就是使用ActionSupport类。这种做法有什么用?大多数情况下都是需要配置<action>的class属性


的值的,因为我们需要把自己写的,用来处理请求的Action类配置上去,而不是使用默认的配置。考虑一


种情况,在实际开发中对安全性要求较高的web项目,往往把jsp放在WEB-INF文件夹中,这样可以防止外


界直接通过URL来访问jsp页面,这时的jsp就一定要是Servlet或Action的后继页面,才可以被访问到。因


此,如果我们有一个jsp页面在WEB-INF下,但在它之前不需要Action访问逻辑层,相当于需要直接访问这


个jsp页面。就可以让这个jsp作为ActionSupport的后继页面,使用default-class-ref,可以减少重复配


置。


========

怎么写Action类

 1.怎么写Action类? 2.Action的方法,怎么样跟请求对应 3.Action中怎么获取作用域通讯对象


1.如何写Action类?
  1)public String execute(){}
  2) public String methodName(){}
  3) extends ActionSupport
2.Action的方法,怎么样跟请求对应?
   1)什么都不指定,默认调用Action的execute
   2)在struts.xml action的method属性指定


   3)在url中用!号指定    login!add.action   (login为action名,add为action中的一个方法名)


   4)用submit标签的method属性指定方法名称


   5)在action用,用通配符自己适配、


3.Action中怎么获取作用域通讯对象
   1)IOC
      Struts2  (Action对象)
      HttpServletRequest (Tomcat)
步骤:实现接口SessionAware,重写setSession()方法,在login中调用session.put("key","value");
public class LoginAction extends ActionSupport implements SessionAware,
        ServletRequestAware {


    private String userName;
    private String password;
    private String message;


    private Map session = null;


    private HttpServletRequest request = null;
 /**
  * Action中如何获取作用域通讯对象 s1)IOC Struts2 (Action对象)
  * 步骤:实现接口SessionAware,重写setSession()方法,在login中调用session.put("key","value");
  * HttpServletRequest (Tomcat)
  * 实现接口ServletRequestAware接口,重写setServletRequest()方法 2)非IOC
  * 
  */


    public String login() {
        String result = "success";
        message = "登录成功";
        System.out.println(userName + " " + password);
        if (userName == null || userName.equals("")) {


            message = "登录失败";
        } else {
            // 获取session
            // 在session中放一个用户登陆成功标记
            session.put("LOGIN_FLAG", userName);
            // 非IOC
            Map s1 = ActionContext.getContext().getSession();
            HttpServletRequest req = ServletActionContext.getRequest();
        }
        return result;
    }


// 重写了SessionAware接口中的setSession方法
  
    public void setSession(Map<String, Object> arg0) {
        this.session = arg0;
    }
     struts2将session用map为了:实现容器的解耦(测试时只需要在JUnit测试,只需要在Map中看有无


值,否则需要在tomcat下测试)
   2)非IOC
      HttpServletRequest req = ServletActionContext.getRequest();
 
============


一个公共Action类代码分析

其他Action类可继承此类,可实现分页功能


包名:action


导入:
java.util.HashMap;
java.util.Map;
com.opensymphony.xwork2.ActionContext;
com.opensymphony.xwork2.ActionSupport;
访问数据库的服务类


类CommAction 继承 ActionSupport
定义访问数据服务类类型的变量
调用ActionContext.getContext().get("request")获取Map类型对象request
调用ActionContext.getContext().getSession()获取Map类型对象session
定义整型变量currPage,赋值为1
定义整型变量chose赋值为2 - 判断自定义分页的最大记录数
定义整型变量cmaxR赋值为10 - 每页显示的最大记录数
定义boolean型变量isTrue,赋值为false - 判断操作是否成功


函数,setCoservice,设置访问数据服务类类型的变量
currPage的get,set;
cmaxR的get,set
chose的get,set




















 
  • 4
    点赞
  • 0
    评论
  • 3
    收藏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值