`

Struts2.0 Action

阅读更多

有Struts 1.x经验的朋友都知道Action是Struts的核心内容,当然Struts 2.0也不例外。不过,Struts 1.x与Struts 2.0的Action模型很大的区别。

Struts 1.x Stuts 2.0
接口 必须继承org.apache.struts.action.Action或者其子类 无须继承任何类型或实现任何接口
表单数据 表单数据封装在FormBean中 表单数据包含在Action中,通过Getter和Setter获取

虽然,理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重载(Override)此类里的String execute()方法。具体的实现,如例1所示:

<% @ page contentType = " text/html; charset=UTF-8 " %>
<% @ taglib prefix = " s " uri = " /struts-tags " %>
< html >
< head >
< title > Hello World! </ title >
</ head >
< body >
< h2 >< s:property value ="message" /></ h2 >
</ body >
</ html >

例1 HelloWorld.jsp

package tutorial;

import java.text.DateFormat;
import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorld extends ActionSupport {
private String message;

public String getMessage() {
return message;
}


@Override
public String execute() {
message
= " Hello World, Now is " + DateFormat.getInstance().format( new Date());
return SUCCESS;
}

}

例1 classes/tutorial/HelloWorld.java

< package name ="ActionDemo" extends ="struts-default" >
< action name ="HelloWorld" class ="tutorial.HelloWorld" >
< result > /HelloWorld.jsp </ result >
</ action >
</ package >

例1 classes/struts.xml中HelloWorld Action的配置

在浏览器地址栏中键入http://localhost:8080/Struts2_Action/HelloWorld.action,可以看到如图1所示页面。

图1 HelloWorld输出页面
图1 HelloWorld输出页面

参考JavaDoc,可知ActionSupport类实现了接口:

默认情况下,当请求HelloWorld.action发生时,Struts运行时(Runtime)根据struts.xml里的Action映射集(Mapping),实例化tutoiral.HelloWorld类,并调用其execute方法。当然,我们可以通过以下两种方法改变这种默认调用。这个功能(Feature)有点类似Struts 1.x中的LookupDispathAction。

  1. 在classes/sturts.xml中新建Action,并指明其调用的方法;
  2. 访问Action时,在Action名后加上“!xxx”(xxx为方法名)。

实现方法请参考例2:

在classes/tutorial/HelloWorld.java中加入以下方法:

public String aliasAction() {
message
="自定义Action调用方法";
return SUCCESS;
}

例2 classes/tutorial/HelloWorld.java代码片段

实现方法一,在classes/sturts.xml中加入下面代码:

<action name="AliasHelloWorld" class="tutorial.HelloWorld" method="aliasAction">
<result>/HelloWorld.jsp</result>
</action>

例2 classes/struts.xml中AlaisHelloWorld Action的配置

实现方法二,使用http://localhost:8080/Struts2_Action/HelloWorld!aliasAction.action地址来访问HelloWorld Action。

在浏览器地址栏中键入http://localhost:8080/Struts2_Action/AliasHelloWorld.actionhttp://localhost:8080/Struts2_Action/HelloWorld!aliasAction.action,可以看到如图2所示页面。

图2 自定义Action调用方法页面
图2 自定义Action调用方法页面

通过上面的两个例子,细心的朋友应该可能会发现classes/tutorial/HelloWorld.java中Action方法(execute和aliasAction)返回都是SUCCESS。这个属性变量我并没有定义,所以大家应该会猜到它在ActionSupport或其父类中定义。没错,SUCCESS在接口com.opensymphony.xwork2.Action中定义,另外同时定义的还有ERROR, INPUT, LOGIN, NONE

此外,我在配置Action时都没有为result定义名字(name),所以它们默认都为success。值得一提的是Struts 2.0中的result不仅仅是Struts 1.x中forward的别名,它可以实现除forward外的很激动人心的功能,如将Action输出到FreeMaker模板、Velocity模板、JasperReports和使用XSL转换等。这些都过result里的type(类型)属性(Attribute)定义的。另外,您还可以自定义result类型。

下面让我们来做一个Velocity模板输出的例子,首先在classes/struts.xml中新建一个Action映射(Mapping),将其result类型设为velocity,如以下代码所示:

<action name="VMHelloWorld" class="tutorial.HelloWorld">
<result type="velocity">/HelloWorld.vm</result>
</action>

例3 classes/struts.xml中VMHelloWorld Action的配置

新建HelloWorld.vm,内容如下所示:

<html>
<head>
<title>Velocity</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<h2>Message rendered in Velocity: $message</h2>
</body>
</html>

例3 HelloWorld.vm

在浏览器地址栏中键入http://localhost:8080/Struts2_Action/VMHelloWorld.action,页面输出如下图3所示。

图3 HelloWorld.vm的输出页面
图3 HelloWorld.vm的输出页面

要运行例3需要在WEB-INF/lib中添加以下几个包:

前面,我花了不少的时间讨论Action的输出。我老板有句名言——程序无非就是输入、操作和输出。因此,现在我们要讨论一下输入——表单输入。

使用Struts 2.0,表单数据的输入将变得非常方便,和普通的POJO一样在Action编写Getter和Setter,然后在JSP的UI标志的name与其对应,在提交表单到Action时,我们就可以取得其值。

让我们看一个例子,新建Login Action,它通过Login.jsp的表单获得用户名和密码,验查用户名是否为“max”,密码是否则为“secret”。如果,两者都符合,就在HelloWorld中显示“Welcome, max”,否则显示“Invalid user or Password”。

package tutorial;

import com.opensymphony.xwork2.ActionSupport;

publicclass Login extends ActionSupport {
private String name;
private String password;
private String message;

public String getName() {
return name;
}


publicvoid setName(String name) {
this.name = name;
}


public String getPassword() {
return password;
}


publicvoid setPassword(String password) {
this.password = password;
}


public String getMessage() {
return message;
}


@Override
public String execute() {
if("max".equals(name) &&"Secret".equals(password)) {
message
="Welcome, "+ name;
}
else{
message
="Invalid user or password";
}

return SUCCESS;
}

}

例4 classes/tutorial/Login.java

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Login</title>
</head>
<body>
<s:form action="Login" method="POST">
<s:textfield name="name" label="User name"/>
<s:password name="password" label="Password"/>
<s:submit value="Submit"/>
</s:form>
</body>
</html>

例4 Login.jsp

<action name="Login" class="tutorial.Login">
<result>/HelloWorld.jsp</result>
</action>

例4 classes/struts.xml中Login Action的配置

运行Tomcat,在浏览器地址栏中键入http://localhost:8080/Struts2_Action/Login.jsp,出现如图4所示页面。

图4 Login.jsp输出页面
图4 Login.jsp输出页面

分别在User name中输入“max”和“secret”,点击“Submit”按钮,出现如图5所示页面。

图5 Login成功页面
图5 Login成功页面

在浏览器地址栏中键入http://localhost:8080/Struts2_Action/Login.jsp,分别在User name中输入“Scott”和“password”,点击“Submit”按钮,出现如图6所示页面。

图6 Login失败页面
图6 Login失败页面

Struts 2.0更厉害的是支持更高级的POJO访问,如user.getPassword()。我们可以用另一写法实现例4。首先,将name和password从Login类中分离出来,到新建类User中。这样对我们开发多层系统尤其有用。它可以使系统结构更清晰。

package tutorial;

import com.opensymphony.xwork2.ActionSupport;

publicclass LoginX extends ActionSupport {
private User user;
private String message;

publicvoid setUser(User user) {
this.user = user;
}


public User getUser() {
return user;
}


public String getMessage() {
return message;
}


@Override
public String execute() {
if("max".equals(user.getName()) &&"secret".equals(user.getPassword())) {
message
="Welcome, "+ user.getName();
}
else{
message
="Invalid user or password";
}

return SUCCESS;
}

}

例5 classes/tutorial/LoginX.java

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Login</title>
</head>
<body>
<s:form action="LoginX" method="POST">
<s:textfield name="user.name" label="User name"/>
<s:password name="user.password" label="Password"/>
<s:submit value="Submit"/>
</s:form>
</body>
</html>

例5 LoginX.jsp

<action name="LoginX" class="tutorial.LoginX">
<result>/HelloWorld.jsp</result>
</action>

例5 classes/struts.xml中的LoginX Action配置

很多时候我的同事会问我:“如果我要取得Servlet API中的一些对象,如request、response或session等,应该怎么做?这里的execute不像Struts 1.x的那样在参数中引入。”开发Web应用程序当然免不了跟这些对象打交道。在Strutx 2.0你可以有两种方式获得这些对象:非IoC(控制反转Inversion of Control)方式和IoC方式。

  1. 非IoC方式

    要获得上述对象,关键Struts 2.0中com.opensymphony.xwork2.ActionContext类。我们可以通过它的静态方法getContext()获取当前Action的上下文对象。 另外,org.apache.struts2.ServletActionContext作为辅助类(Helper Class),可以帮助您快捷地获得这几个对象。

    <u
    分享到:
    评论

相关推荐

    struts2.0中文教程

    03 Struts 2.0的Action讲解 04 在Struts 2.0中国际化(i18n)您的应用程序 05 转换器(Converter)——Struts 2.0中的魔术师 06 在Struts 2.0中实现表单数据校验(Validation) 07 Struts 2的基石——拦截器...

    Struts 2.0系列(MAX)

    Struts 2.0的Action讲解 在Struts 2.0中国际化(i18n)您的应用程序 转换器(Converter)——Struts 2.0中的魔术师 在Struts 2.0中实现表单数据校验(Validation) Struts 2的基石——拦截器(Interceptor) 在...

    Struts2.0视频教程+struts2.0中文教程

    Struts2.0是Java Web开发中的一个强大框架,它基于Model-View-Controller(MVC)设计模式,为开发者提供了构建可维护性高、结构清晰的Web应用程序的工具。这个"Struts2.0视频教程+struts2.0中文教程"包含的资源旨在...

    Struts 2.0的Action讲解

    与Struts 1.x相比,Struts 2.0的Action模型更加灵活,不再强制要求Action类必须继承特定的基类或实现特定接口。 在Struts 2.0中,Action类可以完全自定义,但为了方便开发,通常我们会选择继承`...

    struts2.0的特点

    在Struts2.0中,核心概念之一是Action,它被设计为一个简单的POJO(Plain Old Java Object),这使得Action的实现更加灵活和简洁。Action类不再需要继承特定的基类,而是通过配置文件(如struts.xml)来定义其行为。...

    Struts2.0的api

    首先,`Struts2.0中文教程.chm`可能包含对框架的详细解释,包括Action、Result、Interceptor等核心概念。Action是Struts2的核心,它是业务逻辑的载体,负责处理用户请求并返回相应的结果。Result是Action执行后的...

    Struts2.0 Jar包

    Struts2.0是一款强大的Java Web框架,它在MVC(Model-View-Controller)设计模式的基础上,提供了灵活且强大的架构来构建企业级的Web应用程序。这个“Struts2.0 Jar包”包含了所有必要的库文件,使得开发者可以便捷...

    初识[Struts2.0]并[使用Struts2.0]进行SSH集成

    1. **Action与结果**:Struts2.0中的Action类是处理用户请求的主要对象,每个Action对应一个业务逻辑。执行完成后,会返回一个结果,这个结果可以是另一个Action、JSP页面或者任何其他资源。 2. **配置灵活性**:...

    struts2.0jar包

    Struts2.0 jar包是Java Web开发中的一个重要组件,它是Apache Struts框架的一个特定版本。Struts2是一个基于MVC(Model-View-Controller)设计模式的开源框架,用于构建可维护性高、结构清晰的Java应用。该框架极大...

    三大框架中文文档中的struts2.0开发手册(程序员必看)

    1. **Action和结果类型**:Struts2.0中的Action类是处理用户请求的核心,每个Action对应一个业务逻辑。Action执行完毕后,会返回一个Result,定义了如何处理操作的结果,如转发到某个JSP页面或者进行其他操作。 2. ...

    Struts 2.0

    总之,Struts 2.0框架提供了强大的MVC支持,通过Action、配置文件和过滤器机制实现了对HTTP请求的处理,从而简化了Web应用程序的开发和维护。理解和掌握Struts 2的工作原理和配置方式,对于构建高效、可维护的Java ...

    struts 2.0 详细配置

    ### Struts 2.0 详细配置解析 #### 一、Struts 2.0 简介 Struts 2.0 是一个基于 Java 的开源框架,用于开发 Web 应用程序。它继承了 Struts 1.x 的优点,并在架构上进行了改进,更加灵活且易于扩展。Struts 2.0 ...

    struts 2.0

    1. **Action和Result**: 在Struts 2.0中,Action类是处理用户请求的核心组件。Action类继承自`com.opensymphony.xwork2.ActionSupport`,并覆盖或实现相应的业务方法。完成业务逻辑后,Action会返回一个结果(Result...

    struts2.0入门案例

    通过这个简单的入门案例,你可以了解到Struts2.0框架的基本使用流程,包括Action、配置、视图等关键概念。随着深入学习,你将能够掌握更多高级特性,如拦截器的自定义、动态方法调用、OGNL表达式等,从而更高效地...

    Struts2.0学习系列 以及 Struts2.0安装包

    同时,还需要在Web应用的WEB-INF目录下创建struts.xml配置文件,这是Struts2.0的入口点,用来配置Action及其相关设置。 学习Struts2.0的过程中,会涉及以下几个关键概念: 1. **Action类**:Action类是业务逻辑的...

    Struts 2.0全攻略之Struts 2.0参考手册

    ActionContext是Struts 2.0中的一个重要概念,它存储了Action执行时的上下文信息,包括请求、响应、session、application等域对象。 13. **S2-005安全漏洞** 虽然Struts 2.0功能强大,但历史上曾出现过如S2-005...

    struts2.0的 jar包和源文件

    Struts2.0 是一个非常流行的Java Web框架,它基于MVC(Model-View-Controller)设计模式,用于构建高效、可维护的企业级应用程序。这个压缩包包含了Struts2.0的核心jar文件以及可能的源代码,使得开发者可以直接查看...

    Struts 2.0 in Action

    ### Struts 2.0 in Action — 关键知识点解析 #### 一、Struts 2.0 概述 **Struts 2.0 in Action** 这本书深入介绍了Struts 2.0框架的核心概念及其应用实践。Struts 2.0是一个用于构建Java Web应用程序的开源框架...

    Struts_2.0从入门到精通

    CRUD(Create、Read、Update、Delete)是数据库操作的基础,Struts2.0通过一系列的Action和视图模板,实现了对数据库数据的增删改查操作。开发者可以基于Struts2.0提供的框架,快速构建出功能完备的数据管理界面。 ...

Global site tag (gtag.js) - Google Analytics