webwork教程 3

style="WIDTH: 345px; HEIGHT: 285px" align="left" marginwidth="0" marginheight="0" src="http://www.ymfund.com/web/ad.html" frameborder="0" width="468" scrolling="no" height="60">

Actions和Results


    Actions是执行的基本单元。Action是一个在 WebWork配置之中被注册的类,来响应一个特定的请求。在Model-View-Controller(MVC)中,Actoin作为Controller的部分,JSP页面则作为:View。
    下面的步骤是在WebWork中创建一个Action的可能方法:
    1. 创建一个将会调用Action的JSP页面;
    2. 创建Action类;
    3. 创建一个将会处理Result的JSP页面;
    4. 在xwork.xml中注册Action。
    在本教程中的第一个例子正是“Hello,WebWork!”。下面的代码显示了在WebWork的配置文件xwork.xml中对于在default包下的一个Action。

xwork.xml

<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
    <!-- Include webwork defaults (from WebWork JAR). -->
    <include file="webwork-default.xml" />

    <!-- Configuration for the default package. -->
    <package name="default" extends="webwork-default" />

        <!-- Default interceptor stack. -->
        <default-interceptor-ref name="defaultStack" />

        <!--Action: Lesson 03:HelloWebWorkAction. -->
        <actoin name=”helloWebWork” class="lesson03.HelloWebWorkAction">
            <result name="success" type="dispatcher">ex01-success.jsp</result>
        </action>
    </package>
</xwork>

    别担心关于default-interceptor-ref那部份。现在,我们只对Action感兴趣。这个配置文件告诉WebWork这里有个以 helloWebWork命名的Action,它将通过lesson03.HelloWebWorkAction来实现。对于这个Action,我们在其 下定义了一个名为success的Result,它指向网页ex01-success.jsp。

☆更多关于:xwork.xml

    让我们来看一看调用Action的代码,这样比较清楚:

<html>
    <head><TITLE>WebWork Tutorial - Lesson 3 - Exaple 1</TITLE></head>
    <body>
        <p>Click the button below to activate HelloWebWorkAction.</p>
        <form action="helloWebWork.action" method="post">
            <p><input type="submit" value="Hello!" /></P>
        </form>
    </body>
</html>

    这是如何用网页结合WebWork:藉由通过*.action的URL。这就是我们在先前的教程中为什么用映射 "*.action" 注册 WebWork 的 "ServletDispatcher"的原因。

    当我们点击了示例页面的按钮时,浏览器将发送表单中的数据到helloWebWork.action。因为这个URL适合于*.action,Servlet容器将会激活 WebWork 的 ServletDispatcher,它将会去读 xwork.xml找寻一个被称为 helloWebWork 的Action。如何这个Action找到的话,那么这个Action将会被实例化并会调用其execute()方法。

    接下去就来看看Action这个类:

package lesson03;

import com.opensymphony.xwork.ActionSupport;

public class HelloWebWorkAction extends ActionSupport {
    String hello;
    public String getHello() {
        return hello;
    }
    public String execute() throws Exception {
        hello = "Hello,WebWork!";
        //ActionSupport实现了Action接口
        //SUCCESS为在Action接口中定义的字符串常量。
        return SUCCESS;
    }
}

    首先,注意这个类继承了com.opensymphony.xwork.ActionSupport,并且实现了public String execute()方法。对于启动器,你所有的Action类都应该这么做。其次,注意方法execute()只是设置了属性hello的值且返回常量SUCCESS,常量SUCCESS是一个“success”字符串。
    当ServletDispatcher从execute()得到其返回的“success” 后,它会再次在xwork.xml中查找一个名为这个返回的字符串(success),找到后,转发到其配置文件中所定义的ex01- success.jsp。

ex01-success.jsp

<%@ taglib uri="webwork" prefix="ww" %>
<html>
    <head><title>WebWork Tutorial - Lesson 3 - Example 1</title></head>
    <body>
        <ww:property value="hello" />
    </body>
</html>

    如果你运行这个示例,你将看到这个页面将显示”Hello WebWork!”。之所以得到这个显示,是因为<ww:property value=”hello” />标签寻找在Action类中名为hello的属性后执行的。事实上,它寻找一个访问方法,所以是在调用getHello()之后执行的。由于 HelloWebWorkAction被调用时,设置了其hello属性的值为“Hello,WebWork!”,getHello()将返回此值并将显 示在结果页面上。
    Try the example!

提供数据给Action


    上面的例子示范了如何使WebWork的Action工作,但如果我们无法提供数据给我们的Action,我们多不能做的更多。让我们来看个例子,它看起来像这样:

xwork.xml

<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
    <!-- Include webwork defaults (from WebWork JAR). -->
    <include file="webwork-default.xml" />

    <!-- Configuration for the default package. -->
    <package name="default" extends="webwork-default" />

        <!-- Default interceptor stack. -->
        <default-interceptor-ref name="defaultStack" />

        <!--Action: Lesson 03:HelloAction. -->
        <actoin name=”hello” class="lesson03.HelloAction">
            <result name=”error” type=”dispatcher”>ex02-index.jsp</result>
            <result name="success" type="dispatcher">ex02-success.jsp</result>
        </action>
    </package>
</xwork>


HelloAction.java

package lesson03;

import com.opensymphony.xwork.ActionSupport;

public class HelloAction extends ActionSupport {
    String person;
    public String getPerson() {
        return person;
    }
    public void setPerson(String person) {
        this.person = person;
    }
    public String execute() throws Exception {
        if((person == null) || (person.length() == 0))
            return ERROR;
        else
            return SUCCESS;
    }
}


ex02-index.jsp

<html>
    <head><TITLE>WebWork Tutorial - Lesson 3 - Exaple 2</TITLE></head>
    <body>
        <p>What's your name?</p>
        <form action="hello.action" method="post">
            <p><input type="text" name="person" /><input type="submit" /></P>
        </form>
    </body>
</html>


ex02-success.jsp

<%@ taglib uri="webwork" prefix="ww" %>
<html>
    <head><title>WebWork Tutorial - Lesson 3 - Example 2</title></head>
    <body>     
        Hello, <ww:property value="person" />
    </body>
</html>


    让我们来分析一下有什么不同:在这个例子 中,我们通过POST来发送名为person的文本框中的数据。那是因为,在一个新的HelloAction实例被创建后,WebWork的 ServletDispatcher会试着将要被传送的数据填入Action的属性person中,所以将会调用设置方法setPerson()(事实 上,是ParametersInterceptor来完成的,我们将在教程5中学习这些 - 现在,只要知道当Action被执行时,其属性已经被设置)。
    如果你看看Action类的代码,你会看到 在执行execute()时,它检查属性是否已经被设置了(也就是,form域中的数据是否已经提供了)。如果是,那么就会返回SUCCESS,因此会分 发请求到ex01-success.jsp,否则会返回ERROR,退回到ex02-index.jsp。

     Try the example!

Result类型


    在上面的例子中,当我们说一个Result的类型是“dispatcher”,它的意思是WebWork寻找一个被叫做dispatcher的返回类型且找到的Result类是实现它的。每当Action返回这个Result类型就会实例化那个类。
    Result类 实现了com.opensymphyony.xwork.Result接口。WebWork自带了一些已经实现了的Result类,但你还是可以创建你自己的Result类。WebWork的Result类型已经被配置在了webwork-default.xml中:
    1. Dispatcher -(com.opensymphony.webwork.dispatcher.ServletDispatcherResult):转发Result到指定的位置;
    2. redirect - (com.opensymphony.webwork.dispatcher.ServletRedirectResult):重定向Result到指定的位置。不像dispatcher,redirect不会发送form中的数据(通过POST或GET)到指定的页面;
    3. velocity - (com.opensymphony.webwork.dispatcher.VelocityResult):以一个Velocity模板作为返回结果。如果你在web.xml 中配置了 VelocityServlet,你就可以使用dispatcher转发Result到Velocity页面,不过使用Velocity result是一种较好的方式。更多关于Velocity在教程4.2种;
    4. chain - (com.opensymphony.xwork.ActionChainResult):用链条锁住另外一个Action,也就是,Action的结果是另外一个Action;
    5. xslt - (com.opensymphony.webwork.views.xslt.XSLTResutl):使用一份被XSLT样式表转换的XML文档作为Result。

    ☆更多关于: Result类型

继续下一教程


    这些例子举例说明了Action和Result的主要观念:他们是单位完成(units of execution)来响应请求,依赖Result做一些处理,转发请求到一些其他的位置。虽然似乎可能简单了些,但确是WebWork框架的核心。
    下面是一些能与Action一起完成的其他东东,正如你知道的,在我们进入到后面的一些教程中WebWork可以做:
    1. Interceptors(拦截器),它能截获任何Action执行一个平坦的执行时间(教程5);
    2. Action可以通过实现ModelDriven接口直接的与你的商业对象协作;
    3. XML文件,配置确认传送到Action中的数据。如果一些数据对于你的规范来说不是有效的,那么Action不会被执行,并且把错误的消息放入Action中(参考:Validation);
    4. WebWork能够自动的提供一些Action实例的组件(在不同的范围中),允许控制反转(参考:[Inversion of Control & Components])。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值