`
阅读更多

 

在说 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.3.1

    Struts2.2.3.1是Apache软件基金会下的一个开源框架,主要用于构建基于Java的Web应用程序。这个框架是MVC(模型-视图-控制器)设计模式的实现,极大地简化了开发流程,并且提供了丰富的功能来处理HTTP请求、表单提交...

    struts2.2必须jar包

    Struts2.2 必须的 JAR 包是开发基于Apache Struts 2.2框架的应用程序所需的核心库集合。Struts 2是一个流行的Java开源MVC(模型-视图-控制器)框架,用于构建企业级Web应用程序。它简化了开发流程,提供了一种结构化...

    struts2.2学习笔记

    本笔记主要探讨了Struts2.2的核心概念,包括Action、拦截器、过滤器、国际化以及struts.xml配置文件的解析,尤其是类型转换的细节。 在Struts2.2中,每个HTTP请求都会创建一个Action对象,与Servlet不同,Servlet在...

    Struts2.2 升级到Struts2.3

    Struts2.2到Struts2.3的升级是一个重要的更新过程,涉及到多个方面的改动和优化,包括性能提升、安全增强以及新特性的引入。在升级过程中,我们需要关注以下几个关键知识点: 1. **依赖包的更新**:Struts2.3.32...

    struts2.2 JAR包

    Struts2.2 JAR包是Java开发中的一个重要组件,它是Apache Struts框架的一个特定版本。Struts2是一个开源的MVC(Model-View-Controller)框架,用于构建基于Java的Web应用程序。这个框架旨在提供一种更高效、更灵活的...

    spring3.0+struts2.2+hibernate3.3集成.rar

    标题 "spring3.0+struts2.2+hibernate3.3集成.rar" 提供了一个关于企业级Java应用开发的集成框架的信息。描述中同样强调了这个主题,暗示了压缩包内可能包含了一个演示或教程,讲解如何将这三个流行的技术——Spring...

    Struts2.2-doc.zip

    struts2-bjsxt.doc 和 Struts2-shengsiyuan.doc 可能详细解释了Struts2.2的各个方面,包括但不限于Action配置、拦截器使用、结果映射、异常处理、国际化支持等内容。阅读这些文档可以帮助开发者更深入地了解Struts2...

    struts2.2.3.1 API帮助文档

    对于Struts2.2.3.1版本的API,我们可以通过以下几大方面来探讨其核心概念和功能: 1. **Action类**:在Struts2中,Action类是业务逻辑处理的核心,它继承自com.opensymphony.xwork2.ActionSupport类。开发者需要在...

    Struts2.2.1.1源码

    Struts2.2.1.1源码是一个重要的开源框架,它是Apache软件基金会下的一个项目,主要用于构建基于Java的企业级Web应用程序。这个源码版本包含了Struts2框架的核心功能和其他相关组件,为开发者提供了深入理解其工作...

    Struts2.2.4.1完整资源包

    Struts2.2.4.1 是一个流行的Java Web应用程序框架,它基于Model-View-Controller(MVC)设计模式,用于构建动态、数据驱动的Web应用。此完整资源包包含了许多必要的组件和文档,帮助开发者高效地开发企业级应用。 ...

    Struts2.2+Spring3JAR包

    Struts2.2和Spring3.0是两个非常重要的Java Web开发框架,它们在企业级应用中被广泛使用。这个"Struts2.2+Spring3JAR包"显然是一个集合了这两个框架所需库文件的压缩包,方便开发者进行快速集成和开发。 Struts2是...

    spring+struts2.2+JPA项目

    在本项目中,“spring+struts2.2+JPA”是一个典型的Java Web应用程序架构,它结合了Spring框架、Struts 2.2框架以及Java Persistence API(JPA)来构建一个高效、灵活且可扩展的后端系统。让我们详细探讨一下这三个...

    struts-2.2.3.1-lib.zip

    Struts 2.2.3.1 是一个流行的开源MVC框架,用于构建企业级Java Web应用程序。这个压缩包“struts-2.2.3.1-lib.zip”包含了Struts 2框架的库文件,这些文件对于理解和使用Struts 2框架至关重要。下面将详细解释其中...

    struts2.2,ssh

    1. **Action与结果**:Struts2.2中,Action类不再直接返回视图,而是返回一个Result对象,使得Action与视图之间的耦合度降低,增强了灵活性。 2. **拦截器(Interceptors)**:Struts2的核心组件之一,可以实现事务...

    struts2.2.1.1.chm帮助文档

    通过阅读Struts2.2.1.1.chm帮助文档,开发者可以深入了解这些特性的具体使用方法,包括Action配置、拦截器编写、结果类型定义、OGNL表达式运用等。此外,文档还包含详细的API参考,对每一个类和接口的功能、方法进行...

    struts2.2.3.1_API

    Struts2.2.3.1 API文档是一个重要的资源,对于深入理解和开发基于Struts2框架的应用程序至关重要。Struts2是一个流行的Java开源MVC框架,用于构建企业级Web应用程序。2.2.3.1是该框架的一个版本,包含了众多的改进和...

    Struts2.2.1.1说明文档

    Struts2.2.1.1是Apache软件基金会下的一个流行的Java Web开发框架,用于构建MVC(模型-视图-控制器)架构的应用程序。这个框架极大地简化了Java Web应用程序的开发过程,提供了丰富的功能和良好的可扩展性。在...

    struts2.2.1.1帮助文档——英文

    在Struts2.2.1.1中,你可以自定义Action类,继承自`org.apache.struts2.dispatcher.ng.ExecuteOperations`或实现`com.opensymphony.xwork2.Action`接口。 3. **配置文件**:Struts2的配置通常在`struts.xml`文件中...

    spring2.5+struts2.2+hibernate3.2帮助文档(chm格式)

    《Spring2.5+Struts2.2+Hibernate3.2综合指南》 在软件开发领域,Spring、Struts和Hibernate这三大框架是Java企业级应用的基石,它们各自负责不同的核心职责,协同工作,构建出高效且可扩展的系统。本资料集合了...

    Spring之Spring2.5集成Struts2.2

    标题“Spring之Spring2.5集成Struts2.2”涉及到的是在Web开发中整合两个非常流行的开源框架——Spring和Struts2的过程。这个过程旨在利用Spring的强大IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented ...

Global site tag (gtag.js) - Google Analytics