`
Tin
  • 浏览: 138613 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在Webwork中使用ww:action实现页面控制器风格Action复用

阅读更多

Webwork是标准的请求风格Web MVC,类似的有Struts、Spring MVC。这这种风格的MVC中都使用了前端控制器模式(企业架构模式),也就是说一个URL会被解析然后派发到对应的Action解析,而View调用的是Action处理后的Form对象或者Command对象(Rod的Without EJB)。
上面引用了一些经典的言论,而它们和“页面控制器风格Action复用”有什么关系呢?
嘿嘿,页面控制器在这里指到了View的Page里面依然可以调用控制器(在Webwork中就是Action)。如果是以前肯定有人会说,如果用JSP我随时可以在Page里面写scriptlet,什么东西都能调用……
可是,现在不一样了。我们希望让View单纯一点,不要有杂乱无章的逻辑参与其中。
可是,如果要是如上面所说那么Action在它的一个请求生命周期就要做所有的事……这样一是使Action逻辑变得复杂,二是会变得难以复用。
所以,说到这里就引出了这个主题:
1、在页面调用控制器
2、复用控制器逻辑
在Webwork中我们可以使用<ww:action/>标签实现这个目的。
——————————————————————————————————————
不要着急,我们先介绍一下ww:action的两种主要用法,而说用法之前先说语法:
语法:
<ww:action/>有5个属性:
1、id:给Action返回的ValueStack命名,如果不写则默认为调用的Action的名字。(详细使用参照后面)
2、name:调用的Action的name。
3、namespace:调用的Action的namespace。
4、executeResult:true或false,是否渲染Action的View。这个决定了ww:action的用法。(后面会做说明)
5、ignoreContextParams:Boolean值,request参数是否在Action被调用时所包括。

好了,语法很简单,我们说ww:action的两种主要用法。
1、代替<jsp:include>:
include有两种方式@ include和jsp:include,它们一个是编译前一个是运行时include。webwork是不能使用<jsp:include>的。
但其实ww有ww:include标签,但是根据Webwork in Action中的推荐,ww:include标签适合调用一般servlet,而对于action则推荐使用强大的ww:action。所以我们这里就略过ww:include。
说强大是什么意思呢?ww:action充当这个角色时,可以选择是否将valueStack的东西复制过来。
当ww:action代替jsp:include的时候我们需要executeResult="true",这个时候调用的action返回的view会被include到调用的位置。<ww:action><param name="xxx" value="yyy"/></ww:action>则可以给action传递参数。其它的用法就与jsp:include或者ww:include用法差别不大了。

2、页面控制器风格Action复用:
我们经常遇到这样的场景,比如用户注册的时候需要选择单位列表。那么我们reg.action运行之前就需要先把单位列表unitsList取出来。而它们本身与User注册逻辑上没什么关系。
所以有的人把这个取出unitsList单独写在prepare()方法里面,然后用prepare Inteceptor……或者把读取unitsList的逻辑写在execute方法里面。
但是这显然难以复用!
其实如果有单位unit这样的domain,我们可能就有对应的CRUD的Action。其中可能就有UnitsListAction这样的Action。
我们完全可以在用户注册的时候就复用这个Action,而不是把同样的逻辑写到用户注册的Action里面。这就是页面控制器风格要解决的问题。
说那么多大帽子其实没有意义,我们看看怎么实现:
UnitsListAction片断(我们要复用它):

UnitService unitService = null;//注入,商业逻辑
List<Unit> unitsList = null;//设置对应getter、setter

Public String execute() {
 unitsList 
= unitDao.listAll();
 
return SUCCESS;
}

UserRegAction假设在注册前只是doDefault()直接返回SUCCESS,只有在Post数据时在调用execute(),我们就不写空的代码了。或者不通过任何Action调用注册页面,直接调用注册的jsp文件直接访问也可以。

到了UserRegAction显示的View,我这里是Jsp片断:

<ww:action id="listUnits" executeResult="false" namespace="/" name="unitsListAction" />
<ww:select name="unitId" list="#attr.listUnits.unitsList" listKey="id" listValue="name" required="true"/>

注意,executeResult="false",也就是说我们不渲染unitsListAction返回的view,只用它的值。
而访问它的值的时候要使用#attr.listUnits.unitsList这样的引用,因为这时unitsListAction返回的VlueStack不是页面的ognl的rootStack,我们需要访问#attr这个Stack,这部分可以参考一下Webwork的wiki。
上面我给unitsListAction规定了一个id,这样调用比较灵活,你可以多次调用同一个Action并且将值放在#attr下的不同地方。
我们引用unitsListAction返回的unitsList这个list的时候需要用#attr加上我们给unitsListAction设定的id(如果不指定id,则默认unitsListAction)再加上你要访问的变量名访问。
其实很简单,而这种方式就是开始说的页面控制器风格的action复用。虽然和真正的叶面控制器的Tapestry和JSF相差甚远,但是也算有点那个意思了。
扩展点想,如果我们在Action实现了一个counter,也可以通过这种方式调用,连返回的值都可以忽略,呵呵,这种逻辑复用还是挺有用的。

抛砖引玉,我这个人说话啰嗦,见谅,就到这里。

分享到:
评论

相关推荐

    webwork标签的使用和介绍

    - `&lt;ww:action&gt;`:执行Action并显示结果。 - `&lt;ww:bean&gt;`:创建JavaBean并初始化属性。 - `&lt;ww:include&gt;`:包含其他页面或Action的结果。 3. **流程控制标签**: - `&lt;ww:if&gt;`:条件判断,当条件为真时执行内容...

    WebWork ww标签

    WebWork的ww标签库极大地方便了开发者在JSP页面上的数据操作和逻辑控制,通过使用`&lt;ww:if&gt;`、`&lt;ww:iterator&gt;`、`&lt;ww:set&gt;`和`&lt;ww:property&gt;`等标签,开发者可以更简洁、高效地编写动态页面,减少代码量,提高开发...

    webwork标签

    - `&lt;ww:action&gt;`:在标签库的上下文中执行一个动作,其主体显示动作执行的结果。 - `&lt;ww:bean&gt;`:创建一个JavaBean,初始化属性,并放入ActionContext。 - `&lt;ww:include&gt;`:包含另一个页面或动作,实现视图的复用...

    WebWork标签库

    - **`&lt;ww:action/&gt;`**:执行一个动作。此标签用于触发WebWork中的Action执行,并可控制流程转向。 - **`&lt;ww:bean/&gt;`**:实例化一个JavaBean,并允许访问其属性和方法。常用于在JSP页面中操作Bean。 - **`&lt;ww:...

    WebWork入门教程[创建你第一个WebWork action]

    在WebWork的学习过程中,了解它的设计理念、掌握Action的创建和配置,以及熟练使用拦截器和值栈,将有助于提升你构建高效、可维护的Java Web应用的能力。同时,WebWork与Struts2的紧密联系,也意味着学习WebWork对...

    webwork in action

    根据提供的文件信息,本书《WebWork in Action》主要聚焦于Java WebWork框架的应用与实践,是一本详尽介绍WebWork框架各个方面的书籍。下面将基于标题、描述、标签及部分内容来提取并归纳出相关的IT知识点。 ### ...

    webwork中使用datepicker标签来选择日期

    本文将深入探讨如何在WebWork中使用`datepicker`标签来实现用户友好的日期选择功能。 `datepicker`标签通常与JavaScript库如jQuery UI的Datepicker组件结合使用,它允许用户通过一个交互式的日历来选择日期,而不是...

    详解Webwork中Action 调用的方法

    接着,`getParameterMap`、`getSessionMap`、`getApplicationMap`等方法被用于获取请求、session和application级别的参数,这些参数将在后续的Action执行中使用。 3. DefaultActionProxyFactory、...

    webwork源码底层实现

    WebWork是一个古老的Java Web开发框架,它在早期的MVC(模型-视图-控制器)架构中占有重要地位,为开发者提供了丰富的功能和强大的动作映射能力。在深入理解WebWork源码之前,我们首先需要了解一些基本概念。 1. **...

    webwork 标签手册

    - **功能**:创建并初始化简单的JavaBean对象,将其压入值栈中,便于后续在页面中使用。 - **示例**: ```xml &lt;ww:bean id="userInfo" class="com.example.UserInfo"&gt; &lt;ww:param name="username" value="JohnDoe...

    webwork-tags-API

    类似于JSTL,WebWork-Tags也包含条件和逻辑控制标签,如`&lt;ww:if&gt;`、`&lt;ww:else&gt;`和`&lt;ww:choose&gt;`等,它们使得在JSP页面中实现复杂的逻辑判断成为可能。 6. **国际化和本地化**: WebWork-Tags API 还支持国际化和...

    webwork 中文API

    WebWork 是一个基于Java的MVC(模型-视图-控制器)框架,它在Web应用程序开发中被广泛使用。这个“WebWork 中文API”显然是一份由专家翻译的文档,目的是帮助中国开发者更好地理解和使用WebWork框架。下面将详细阐述...

    webwork中文帮助文档

    在WebWork框架中,模型(Model)负责处理业务逻辑,视图(View)负责展示数据,控制器(Controller)则协调模型和视图,处理用户的请求。这种架构使得代码组织清晰,易于维护和扩展。 1. **安装与配置**: - ...

    Webwork.in.action最新中文版

    在本书中,读者将全面了解Webwork的核心概念和实践技巧,包括Action、Interceptor、ValueStack、OGNL表达式等核心组件。Action是Webwork框架的基础,负责处理用户的请求并调用业务逻辑;Interceptor则提供了一种灵活...

    webwork 权限拦截器

    WebWork权限拦截器是WebWork框架中的一个重要组件,主要用于实现基于拦截器(interceptor)的权限控制。在Web开发中,权限拦截器扮演着至关重要的角色,它可以在用户请求到达控制器之前进行预处理,判断用户是否有权...

    webwork中文文档

    **Action类**:Action类是WebWork框架中的业务逻辑处理单元,它们负责执行具体的业务操作,并返回一个结果,指示视图如何显示数据。 #### 3. **拦截器**:拦截器在Action执行前后执行,可以用于实现诸如权限检查、...

    webwork2实例源代码

    WebWork2是一个基于Java的MVC(模型-视图-控制器)框架,它在早期的J2EE开发中被广泛使用。本实例源代码提供了深入理解WebWork2工作原理和应用开发的机会。以下是对WebWork2核心知识点的详细阐述: 1. **MVC架构**...

    webwork详细讲解.doc

    拦截器(Interceptor)是WebWork中的另一个重要概念,它可以在Action执行前后进行拦截,从而实现如日志记录、权限检查等功能。拦截器框架为开发者提供了一种灵活的方式来扩展WebWork的功能。 #### 验证框架 ...

    webwork in action 中文版.part07.rar

    webwork in action 中文版

Global site tag (gtag.js) - Google Analytics