`
healthandbeauty
  • 浏览: 168132 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

WebWork介绍-Action篇

阅读更多
Action简介
Action在MVC模式中担任控制部分的角色, 在WebWork中使用的最多,用于接收页面参数,起到对HttpRequest判断处理作用。每个请求的动作都对应于一个相应的Action,一个Action是一个独立的工作单元和控制命令,它必需要实现XWork里的Action接口,实现Action接口的execute()方法。Action接口的代码如下:

package com.opensymphony.xwork;
 
import java.io.Serializable;
 
public interface Action extends Serializable {
    
    public static final String SUCCESS = "success";
    public static final String NONE = "none";
    public static final String ERROR = "error";
    public static final String INPUT = "input";
    public static final String LOGIN = "login";
    
    public String execute() throws Exception;
}



excute()方法是Action类里最重要的部分,它执行返回String类型的值,代表在页面执行完后的结果,在Action中返回的值一般使用它上面定义的标准静态字符常量。它有五种状态:

1.SUCCESS:Action正确的执行完成,返回相应的视图;
2.NONE:表示Action正确的执行完成,但并不返回任何视图;
3.ERROR:表示Action执行失败,返回到错误处理视图;
4.INPUT:Action的执行,需要从前端界面获取参数,INPUT就是代表这个参数输入的界面,一般在应用中,会对这些参数进行验证,如果验证没有通过,将自动返回到该视图;
5.LOGIN:Action因为用户没有登陆的原因没有正确执行,将返回该登陆视图,要求用户进行登陆验证。

下面我们将以一个用户注册的例子详细介绍Action的原理:
功能描述:一个用户注册页面register.jsp,用户可以在这个页面里输入用户注册的基本信息(例如:姓名、密码、Email等),输入完成提交表单,执行用户注册的Action,执行成功返回成功提示的页面(register-result.jsp)并将注册的信息输出。
流程如下:
Register.jsp
Action
校验
登录
Service
业务处理
DAO
数据处理


模型:User.java                      
控制:RegisterAction.java
视图:register.jsp、register-result.jsp
配置:xwork.xml

User.java:
 
package register;
 
public class User {
    private String username;
    private String password;
    private String email;
    private int age;
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
……
    
    public int getAge() {
        return age;
    }
 
    public int setAge(int age) {
        this.age = age;
    }
    
    public String toString(){
    return "username=" + username
         + ";password=" + password
         + ";email=" + email
         + ";age=" + age;
    }
}


模型User是一个普通的JavaBean,它包含了用户注册的字段信息,并对每个字段提供相应的set和get方法。下面我们来看看进行用户注册动作的RegisterAction.java:

package example.register;
 
import com.opensymphony.xwork.Action;
 
/**
 * @author babydavic-qac
 *         achqian@yahoo.com.cn
 */
public class RegisterAction implements Action {
    
    private User user= new User();
 
    public User getUser(){
        return this.user;
    }
    
    public String execute(){
        
        System.out.println("Start execute 。。。。。。。。。。。。。");
        System.out.println("User="+user);
        //在这里调用用户注册的业务逻辑,比如:将注册信息存储到数据库
    
        return SUCCESS;
    }
}

这个Action是不是特清爽?用户注册就这么几行代码搞定,当然,我们提倡在Action里最好不要实现业务代码,业务代码编写在service.java里面,Action的主要功能是提供从请求中取得参数的值,转化成相应的模型,再将模型传递给执行业务操作的对象,比如:将注册的用户信息存储到数据库中,由业务对象执行业务操作,再返回执行的结果。为了简化我们省去了注册的业务逻辑执行步骤

再看看我们注册信息输入的页面:register.jsp
<html>
<head><title>Register Example</title></head>
<body>
<table border=0 width=97%>
<tr><td align="left">
    <form name="register" action="register.action" method="post">
        Username:<input type="text" name="user.username"><br>
        Password:<input type="text" name="user.password"><br>
        Email:<input type="text" name="user.email"><br>
        Age:<input type="text" name="user.age"><br>
        <input type="submit" name="Submit"><br>
    </form>
</td></tr>
</table>
</body>
</html>


register.jsp页面其实只是一个普通的HTML页面,它提供了一个表单,用来接受用户输入的注册信息,它唯一特殊的部分就是input输入框定义的name部分,例如:用户姓名用的是“user. username”。这种命名方式代表什么含义?它是必需的吗?后面我们将会给出答案。
RegisterAction正确执行完成之后,会将执行的结果返回到register-result.jsp页面,由它来显示用户在前面页面输入的注册信息。register-result.jsp代码如下:
<%@ taglib prefix="ww" uri="webwork" %>
<html>
<head><title>Register result</title></head>
<body>
    <table border=0 width=97%>
        <tr>
            <td align="left">
            Congratulation,your register success!<p>
            Username:<ww:property value="user.username"/><br>
            Password:<ww:property value="user.password"/><br>
            Email:<ww:property value="user.email"/><br>
            Age:<ww:property value="user.age"/><br>
            </td>
        </tr>
    </table>
</body>

这个Jsp页面使用了WebWork的标签库 <ww:property />,记得HelloWorld里的greetings.jsp吗?它也使用了这个标签库。我们看这个:<ww:property value="user.username"/>
它是一个普通的使用标签库语句,查看这个标签库的源程序,见包
com.opensymphony.webwork.views.jsp里的PropertyTag.java文件,你会发现这个类会根据value后面赋予的表达式值,去OgnlValueStack里查找这个表达式值所对应的操作。执行这个语句OgnlValueStack会根据value的值(一个表达式)“user.username”去分别调用RegisterAction类的getUser()和User类的getUsername()方法,即:getUser().getUsername(),取得的数据就是前面注册页面输入的用户名。
我们把“user.username”这样的语句叫做表达式语言(Expression Language,简称为EL)。它由XWork框架提供,XWork表达式语言的核心是OGNL(Object Graph Notation Language),OGNL是一种功能强大,技术成熟,应用广泛的表达式语言,将在下面的章节有详细介绍。

我们在回到前面介绍的register.jsp,Input输入框
<input type="text" name="user.username">里用的“user.username”,现在我们可以明白,它不是随意设置的,它是一个表达式语言,有着特殊的功能。看到这里,不知道你心中是否有一个疑问:我们的RegisterAction是如何取得用户注册页面输入的数据呢?如果你做过Web开发,你一定会想到RegisterAction里必需有一些从客户端请求中获取参数的语句,例如:类似:String username = request.getParameter(“user. username”)的语句(request是HttpServletRequest的对象),去从request请求里面获取用户输入的参数值。可是我们这个Action里面只有User对象简单的get方法,并没有其它的代码。Xwork框架的Action是如何去实现了与Web无关?request请求的参数是怎么传递到我们Action的模型User中呢?

在回答答案之前,我们先看一看Xwork的配置文件xwork.xml:
<action name="register" class="example.register.RegisterAction" >
        <result name="success" type="dispatcher">
            <param name="location">/register-result.jsp</param>
        </result>
        <interceptor-ref name="params"/>
</action>

看了前面的介绍,这段配置文件应该不难理解。用户通过注册页面register.jsp输入自己的注册信息,提交表单到动作register.action,它将有ServletDispatcher调度,从配置文件xwork.xml里查找与“register”匹配的Action名字,即上面配置的Action。通过这个名字XWork框架找到这个Action的类:example.register.RegisterAction,XWork框架会负责去创建这个Action类的对象并调用execute()方法进行用户注册操作。正确执行execute()方法返回String类型数据“success”之后,它会请求再派遣到register-result.jsp页面。
在这段配置文件里,你一定注意到了它特殊的一句:<interceptor-ref name="params"/>,interceptor-ref标签设置这个Action用到的拦截器(Interceptor),“params”引用的是配置文件中的<interceptor name="params" class="
com.opensymphony.xwork.interceptor.ParametersInterceptor"/>,这个拦截器将在RegisterAction的execute()方法执行之前调用,作用是将request请求的参数值通过表达式语言设置到相应RegisterAction的模型里。例如:register.jsp里的<input type="text" name="user.username">,它输入的值会由RegisterAction类的getUser()和User类的setUserName(“…”)设置到这个User模型里。假设你在注册页面输入用户名“babydavic”,提交表单ParametersInterceptor就会下面的操作:首先从请求中取得参数的名字和名字对应的值,分别为:“user.username”和“babydavic”,根据这个名字,从OgnlValueStack中取得堆栈最上面的getUser().setUsername(“babydavic”)操作,即取得RegisterAction对象的User模型,并设置username属性的值为“babydavic”。
原来,我们的Action是通过XWork的拦截器ParametersInterceptor从提交的表单中取得请求的参数和值,再通过OgnlValueStack来执行表达式,调用Action和模型里相应的ge或set方法,将从请求中取得的值设置到模型中去。register.jsp中Input输入框的name="user.username"是必需要遵守OGNL的命名规则。也正是很多拦截器的使用,使得我们的Action类和Web实现了完全的解耦,让我们的Action能如此的简单、优雅,拦截器的原理后面章节我们也将会有详细的介绍。

Field-Driven Action vs. Model-Driven Action(红色代码部分就代表两种类型的不同之处)
Action根据FormBean的不同可以分为二类,
一类是Field-Driven(字段驱动的)Action
   Action将直接用自己的字段来充当FormBean的功能,我们的例子就是使用这种方式。它一般用在页面表单比较简单的情况使用,而且可以直接用域对象作为Action的字段,这样就不用在另写FormBean,减少了重复代码。
另一类是Model-Driven(模型驱动的)Action
它很像Struts的FormBean,但在WebWork中,只要普通Java对象就可以充当模型部分。Model-Driven(模型驱动的)Action要求我们的Action实现com.opensymphony.xwork. ModelDriven接口,它有一个方法:Object getModel();,我们用这个方法返回我们的模型对象就可以了。
我们可以将前面的RegisterAction.java改为Model-Driven(模型驱动的)Action:
package example.register;

import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.ModelDriven;

/**
* @author moxie-qac
*         achqian@yahoo.com.cn
*
*/
public class RegisterActionModel implements Action,ModelDriven{
    private User user = new User();
   
    public String execute() throws Exception {
        System.out.println("Start execute......。。。。。。。。。。。。。。");
        System.out.println("User="+user);
        //在这里调用用户注册的业务逻辑,比如:将注册信息存储到数据库
   
        return SUCCESS;
    }
   
    public Object getModel() {
        return user;
    }
}
这时我们输入信息的页面也有了变化:register-model.jsp
<html>
<head><title>Register Example</title></head>
<body>
<table border=0 width=97%>
<tr><td align="left">
    <form name="register" action="registerModel.action" method="post">
        Username:<input type="text" name="username"><br>
        Password:<input type="text" name="password"><br>
        Email:<input type="text" name="email"><br>
        Age:<input type="text" name="age"><br>
        <input type="submit" name="Submit"><br>
    </form>
</td></tr>
</table>
</body>
</html>
我们发现,输入框里的命名发生了变化。它们都少了“user.”这部分信息。
当我们采用Model-Driven(模型驱动的)Action时,它将取得模型对象保存在值堆栈中。“name="username"”就是代表直接调用模型对象的setUsername()方法。
我们Action的在配置文件中,也要给它指定一个拦截器model-driven,它的作用就是将模型对象保存到值堆栈中。关于拦截器的介绍请看下面的章节。
配置文件如下:
<action name="registerModel" class="example.register.RegisterActionModel">
        <result name="success" type="dispatcher">
            <param name="location">/register-result-model.jsp</param>
        </result>
        <interceptor-ref name="model-driven"/>
        <interceptor-ref name="params"/>
    </action>
分享到:
评论

相关推荐

    webwork之HelloWorld篇

    "webwork之HelloWorld篇"是入门WebWork框架的一个基本教程,通常包括创建一个简单的Web应用程序并展示“Hello, World!”的输出。 在Eclipse中创建一个Hello Web工程,首先你需要安装必要的插件,如JSTL和MyEclipse...

    [教學 - 入門篇] WebWork 2

    【教学 - 入门篇】WebWork 2 是一篇针对初学者介绍WebWork框架的教程。WebWork是一个基于Java的Model-View-Controller (MVC) 框架,它提供了一系列强大的特性来帮助开发者构建高效、可维护的Web应用程序。 ### 主要...

    WebWork In Action

    总结,《WebWork In Action》这本书全面介绍了WebWork框架的各个方面,从基本概念到高级特性,从实战技巧到最佳实践,对于想要掌握或深入了解WebWork的开发者来说,是一本不可多得的参考资料。通过学习WebWork,...

    webwork介绍文档+专家评论

    而"webwork & struts.txt"可能是一篇对比WebWork和Struts的文章,分析两者的特点、优缺点以及适用场景,有助于读者做出更适合自己的技术选择。 通过深入阅读这些资源,开发者可以全面了解WebWork2的架构、功能和...

    WebWork文档(PDF)

    这篇文档详细介绍了WebWork的技术细节和使用方法。 1. **MVC模式** MVC模式是WebWork的基础,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。模型负责处理业务逻辑,视图负责...

    java私塾][Spring讲解+webwork2整合+webwork2整合全套

    根据提供的文件信息,我们可以推断出这是一篇关于Java私塾中的Spring框架讲解与WebWork2整合教程的文章。下面将围绕这些关键词展开详细的讲解。 ### Spring框架基础 #### Spring简介 Spring是一个开源框架,最初由...

    webwork 入门学习

    本篇将围绕"WebWork入门学习"这一主题,深入讲解WebWork的核心概念、基本架构以及如何使用WebWork进行Web项目开发。 一、WebWork简介 WebWork由Apache软件基金会维护,其设计理念是通过减少样板代码和提供强大的...

    webwork的api

    在本篇文章中,我们将深入探讨WebWork API的主要组件和它们在实际开发中的应用。 1. **Action**:WebWork的基础是Action类,它是处理用户请求的核心。Action类通常会实现com.opensymphony.webwork.action.Action...

    webwork类型转换入门一

    本篇将介绍WebWork的基础知识,特别是它的类型转换机制,这对于理解Web应用程序中的数据处理至关重要。 WebWork的核心特性之一是其强大的类型转换系统,它允许开发者从HTTP请求参数自动转换为Java对象的属性。这种...

    webWork2.2+spring +SpringMVC组合 例子

    这样的组合可以充分利用各框架的优势,如WebWork的Action管理、Spring的依赖注入和事务管理以及Spring MVC的MVC架构。 【描述】:这个项目旨在帮助开发者了解和学习如何在实际开发中结合使用这三个框架。WebWork2.2...

    webwork学习文档

    这篇文档将深入探讨WebWork的核心概念、配置以及其与其他工具的集成。 **一、WebWork框架基础** WebWork的核心设计理念是解耦业务逻辑和表现层,通过Action类实现业务处理,通过JSP或FreeMarker等模板技术处理视图...

    Spring+Webwork+iBatis 组合实例

    本篇将结合具体的配置文件来详细介绍这三个框架是如何协同工作的,以及它们各自在项目中的作用。 #### 二、Spring框架简介 Spring框架是一个开源的轻量级Java开发框架,它为Java应用程序提供了一个全面的编程和...

    Struts 2权威指南--基于WebWork核心的MVC开发

    WebWork是Struts 2的前身,其核心理念是Action,Action是处理用户请求的核心组件。Struts 2继承了WebWork的Action概念,并在此基础上进行了扩展,提供了更强大的功能,如拦截器(Interceptors)和动态方法调用...

    STRUTS和WEBWORK在VALIDATE的区别

    3. 验证与业务逻辑的耦合度:STRUTS的验证通常与业务逻辑分离,WebWork允许将验证集成到Action类中,耦合度相对较低。 4. 标准支持:WebWork支持JSR-303/JSR-349,使得开发者可以利用Java标准的验证库,如Hibernate...

    webwork 多文件上传

    本篇文章将深入探讨如何在WebWork框架下实现多文件上传,并结合实际案例进行解析。 首先,了解WebWork框架的基本原理是必要的。WebWork通过Action类处理HTTP请求,它将用户交互与业务逻辑分离,提供了一种优雅的...

    基于webWork的MVC入门例子

    本篇文章将带你入门基于WebWork的MVC应用,以"struts2Demo"为例,解析其基本结构和工作原理。 **一、WebWork MVC框架简介** WebWork的核心理念是解耦视图、模型和控制,提高代码的可维护性和可重用性。它通过...

    浅析webwork

    本篇文章将深入探讨WebWork的核心概念、主要特性以及其与现代Web框架的对比。 首先,WebWork的核心思想是通过Action类来处理用户请求,并将业务逻辑与表现层分离。Action类是WebWork中的关键组件,它接收HTTP请求,...

    Struts2权威指南--基于WebWork核心的MVC开发(我自己敲的代码)

    这篇博客“Struts2权威指南--基于WebWork核心的MVC开发”可能深入探讨了如何利用Struts2进行Web开发,并结合WebWork的核心特性来构建高效、可维护的应用程序。 1. **Struts2框架概述**: Struts2是Apache软件基金...

Global site tag (gtag.js) - Google Analytics