`
阅读更多

 

在说 Struts2 中的 Action 时,我们首先来说一下 Struts1 中的 ActionForm ,大家知道在 Struts1 中, ActionForm 本身是一个抽象类,若想将客户端提交的信息自动变成对象赋予到 Java 类中就必须提供一个自定义类,让它继承 ActionForm ,并提供相应的属性,然后自动 set get Formbean 总是与我们自定义的 JavaBean 有些重复,这就有点冗余的感觉。在 Struts2 中就取消了 ActionForm ,它直接用一个 Action 来实现 ActionForm 的功能,客户端提交的信息,如 name ,它会自动调用 Action setName() 赋值到 name 属性中。

那么我们来说说 Struts2 中的 Action,Action Struts2 的核心组件,是 MVC 模型中的粘贴剂,通过下图可以发现。

 

action作用

 

 

那么我们把 Action Servlet 模式对比一下,如下图:

actionVsServlet

 

 

结合上图,我们对 Struts2 运行过程进行说明:

1 HttpRequest struts2 的内置核心过滤器 Filterdispather 拦截

2 Struts 根据 url 查找并创建 Action 对象,并且将 Request Parameters 设置到 Action Property

3 Struts 调用 Action execute 方法将调用业务逻辑并返回适合的结果视图名称

4 Struts Action Property 封装为 ValueStack ,然后将 Request 转发到 JSP 页面

5 JSP 页面取得 ValueStack 值,并输出 HTML

 

注意:

invoke 方法和 Servlet 过滤器中调用 FilterChain.doFilter 方法类似,如果在当前拦截器后面还有其他的拦截器,则 invoke 方法就是调用后面拦截器的 intercept 方法,否则, invoke 会调用 Action 类的 execute 方法 ;

execute 方法又类似 Servlet 中的 service 方法

 

Action 三大作用:

         1 、封装对请求的实际处理

                   Action 类似于 Servlet ,但封装性更高

                   Struts2 实现了 Action 与请求响应对象间的解耦,分离了 Action Request/Response 的关联

         2 、承载用户请求与结果视图的数据

                   Action 可以自动接收表单数据

                   在结果视图( JSP )中可以获取 Action 中的数据

         3 、选择响应的结果视图

                   根据业务逻辑的处理结果选择适当的结果视图

 

Ok ,那来说说 Struts1 Struts2 Action 的不同:

1 Struts1.X 就只有一个 Action ,它是单例的,因此它里面不能放置存储状态性的东西;

2 Struts2 在默认情况下,每发送过来一次请求,它都会生成一个 Action 实例,因此 Struts2 的请求之间是独立的互不干扰的,因此它是线程安全的。

         所以在 Struts2 中只要类包含返回 string 类型的 execute 的无参方法,那么他就可以作为 Struts2 Action

 

模型驱动:

要想实现模型驱动,必须要实现 ModelDriven 接口

ModelDrivenAction 类的执行流程是:

1 、调用 getModel() 方法得到 User 对象

2 、根据 JavaBean 的原则将客户端传过来的属性,一个一个的 set User 对象的属性中

         3 、将属性全部 set 完之后,再执行 execute() 方法。

一般不推荐使用模型驱动,而使用属性驱动。

Demo

ModelDrivenAction.java:

public class ModelDrivenAction implements ModelDriven { 
    public String execute() throws Exception {
        return SUCCESS;
    }

    public Object getModel() {
        return new Gangster();
    }
}

 

Gangster.java

public class Gangster implements Serializable {
    private String name;
    private int age;
    private String description;
    private boolean bustedBefore;

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public boolean isBustedBefore() {
        return bustedBefore;
    }
    public void setBustedBefore(boolean bustedBefore) {
        this.bustedBefore = bustedBefore;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

 

Jsp:

<s:form action="modelDrivenResult" method="POST" namespace="/modelDriven">   
    <s:textfield label="Gangster Name" name="name" />
    <s:textfield label="Gangster Age"  name="age" />
    <s:checkbox  label="Gangster Busted Before" name="bustedBefore" />
    <s:textarea  cols="30" rows="5" label="Gangster Description" name="description" />           
    <s:submit />
</s:form>

 

Action Chaining

<package name="public" extends="struts-default">
    <!-- Chain creatAccount to login, using the default parameter -->
    <action name="createAccount" class="...">
        <result type="chain">login</result>
    </action>

    <action name="login" class="...">
        <!-- Chain to another namespace -->
        <result type="chain">
            <param name="actionName">dashboard</param>
            <param name="namespace">/secure</param>
        </result>
    </action>
</package>

<package name="secure" extends="struts-default" namespace="/secure">
    <action name="dashboard" class="...">
        <result>dashboard.jsp</result>
    </action>
</package>

 

 

属性驱动 Demo

UserAction.java

package org.lxh.action;
import java.text.DateFormat;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @author xudongwang 2011-5-12
 *
 */
public class UserAction {
	private String message;
	private String userName;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	public String hello() {
		message = "欢迎使用Struts2!!,Now is [" + DateFormat.getDateInstance().format(new Date())+"]";
		return ActionSupport.SUCCESS;
	}
	public void execute() {
		System.out.println("***********" + userName);
	}
}

 

 

说明:

         execute 方法是 Action 默认的执行方法,在方法内调用业务逻辑,封装请求和视图结果数据,返回结果视图;

         同时上面的 return ActionSupport.SUCCESS; 可以改为 return "success"; 的这里的 success 要与 Struts.xml 中的 result 中的 name 对应,所以是小写的,同时其他的值还有: ERROR ,错误、 INPUT ,输入、 LOGIN ,登陆、 NONE ,空、 SUCCESS ,成功;

         注意上面的 return "success"; 中的 success 是可以任意定义的,只要和 Struts.xml 中的 result 中的 name 对应即可

 

Struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="user" extends="struts-default">
<action name="helloworld" class="org.lxh.action.UserAction" method="hello">
	<result name="success" type="plainText">/hello_struts2.jsp</result>
</action>
</package>
</struts>
 

 

index.jsp:

<a href="helloworld.action">Hello World</a>

 

hello_struts2.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>...
<s:property value="message"/>
 

 

说明:

         <s:property value="message"/> 中的 message 是从 valueStack 中拉数据,而在 action 中的属性是 javaBean 属性保存数据,而 return SUCCESS 是控制字符串将去选择结果 resulst

 

补充:

Action 中的可选接口

         1 com.opensymphony.xwork2.Action;

                   此接口定义了 Action 的默认规则;

                   a Action 类中默认存在 execute 方法

                   b 、并不要求 Action 类对此接口显示的 implements

                   c 、可以使用 <action> 标签的 method 属性指定其他的处理方法名

                   此接口还定义了常用结果视图的名称:

                            a ERROR ,错误

                            b INPUT ,输入

                            c LOGIN ,登陆

                            d NONE ,空

                            e SUCCESS ,成功

         2 com.opensymphony.xwork2.ActionSupport

                   Action 的辅助工具类

                   通常由 Action extends 此工具类

                   Action 类提供 Struts2 的常用功能

                            getText :用于国际化,根据 key 从资源文件中加载文本

                            validate :在 Action 类中重写此方法以实现数据校验

                            addActionError :添加一个 Action 错误

                            addFieldError :添加一个表单项错误

 

         3 com.opensymphony.xwork2.ActionContext

                   Action 上下文工具类

                   提供访问各个 web 作用域键值 Map 的能力

                   getContext() :静态方法,获得当前 Action 对应的 ActionContext 对象

                   getApplication(): 获取 application 作用域的 map

                   getSession(): 获取 session 作用域的 map

                   getParameters(): 获取 request 表单的 map

                   getValueStack(): 取得 OGNL ValueState ,它实际上是打对 request 作用域 map 的封装

 

         4 org.apache.struts2.ServletActionContext

                   ServletContext 辅助工具类

                   通过一系列静态方法提供对 Servlet 对象的访问

                   getRequest(): 获取 HttpServletRequest 对象

                   getResponse(): 获取 HttpServletResponse 对象

                   getServletContext(): 获取 ServletContext 对象

                   getRequest().getSession: 获取 HttpSession 对象

 

 

 

 

  • 大小: 19.5 KB
  • 大小: 21.8 KB
分享到:
评论

相关推荐

    struts2.2学习笔记

    struts2.2学习笔记总结,action,拦截器,过滤器,国际化,struts.xml解析等的总结。

    Struts2 in action中文版

    2.2 简单的HelloWorld示例 20 2.2.1 部署示例应用程序 20 2.2.2 探索HelloWorld应用程序 24 2.3 使用注解的HelloWorld 31 2.4 小结 33 第二部分 核心概念:动作、拦截器和类型转换 第3章 使用Struts 2动作 36 3.1 ...

    struts2-junit-plugin-2.2.1.1.jar

    struts2-junit-plugin-2.2.1.1.jar

    Struts2漏洞检查工具2019版 V2.3.exe

    S2-048 CVE-2017-9791 Struts 2.3.X http://127.0.0.1:8090/struts2-showcase/integration/saveGangster.action 影响范围非常小 S2-046 CVE-2017-5638 Struts 2.3.5-2.3.31,Struts 2.5-2.5.10 ...

    Struts in Action中文版

    2.6.2. Struts的强项........................................................................................................58 Struts in Action 中文版 Lastest Revised:10/14/2005 10:27:00 AM ...

    struts2-spring-plugin-2.2.1.1.jar

    Struts2 与Spring 结合,使用Spring 来管理Action 实例

    Struts中文手册[文字版][中文]

    2.2. 逻辑标记.16 2.2.1. 条件逻辑.17 2.2.2. 重复标记.18 2.2.3. 转发和重定向标记.19 2.3. HTML 标记20 2.3.1. 显示表单元素和输入控件.20 a) 表单标记.21 b) 按钮和取消标记.22 c) 复位和提交标记.22 d) 文本和...

    Struts框架及标记库

    1 Struts框架 3 ...2.1.2.2 重复标记 19 2.1.2.3 转发和重定向标记 20 2.1.3 HTML标记 21 2.1.3.1 显示表单元素和输入控件 21 2.1.3.2 显示错误信息的标记 25 2.1.3.3 其他HTML标记 26 2.1.4 模板标记 26

    struts项目搭建

    好了废话少说,进入正题,截止写稿时间struts最新版本是2.3,不过是12月12日发布的(2011年),为了稳定起见,我使用的版本是struts-2.2.3.1本文分为以下几个部分: 一、搭建开发和运行环境 1、到Apache下载Strut包...

    struts2讲义_吴峻申

    9.2.2 Struts2Action范围属性文件国际化应用 187 9.2.3 Struts2临时范围属性文件国际化应用 188 9.3 用户主动选择国际化应用介绍 191 第10章 Struts2页面布局实现 194 10.1 sitemesh基本使用方法 194 10.2 sitemesh...

    Struts2漏洞检查工具2018版.exe

    2018-08-24: 增加S2-057 Struts 2.3 to 2.3.34,Struts 2.5 to 2.5.16 此漏洞影响范围...S2-005 CVE-2010-1870 Struts 2.0.0-2.1.8.1 http://struts.apache.org/release/2.2.x/docs/s2-005.html 未添加,S2-016范围内

    Struts2.rar

    S2-048 CVE-2017-9791 Struts 2.3.X http://127.0.0.1:8090/struts2-showcase/integration/saveGangster.action 影响范围非常小 S2-046 CVE-2017-5638 Struts 2.3.5-2.3.31,Struts 2.5-2.5.10 ...

    struts in Action

    2.2. 为什么我们需要Struts .......................................................................................38 2.2.1. 退一进三........................................................................

    Java/jsp编辑开发工具FirstJava2.2完整版

    2.Struts action向导: 根据jsp文件中的表单内容自动生成的form类和action类的代码. 并修改struts-config.xml配置文件. 3.直接创建action类,自动生成action类的代码.并修改struts-config.xml配置文件. 与2.2版相比...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发容器 2.5 小结 第二篇 建立和使用J2EE的开发平台 第...

    深入浅出Struts2(附源码)

    2.2 Struts的动作处理流程 15 2.3 拦截器 17 2.4 Struts配置文件 18 2.4.1 struts.xml文件 19 2.4.2 struts.properties文件 26 2.5 Struts应用程序示例 26 2.5.1 部署描述文件和Struts配置文件 27 2.5.2 动作...

    Struts2 入门培训

    4 1.3.2. 受控目录 5 2. 入门例子 5 2.1. 项目 5 2.2. 在WEB.XML中,配置FILTERDISPATCHER过滤器 6 2.3. 配置STRUTS.PROPERTIES 6 2.4. 编写一个简单的ACTION类 7 2.5. STRUTS.XML配置文件 8...

    OpenID简介及与struts2_spring_hibernate框架集成

    3.2. Struts2的Action调用业务逻辑 - 19 - 3.2.1. 登录Action--OpenIDLoginAction - 19 - 3.2.2. 进入的Action—FirstPageAction - 20 - 3.3. JSP页面 - 20 - 3.4. 运行示例 - 21 - 3.4.1. 登录 - 21 - 3.4.2. ...

    structs程序设计从入门到精通word文档

    2.2 Struts原理、开发及项目实施 8 2.3使用STRUST控制流 8 2.4讨论STRUTS的优缺点 9 2.5 Struts入门经验 9 2.6用strtus制作登陆页面: 9 第3章Struts 基础学习 9 3.1Struts标记库 9 3.2Struts框架基础篇 9 3.3Struts...

Global site tag (gtag.js) - Google Analytics