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

Struts2中的action类相关推荐

  1. Struts2中XXX.Action类中方法的访问(三种方式)

    第一种:使用action标签的method属性(常规方法) Action类: package cn.tedu.web;import org.springframework.context.annota ...

  2. Struts2中的Action类(解耦方式,耦合方式)

    一.解耦方式 特点:对web资源进行了封装,便于单元测试. 实现:ActionContext和接口方式 1.ActionContext 特点:Action执行的上下文对象.保存了执行Action所需要 ...

  3. Struts2中的Action

    多数的MVC框架中的Control层,都是一个Java对象.按照惯例,我们通常会把这个层次上面的Java对象统称为Action层.本篇文章,我们就来简单介绍一下Struts2中Action的相关内容. ...

  4. struts2中把action中的值传递到jsp页面的例子

    例子: RegistAction的代码: package com.wss.action;import javax.servlet.http.HttpServletRequest;import org. ...

  5. 【struts2】struts2中的Action详解

    在传统的MVC框架(如struts1.Spring等)中,Action都需要实现特定的接口,这些接口都是MVC框架定义的,实现MVC的接口会与MVC框架耦合.struts2的Action要灵活得多,可 ...

  6. struts2中welcome-fileindex.action/welcome-file直接设置action,404的解决方案

    这几天的项目页面的访问全部改为.action访问,在修改首页时遇到了问题.将web.xml文件中<welcome-file>index.action</welcome-file> ...

  7. 经struts2中的action后,jsp中css失效的问题

    最近在做毕业设计,发现写后台时,jsp页面直接打开是好的,但是经过action跳转便会失去样式,发现原来是打开的action页面和需要的css不在一个目录下,修改很简单,将此action 所在的pac ...

  8. 在Action类中获得HttpServletResponse对象的四种方法

    Struts2:在Action类中获得HttpServletResponse对象的四种方法 在struts1.x Action类的execute方法中,有四个参数,其中两个就是response和req ...

  9. Struts2中jsp前台传值到action后台的三种方式以及valueStack的使用

    struts2中的Action接收表单传递过来的参数有3种方法: 如,登陆表单login.jsp: 1 <form action="login" method="p ...

最新文章

  1. pytroch 数据集 datasets DataLoader示例
  2. laravel模板写php代码,Laravel框架之blade模板新手入门教程及小技巧
  3. 【New】SAPUI5开发环境配置步骤
  4. ActionResult的其它返回值
  5. 怎么在Mac上安装Tomcat 7
  6. 菜鸟做设计必看!有关如何做设计的整体思路,以及能否综合的笔记
  7. eval函数 php_PHP的一句话木马代码和函数eval的简介
  8. java移动文件导致tomcat死掉_原 netty导致tomcat假死
  9. android h5页面跳转,android H5 应用内跳转Scheme协议
  10. 正则表达式教程之模式修正符
  11. Day01_FAT12 文件系统
  12. 【渗透】浅谈webshell隐藏
  13. html网站 放新闻 文件夹名字 是什么,服务器上传网页文件时应注意哪几点?
  14. 常用来进行钢结构节点输出的软件是什么_钢结构、Tekla及建筑工业化厂商对Tekla软件的开发和应用...
  15. opencv图片保存0字节_Opencv中IplImage存储方式介绍
  16. jsr基本使用@valid和@validation
  17. 苹果手机话筒声音小怎么办_苹果8通话声音小,苹果8听筒声音小怎么办
  18. [笔记]|[FPGA]|[寄存器]|[模拟信号数字信号]《FPGA学习之道》学习笔记(1)
  19. 华为更新系统10.1显示连接服务器失败,emui10.1正式版-华为emui10.1系统更新正式版预约 -优盘手机站...
  20. JavaScript中getElementsByName

热门文章

  1. Set Up Optimization
  2. toString()与new String ()用法区别
  3. Backbone与服务器接口之Model数据同步
  4. springboot 的两种配置文件语法||配置文件占位符||@Value 读取配置文件及验证处理
  5. ueditor百度编辑器常见报错的解决方法
  6. poj2420 A Star not a Tree? 【模拟退火】
  7. 整数划分问题(续)(非递归法)
  8. 第一次上课:特征值特征向量的几何直观
  9. matlab之矩阵基础应用
  10. 原根与指标(离散对数)