文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习

Action用于处理用户的请求,因此也被称为业务控制器。每个Action类就是一个工作单元,Struts 2框架负责将用户的请求与相应的Action匹配,如果匹配成功,则调用该Action类对用户请求进行处理,而匹配规则需要在Struts 2的配置文件中声明。

Struts 2框架下实现Action类有以下三种方式:

  1. 普通的POJO类,该类通常包含一个无参数的execute()方法,返回值为字符串类型。
  2. 实现Action接口
  3. 继承ActionSupport类

POJO实现方式

以用户登录为例,创建LoginAction类。

package com.qst.chapter03.action;

public class LoginAction {
  /* 用户名 */
  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() {
    System.out.println("----登录的用户信息-----");
    System.out.println("用户名:" + userName);
    System.out.println("密码:" + password);
    if (userName.startsWith("qst") && password.length() >= 6) {
      // 返回成功页面
      return "ok";
    } else {
      // 返回失败页面
      return "error";
    }
  }

}

登录页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<html>
<head>
<title>用户登录</title>
</head>
<body>
  <form action="login.action" method="post" name="logForm">
    <table>
      <tr>
        <td>用户名</td>
        <td><input type="text" name="userName" size="15" /></td>
      </tr>
      <tr>
        <td>密码</td>
        <td><input type="password" name="password" size="15" /></td>
      </tr>
      <tr>
        <td colspan="2"><input type="submit" value="登录"></td>
      </tr>
    </table>
  </form>
</body>
</html>

错误页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<title>错误页面</title>
</head>
<body>
     登录失败!
</body>
</html>

成功页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<title>显示用户信息</title>
</head>
<body>
登录成功!欢迎用户${param.userName} !
</body>
</html>

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
  <!-- 指定Struts2处于开发阶段,可以进行调试 -->
  <constant name="struts.devMode" value="true" />
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />

  <!-- Struts2的Action都必须配置在package里,此处使用默认package -->
  <package name="default" namespace="/" extends="struts-default">
    <!-- 定义一个名为user的Action,实现类为com.qst.chapter03.action.LoginAction -->
    <action name="login" class="com.qst.chapter03.action.LoginAction3">
      <!-- 配置execute()方法返回值与视图资源之间的映射关系 -->
      <result name="ok">/ok.jsp</result>
      <result name="error">/error.jsp</result>
    </action>
  </package>

</struts>

这样就以POJO方式实现了一个Action,当单击“登录按钮时”,表单中的数据会提交给login.action,Struts 2框架将自动调用LoginAction的setter方法将请求参数值封装到对应的属性中,并执行execute()方法。

实现Action接口方式

为了让Action类更规范,使各个开发人员编写的execute()方法返回的字符串风格是一致的,Struts 2提供一个Action接口,该接口定义了Acitoin处理类应该实现的通用规范:

public abstract interface Action {

 public static final java.lang.String SUCCESS = "success";
 public static final java.lang.String NONE = "none";
 public static final java.lang.String ERROR = "error";
 public static final java.lang.String INPUT = "input";
 public static final java.lang.String LOGIN = "login";

 public String execute() throws Exception;
}

下面代码使用Action接口来创建Action类:

package com.qst.chapter03.action;

import com.opensymphony.xwork2.Action;

public class LoginAction2 implements Action{
  /* 用户名 */
  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() {
    System.out.println("----登录的用户信息-----");
    System.out.println("用户名:" + userName);
    System.out.println("密码:" + password);
    if (userName.startsWith("qst") && password.length() >= 6) {
      // 返回成功页面
      return SUCCESS;
    } else {
      // 返回失败页面
      return ERROR;
    }
  }

}

struts.xml:

<struts>
  <!-- 指定Struts2处于开发阶段,可以进行调试 -->
  <constant name="struts.devMode" value="true" />
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />

  <!-- Struts2的Action都必须配置在package里,此处使用默认package -->
  <package name="default" namespace="/" extends="struts-default">
    <!-- 定义一个名为user的Action,实现类为com.qst.chapter03.action.LoginAction -->
    <action name="login" class="com.qst.chapter03.action.LoginAction3">
      <!-- 配置execute()方法返回值与视图资源之间的映射关系 -->
      <result name="success">/ok.jsp</result>
      <result name="error">/error.jsp</result>
    </action>
  </package>

</struts>

继承ActionSupport类方式

Struts 2框架为Action接口提供了一个实现类ActionSupport,该类提供了许多默认方法,写Action类时继承ActionSupport类会大大简化Action的开发。ActionSupport类是Struts 2默认的Action处理类,如果配置Action类时没有指定class属性,系统自动默认使用ActionSupport类作为Action的处理类。

下面代码通过继承ActionSupport类来创建Action类,并重写validate()验证方法:

package com.qst.chapter03.action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction3 extends ActionSupport {
  /* 用户名 */
  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() {
    System.out.println("----登录的用户信息-----");
    System.out.println("用户名:" + userName);
    System.out.println("密码:" + password);
    if (userName.startsWith("qst") && password.length() >= 6) {
      // 返回成功页面
      return SUCCESS;
    } else {
      // 返回失败页面
      return ERROR;
    }
  }

  // 重写validate()方法
  public void validate() {
    // 简单验证用户输入
    if (this.userName == null || this.userName.equals("")) {
      // 将错误信息写入到Action类的FieldErrors中
      // 此时Struts 2框架自动返回INPUT视图
      this.addFieldError("userName", "用户名不能为空!");
      System.out.println("用户名为空!");
    }
    if (this.password == null || this.password.length() < 6) {
      this.addFieldError("password", "密码不能为空且密码长度不能小于6");
      System.out.println("密码不能为空且密码长度不能小于6!");
    }
  }

}

上述代码增加了一个对表单提交的数据进行验证的validate()方法,该方法会在执行execute()方法之前运行,如果发现表单提交数据不符合要求,则执行addFieldError()方法,将错误信息写入Action类的字段错误列表FieldErrors中,并且将自动返回到INPUT输入视图,让用户重新输入表单并提交。

在struts.xml配置文件中增加INPUT输入视图:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
  <!-- 指定Struts2处于开发阶段,可以进行调试 -->
  <constant name="struts.devMode" value="true" />
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />

  <!-- Struts2的Action都必须配置在package里,此处使用默认package -->
  <package name="default" namespace="/" extends="struts-default">
    <!-- 定义一个名为user的Action,实现类为com.qst.chapter03.action.LoginAction -->
    <action name="login" class="com.qst.chapter03.action.LoginAction3">
      <!-- 配置execute()方法返回值与视图资源之间的映射关系 -->
      <result name="success">/ok.jsp</result>
      <result name="error">/error.jsp</result>
      <result name="input">/login.jsp</result>
    </action>
  </package>

</struts>

当表单提交的数据验证不通过时,则会返回到输入页面,程序会依然“停留”(看起来是这样,但其实是一个新的输入页面)在输入页面login.jsp。

访问ActionContext

相对于Struts1,Struts 2的一个重要改进是使Action不再和任何Servlet API耦合,但有些时候Action类不访问Servlet API是不能实现业务逻辑的(例如跟踪HTTP Session的状态)。此时Action就需要访问Servlet API中的HttpSession。

Struts 2提供了一种更加轻松的方式来访问Servlet API。在Struts 2框架中,Action可以通过ActionContext类来访问Servlet API,ActionContext提供了读写Servlet API中的HttpServletRequest、HttpSession和ServletContext中数据的方法。

常用方法如下表所示:

方法 功能描述
Object get(Object key) 获取属性值,与HttpSevletRequest的getAttribute(String name)类似
Map getApplication() 返回一个Map对象,该对象模拟了Web应用对应的ServletContext对象
static ActionContext getContext() 静态方法,用于获取系统的ActionContext对象
Map getParameters() 获取所有的请求参数,类似于调用HttpSevletRequest对象的getParameterMap()方法
Map getSession() 返回一个Map对象,该对象模拟了HttpSession实例
void setApplication(Map application) 直接传入一个Map对象,并将该Map对象中的键/值对转换成application的属性名和属性值
void setSession(Map session) 直接传入一个Map对象,并将该Map对象中的键/值对转换成session的属性名和属性值

下面代码演示Action访问ActionContext的使用

package com.qst.chapter03.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class ClickNumAction extends ActionSupport {
  public String execute() {
    // 获取ActionContext对象,通过该对象访问Servlet API
    ActionContext ctx = ActionContext.getContext();
    // 获取ServletContext里的num属性
    Integer num = (Integer) ctx.getApplication().get("num");
    // 如果num属性为null,设置num属性为1
      if (num == null) {
        num = 1;
      } else {
        // 将num加1
        num++;
      }
    // 将加1后的num值保存在application中
    ctx.getApplication().put("num", num);
    return SUCCESS;
  }
}

上面代码先使用ActionContext.getContext()静态方法获取系统的ActionContext对象,再调用ActionContext对象的getApplication()方法获取ServletContext对应的Map对象,然后调用get()/put()方法进行数据的读/写操作。最后将num值保存到ServletContext中。

编写clickNum.jsp 页面,对application进行访问:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<html>
<head>
<title>点击次数统计</title>
</head>
<body>
<form action="clicknum.action" method="post">
  <input type="submit" value="点击!" />
</form>
  <!--输出点击次数 -->
  点击按钮,已点击了
  <!-- 通过表达式访问ServletContext对象的属性 -->
  ${empty applicationScope.num?0:applicationScope.num} 次
</body>
</html>

上述代码创建了一个表单,表单的action属性值为clicknum,action,当单击“提交”按钮时会将表单提交给CounterAction进行处理。

在struts.xml配置文件中增加CounterAction的配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
  <!-- 指定Struts2处于开发阶段,可以进行调试 -->
  <constant name="struts.devMode" value="true" />
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />

  <!-- Struts2的Action都必须配置在package里,此处使用默认package -->
  <package name="default" namespace="/" extends="struts-default">
    <!-- 定义一个名为user的Action,实现类为com.qst.chapter03.action.LoginAction -->
    <action name="login" class="com.qst.chapter03.action.LoginAction3">
      <!-- 配置execute()方法返回值与视图资源之间的映射关系 -->
      <result name="success">/ok.jsp</result>
      <result name="error">/error.jsp</result>
      <result name="input">/login.jsp</result>
    </action>
    <action name="clicknum" class="com.qst.chapter03.action.ClickNumAction">
      <result name="success">/clickNum.jsp</result>
    </action>
  </package>

</struts>

访问Servlet API

虽然Struts 2提供了ActionContext来直接访问Servlet API。但有时你需要直接访问Sevlet API。为了在Action中能够直接访问Servlet API,Struts 2还提供了一系列的其他接口,通过实现这些接口,Action可以直接访问Servlet APi。

Struts 2框架提供的访问Servlet API的接口如下表所示:

方法 功能描述
ServletContextAware 实现该接口的Action可以直接访问Web应用的SevletContext实例
ServletRequestAware 实现该接口的Action可以直接访问用户请求的HttpServletRequest实例
ServletResponseAware 实现该接口的Action可以直接访问服务器响应的HttpSevletResponse实例

下面代码以实现SevletRequestAware接口为例,通过获取HttpSession,将登陆成功的用户名保存到Session中:

package com.qst.chapter03.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction4 extends ActionSupport implements ServletRequestAware {
  /* 用户名 */
  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;
  }

  //声明request对象
  private HttpServletRequest request;
  //重写ServletRequestAware中的方法
  public void setServletRequest(HttpServletRequest request) {
    this.request = request;
  }

  /**
   * 调用业务逻辑方法,控制业务流程
   */
  public String execute() {
    System.out.println("----登录的用户信息-----");
    System.out.println("用户名:" + userName);
    System.out.println("密码:" + password);
    if (userName.startsWith("qst") && password.length() >= 6) {
      // 获得session对象
      HttpSession session = request.getSession();
      //将用户名存放到session中
      session.setAttribute("CurUser", userName);
      // 返回成功页面
      return SUCCESS;
    } else {
      // 返回失败页面
      return ERROR;
    }
  }

  // 重写validate()方法
  public void validate() {
    // 简单验证用户输入
    if (this.userName == null || this.userName.equals("")) {
      // 将错误信息写入到Action类的FieldErrors中
      // 此时Struts 2框架自动返回INPUT视图
      this.addFieldError("userName", "用户名不能为空!");
      System.out.println("用户名为空!");
    }
    if (this.password == null || this.password.length() < 6) {
      this.addFieldError("password", "密码不能为空且密码长度不能小于6");
      System.out.println("密码不能为空且密码长度不能小于6!");
    }
  }

}

上述代码定义的LoginAction4 实现了SevletRequestAware接口,并且重写该接口中setServletRequest()方法,setServletRequest()方法的参数是HttpServletRequest对象,运行Web应用时,Struts 2框架会自动将当前请求对象传入setServletRequest()方法,再将该请求对象赋给LoginAction4的request属性,这样在LoginAction4类的其他方法中就可以访问到request对象了。通过request对象可以获取HttpSession对象,并将当前用户信息保存到Session中。

将login.jsp页面中表单的action属性改成login4.action:

...
<form action="login.action" method="post" name="logForm">
...

创建first.jsp显示用户信息:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<title>显示用户信息</title>
</head>
<body>
登录成功!欢迎用户${param.userName} <br/>
当前用户${session.CurUser } <br/>
<a href="second.jsp" rel="external nofollow" >下一页</a>
</body>
</html>

再创建一个second.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<title>显示用户信息</title>
</head>
<body>
请求中的用户信息:${param.userName} <br/>
Session中的用户信息:${session.CurUser }
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持敏而好学论坛/嗨学网。

原文地址是:http://www.piaodoo.com/thread-13232-1-2.html 丝袜控www.txdah.com 131www.buzc.org学习之外可赏心悦目有助更好地学习!

Struts 2 实现Action的几种方式_java - JAVA的更多相关文章

  1. JavaWeb_(Struts2框架)Struts创建Action的三种方式

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  2. Struts中的数据处理的三种方式

    Struts中的数据处理的三种方式: public class DataAction extends ActionSupport{ @Override public String execute() ...

  3. 实现Action的三种方式

    实现Action的三种方式: 1.普通类  一般采用此种方法 2.实现Action接口 3.继承ActionSupport类

  4. java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

    转载地址:http://www.devba.com/index.php/archives/4581.html java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明); ...

  5. (转)java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

    java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明);部分资料参考网络资源 1. java向MySQL插入当前时间的四种方式 第一种:将java.util.Date ...

  6. struts请求参数注入的三种方式

    .请求参数的注入 在Struts2框架中,表单的提交的数据会自动注入到与Action对象相对应的属性.它与Spring框架中的IoC的注入原理相同,通过Action对象为属性提供setter方法注入 ...

  7. SpringMVC实现Action的两种方式以及与Struts2的区别

    4.程序员写的Action可采用哪两种方式? 第一.实现Controller接口第二.继承自AbstractCommandController接口 5.springmvc与struts2的区别? 第一 ...

  8. 两种方式实现java生成Excel

    Web应用中难免会遇到需要将数据导出并生成excel文件的需求.同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此.本博文 ...

  9. 3种方式实现Java多线程

    java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...

随机推荐

  1. Dojo入门:DOM操作

      作为一款功能齐全的js工具包,dojo提供了统一的DOM操作方法. dojo.byId dojo.byId 函数使您可以通过 id 属性选择一个 DOM 节点.该函数是标准 document.ge ...

  2. select去掉默认样式

    今天遇到的问题,并在这里做一下记录和总结 去除select下拉框默认样式 select { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/ border: solid 1px ...

  3. Day05:访问控制 、 static和final

    访问控制 package(包) 什么是包? 组织java文件的一个单位 为什么需要包? 将相关的java文件组织在一个包里 将项目中同名的类,方法在不同包中,不会冲突 注意: 包名全部小写,如果多个单 ...

  4. C++类大小的计算

    这里记录一下怎么计算类对象的大小. 大概总结下,类的大小需要考虑以下内容: 非静态成员变量大小 数据对齐到多少位 有无虚函数(即需不需要指向虚函数表的指针,如果考虑继承的情况,则还需要看继承了多少个指 ...

  5. Shell编程、part3

    本节内容 1. shell流程控制 2. for语句 3. while语句 4. break和continue语句 5. case语句 6. shell编程高级实战 shell流程控制 流程控制是改变 ...

  6. 【Ruby on Rails 学习五】Ruby语言的方法

    1.方法的调用 2.自定义方法 3.带默认值的自定义方法 4.带返回值的自定义方法 方法或者说是函数,实际上是包含了一段代码,去执行某一个特定的过程. def add(a=3,b=2) return ...

  7. 华为HCNA乱学Round 2:路由基础

  8. 【VS开发】【智能语音处理】特定人语音识别算法—DTW算法

    DTW(动态时间弯折)算法原理:基于动态规划(DP)的思想,解决发音长短不一的模板匹配问题.相比HMM模型算法,DTW算法的训练几乎不需要额外的计算.所以在孤立词语音识别中,DTW算法仍得到广泛的应用 ...

  9. Hbase 0.92.1集群数据迁移到新集群

    老集群 hbase(main):001:0> status 4 servers, 0 dead, 0.0000 average load hbase(main):002:0> list T ...

  10. springboot2.0自适应效果错误响应

    实现效果当访问thymeleaf渲染页面时,显示的是自定义的错误页面 当以接口方式访问时,显示的是自定义的json数据响应 1. 编写自定义异常 package cn.jfjb.crud.except ...