Struts2-----5、Struts2实现Action

对于Struts2应用的开发者而言,Action才是应用的核心,开发者需提供大量的Action类,并在struts.xml文件中配置Action;Action类里包含了对用户请求的处理逻辑,Action类也被称为业务控制器

相对Struts1而言,Struts2采用低侵入方式的设计,Struts2不要求Action类继承任何Struts2基类或实现任何Struts2接口;在这种设计方式下,Struts2的Action类是一个普通的POJO(通常应包含一个无参的execute方法),从而有很好的代码复用性

Struts2通常直接使用Action封装HTTP请求参数,因此,Action类还应包含请求参数对应的属性,并提供对应的setter、getter方法

//处理用户请求的Action类,只是一个POJO,无须继承任何基类,无须实现任何接口
public class LoginAction {
    // 提供两个属性来封装HTTP请求参数
    private String user;
    private String pass;

    // 省略getter、setter方法

    // Action类默认处理用户请求的逻辑控制方法
    public String execute() {
       ......
       // 返回处理结果字符串
       return resultStr;
    }
}

即使Action需处理的请求包含user和pass两个HTTP请求参数,Action类也可不包含user和pass Field;因为系统是通过对应的getter和setter方法来处理请求参数的

Action类里的属性,不仅可用于封装请求参数,还可用于封装处理结果

(1)、Action接口和ActionSupport基类

为了让用户开发的Action类更规范,Struts2提供了一个Action接口,这个接口定义了Struts2的Action处理类应该实现的规范

public interface Action {
    // 定义Action接口里包含的一些结果字符串;作用就是统一execute方法的返回值
    public static final String ERROR = "error";
    public static final String INPUT = "input";
    public static final String LOGIN = "login";
    public static final String NONE = "none";
    public static final String SUCCESS = "success";

    // 定义处理用户请求的execute方法S
    public String execute() throws Exception;
}

Struts2为Action接口提供了一个实现类:ActionSupport

public class ActionSupport implements Action,Validatable,ValidationAware,TextProvider,LocaleProvider,Serializable{
    // 收集校驗錯誤的方法
    public void setActionErrors(Collection errorMessages) {
       validationAware.setActionErrors(errorMessages);
    }
    //返回校验错误的方法
    public Collection getActionErrors(){
       return validationAware.getActionErrors();
    }

    public void setActionMessages(Collection messages){
       validationAware.setActionMessages(messages);
    }
    public Collection getActionMessages(){
       return validationAware.getActionMessages();
    }
    ......
    //设置表单域校验错误信息
    public void setFieldErrors(Map errorMap){
       validationAware.setFieldErrors(errorMap);
    }
    //返回表单域校验错误信息
    public Map getFieldErrors(){
       return validationAware.getFieldErrors();
    }

    //控制Locale的相关信息
    public Locale getLocale(){
       return ActionContext.getContext().getLocale();
    }
    public String getText(String aTextName){
       return textProvider.getText(aTextName);
    }

    //返回国际化信息的方法
    public String getText(String aTextName,String defaultValue){
       return textProvider.getText(aTextName,defaultValue);
    }

    public String getText(String aTextName,String defaultValue,String obj){
       return textProvider.getText(aTextName,defaultValue,obj);
    }

    ......
    //用户访问国际化资源包的方法
    public ResourceBundle getTexts(){
       return textProvider.getTexts();
    }

    public ResourceBundle getTexts(String aBundleName){
       return textProvider.getTexts(aBundleName);
    }

    //添加错误信息
    public void addActionError(String anErrorMessage){
       validationAware.addActionError(anErrorMessage);
    }

    public void addActionMesaage(String aMessage){
       validationAware.addActionMessage(aMessage);
    }

    //添加字段校验失败的错误信息
    public void addFieldError(String fieldName,String errorMessage){
       vlidationAware.addFieldError(fieldName,errorMessage);
    }

    //默认的input方法,直接返回INPUT字符串
    public String input() throws Exception{
       return INPUT;
    }

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

    //默认的处理用户请求的方法,直接返回SUCCESS字符串
    public String exceute() throws Exception{
       return SUCCESS;
    }
    ......

    //清除所有错误信息的方法
    public void clearErrorsAndMessages(){
       validationAware.clearErrorsAndMessages();
    }

    //包含空的输入校验方法
    public void validate(){

    }

    public Object clone() throws CloneNotSupportedException{
       return super.clone();
    }
    ......
}

(2)、Action访问ServletAPI

1)、通过ActionContext类来访问ServletAPI

ActionContext类中包含的常用方法:

static ActionContext getContext():获取系统的ActionContext实例

Object get(Object key):类似HttpServletRequest的getAttribute(String name)

put(String key,Object value):类似HttpServletRequest的setAttribute(String key,Object value)

Map getSession():返回一个Map对象,模拟了HttpSession实例

Void setSession(Map session):直接传入一个Map实例,将该Map实例里的key-value对转换成session、application的属性名、属性值

void setApplication(Map application):直接传入一个Map实例,将该Map实例里的key-value对转换成session、application的属性名、属性值

Map getApplication():返回一个Map对象,模拟了ServletContext实例

Map getParameters():获取所有的请求参数,类似于HttpServletRequest的getParameterMap()

LoginAction.java:
public class LoginAction implements Action {
    private String username;
    private String password;

    // 省略setter、getter方法
    public String execute() throws Exception {
       ActionContext ctx = ActionContext.getContext();
       // 通过ActionContext访问application范围的属性值
       Integer counter = (Integer) ctx.getApplication().get("counter");
       if (counter == null) {
           counter = 1;
       } else {
           counter = counter + 1;
       }

       // 通过ActionContext设置application范围的属性
       ctx.getApplication().put("counter", counter);
       // 通过ActionContext设置session范围的属性
       ctx.getSession().put("user", getUsername());

       if (getUsername().equals("crazyit.org") && getPassword().equals("lbd")) {
           // 通过ActionContext设置request范围的属性
           ctx.put("tip", "服务器提示:您已经成功的登录");
           return SUCCESS;
       } else {
           // 通过ActionContext设置request范围的属性
           ctx.put("tip", "服务器提示:登录失败");
           return ERROR;
       }
    }
}
struts.xml:
<constant name=”conststruts.devMode” value=”true”/>
<package name=”lee” extends=”struts-default”>
   <action name=”login” class=”org.crazyit.app.action.LoginAction”>
      <result name=”error”>/error.jsp</result>
      <result name=”sucess”>/sucess.jsp</result>
   </action>
</package>
welcome.jsp:
${applicationScope.counter}
${sessionScop.user}
${requestScop.tip}

2)、Action接口直接访问ServletAPI

ServletContextAware:实现该接口的Action可直接访问Web应用的ServletContext实例

ServletRequestAware:实现该接口的Action可直接访问用户请求的HttpServletRequest实例

ServeltResponseAware:实现该接口的Action可直接访问服务器响应的HttpServletResponse实例

SessionAware:

LoginAction.java:
package webDemo;

public class LoginAction implements Action, ServletResponseAware {
    private String username;
    private String password;
    private HttpServletResponse response;

    // 省略setter、getter方法

    // 重写实现ServletResponseAware接口必须实现的方法
    @Override
    public void setServletResponse(HttpServletResponse response) {
       this.response = response;
    }

    public String execute() throws Exception {
       ActionContext ctx = ActionContext.getContext();
       // 通过ActionContext访问application范围的属性值
       Integer counter = (Integer) ctx.getApplication().get("counter");
       if (counter == null) {
           counter = 1;
       } else {
           counter = counter + 1;
       }

       // 通过ActionContext设置application范围的属性
       ctx.getApplication().put("counter", counter);
       // 通过ActionContext设置session范围的属性
       ctx.getSession().put("user", getUsername());
       if (getUsername().equals("crazyit.org") && getPassword().equals("lbd")) {
           // 通过response添加Cookie
           Cookie c = new Cookie("user", getUseranme());
           c.setMaxAge(60 * 60);

           response.addCookie(c);

           // 通过ActionContext设置request范围的属性
           ctx.put("tip", "服务器提示:您已经成功的登录");
           return SUCCESS;
       } else {
           // 通过ActionContext设置request范围的属性
           ctx.put("tip", "服务器提示:登录失败");
           return ERROR;
       }
    }
}

实现ServletResponseAware接口,必须实现:public void setServletResponse(HttpServletResponse response);

实现ServletRequestAware接口,必须实现:public void setServletRequest(HttpServletRequest request)

实现ServeltContextAware接口,必须实现:public void setServletContext(Servlet context);

实现SessionAware接口,必须实现:public void setSession(Map<String, Object> session);

3)、使用ServletActionContext工具类直接访问Servlet API

ServeletActionContext常用静态方法:

static PageContext getPageContext():取得Web应用的PageContext对象

static HttpServletRequest getRequest():取得Web应用的HttpServletRequest对象

static HttpServletResponse getResponse():取得Web应用的HttpServletResponse对象

static ServletContext getServletContext():取得Web应用的ServletContext对象

时间: 2024-07-29 13:05:54

Struts2-----5、Struts2实现Action的相关文章

Struts2基于注解的Action配置

使用注解来配置Action的最大优点就是能够实现零配置,可是事务都是有利有弊的.使用方便.维护起来就没那么方便了. 要使用注解方式,我们必须加入一个额外包:struts2-convention-plugin-2.x.x.jar. 虽说是零配置的,但struts.xml还是少不了的,配置例如以下: <? xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apa

Struts2整体回顾 之 Action,拦截器,值栈及关联关系

一.首先看一下当我们使用Struts时,一个请求所走的流程. 二.值栈的示意图 三.一个请求中,拦截器和值栈的时序图 4.请求.值栈结合图 Struts2整体回顾 之 Action,拦截器,值栈及关联关系,布布扣,bubuko.com

Struts2框架学习(二) Action

Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器拦截请求,创建代理Action对象,执行方法,返回结果,界面跳转. 拦截器解析请求路径,获取Action的名称,到配置文件中查找action的完整类名,利用反射创建对象. 每请求一次,就创建一个对象,所以action是多例的,也是线程安全的. 2,关系 请求的路径和配置文件的对应关系: 配置文件中包

struts2中&lt;welcome-file&gt;index.action&lt;/welcome-file&gt;直接设置action,404的解决方案

这几天的项目页面的访问全部改为.action访问,在修改首页时遇到了问题.将web.xml文件中<welcome-file>index.action</welcome-file>修改成这样,访问首页时报404错误,也就是说文件找不到.上网查了有两种解决方法.     方法一.在WebRoot下新建一个index.action空文件,这个方法简单实用,强烈推荐.    方法二.因为 welcome-file 必须是实际存在的文件,不能是action或者servlet路径你可以设置一个

JAVAWEB开发之Struts2详解(一)——Struts2框架介绍与快速入门、流程分析与工具配置以及Struts2的配置以及Action和Result的详细使用

Struts2框架介绍 三大框架:是企业主流JavaEE开发的一套架构.Struts2 + Spring + Hibernate 什么是框架?为什么要学习框架? 框架是实现部分功能的代码(半成品),使用框架简化企业级软件开发. Struts2与MVC? Struts是一款优秀的MVC框架 MVC:是一种思想,是一种模式,将软件分为Model模型.View视图.Controller控制器 JAVAEE软件三层架构:web层(表现层).业务逻辑层.数据持久层(Sun提供javaEE开发规范) Jav

Struts2基础学习(二)&mdash;Action

一.ActionSupport      为了让用户开发的Action类更加规范,Struts2提供了一个Action接口,这个接口定义了Struts2的Action处理类应该实现的规范.下面是标准Action接口的代码: public interface Action { public static final String SUCCESS = "success"; public static final String NONE = "none"; public

Struts2利用注解实现action跳转

使用注解来配置Action的最大好处就是可以实现零配置,但是事务都是有利有弊的,使用方便,维护起来就没那么方便了. 要使用注解方式,我们必须添加一个额外包:struts2-convention-plugin-2.x.x.jar. 实例为例,供参考: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//

[转]Struts2 是如何把Action交给Spring托管

例1: 首先,来看看如何让Spring 来管理Action. 1.在struts.xml中加入 <constant name="struts.objectFactory" value="spring"/>  有两种整合方式:      (1) 将Struts的业务逻辑控制器类配置在Spring的配置文件中,Action中引用的业务类一并注入. (这样的处理,必须将action类的scope配置成prototype) Xml代码   <bean id

Struts2的简单使用action

今天学习了一下Struts2框架的搭配~ 也简单的使用Struts2框架学习了Action和怎么使用核心配置文件struts.xml~ 主要实现了网页上的简单登录注册~ 项目结构如图: 写了俩个类,一个是pojo类,一个是action类~,还有俩个jsp,分别代表登录与注册~ pojo类顾名思义是Bean文件~ action类是包含一些映射配置方法,和struts.xml文件一起使用的~ 步骤: 1.先写一个User类,User类包含了一些注册用户的信息,代码如下: public class U

Struts2学习笔记(六)——Action处理请求参数

在struts2框架中关于Action处理请求参数有两种方案(三个方式),表单属性的名称应该和在Action类中定义的成员属性或者在JavaBean中定义的成员属性名称一样: 1.属性驱动 1)直接在Action类中定义成员属性来接收请求参数 (将Action当成javaBean),在Action中还需要定义成员属性的setter方法. 表单信息: 1 <form action="${pageContext.servletContext.contextPath}/testAction.ac