虽然现在 MVC 框架层出不穷,但做为 Struts 前身的 webwork。

其经典程度不亚于贝利之于足球,双 11 之于淘宝特卖。

本篇将结合 webwork controller 配置文件 xwork.xml 的配置项浅析。

来一起看看当年叱咤风雨的 mvc 框架是怎样满足变更的业务需求。

1. xwork.xml 主文件

xwork.xml 是 WebWork 自身的配置文件,实际开发中它是配置文件的主干骨架。

xwork 定义了一个 default 包,通过 include 包含 xwork 子文件。如下所示:

  1. <!DOCTYPE xwork
  2. PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
  3. "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
  4. <xwork>
  5. <include file="webwork-default.xml"/>
  6. <include file="common.xml"/>
  7. <include file="user.xml"/>
  8. </xwork>

2. xwork.xml 子文件

xwork 子文件一方面有效地对大型程序进行分解,符合程序开发的模块化切分。

另一方面帮助我们遍历整个程序,有助于日后的运维。

由于 webwork 开发过程中 xwork.xml 的结构定义是一致的,保证了较低的学习成本。

  1. <!DOCTYPE xwork
  2. PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
  3. "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
  4.  
  5. <xwork>
  6. <package name="user" extends="webwork-default" systemId="1001" caption="用户管理">
  7. <default-interceptor-ref name="defaultStack" />
  8.  
  9. <action name="dirUser" class="com.rambo.app.base.user.action.DirUser" caption="查询用户" event-type="5">
  10. <result name="success" type="dispatcher">
  11. <param name="location">/user/diruser.jsp</param>
  12. </result>
  13. <result name="error" type="redirect">
  14. <param name="location">doError.action</param>
  15. </result>
  16. </action>
  17.  
  18. <action name="addUser" class="com.rambo.app.base.user.action.AddUser" caption="添加用户" event-type="3">
  19. <result name="success" type="dispatcher">
  20. <param name="location">/result.jsp</param>
  21. </result>
  22. <result name="error" type="dispatcher">
  23. <param name="location">/result.jsp</param>
  24. </result>
  25. <interceptor-ref name="modelDrivenStack" />
  26. </action>
  27. </package>
  28. </xwork>

2.1 package

包: package,包的名称可以理解为模块的名称(各子文件包名称不能重复)。所有的 action 定义在包的下一层。

命名空间:namespace,如:namespace="/user",描述子模块 jsp 文件的所在路径,同时明确了请求访问时的 url 网址:/user/*.action。

命名空间为空则请求访问时的 url 网址:/*.action。

命名空间的好处:

1) 体现模块化

2) 命名空间为空,则访问请求的 url 网址均为/*.action,容易冲突

2.2 action

action name:对应请求的名称,如 dirUser,url:/user/dirUser.action

action class:com.rambo.app.base.user.action.DirUser 后台接收请求对应的 java 处理类

action.result.location:diruser.jsp 对处理结果进行展示,文件所在目录位置为 /user/diruser.jsp

2.3 result

ServletDispatcher 是 WebWork 框架机制的核心。它和 Action 在 MVC 模式中,扮演着控制器的角色,MVC 模式通过控制器实现了模型和视图的分离。

Xwork 文件中的 Result 是 Action 执行完返回的一个字符串常量,它表示Action 执行完成的状态,比如:执行成功、执行失败等。

WebWork 的 Action 提供了默认的几种(包括:success、error、login、none、input 等)另外 Result 完全可以自己定义,只要是一个字符串常量就可以了。

Result 标签定义中 name 为返回的字符串常量值,如:name="success"表示

Action 执行成功,返回结果就将根据此标签的具体配置进行视图输出。

type 对应 Result Type 类,它在 Action 执行完成并返回 Result 之后,决定采用哪一种视图技术,将执行结果展现给用户,主要包括:

type 参数 描述
dispatcher

location(必须)
parse

调度到 jsp 页面展现,其中 Action 请求对应 java 处理程序中的
的数据可以被页面直接使用

redirect location(必须)
parse

将响应重定向到浏览器指定的位置,它将会导致 Action 执行完成
的数据丢失或不再可用。将响应定向到参数 location 指定的、新的 url 中

chain

actionName(必须)
namespace

Action Chaining:一种特殊的视图结果,将 Action 执行完之后链接到另一个
Action 中继续执行。新的 Action 使用上一个 Action 的上下文(ActionContext)

  1. 1. type = dispatcher
  2. <result name="success" type="dispatcher">
  3. <param name="location">userinfo.jsp</param>
  4. </result>
  5.  
  6. 简写:<result name="success" type="dispatcher">userinfo.jsp</result>
  7.  
  8. 2. type = redirect
  9. <result name="error" type="redirect">
  10. <param name="location">../userinfo.jsp</param>
  11. </result>
  12.  
  13. 简写:<result name="error" type="redirect">../userinfo.jsp</result>
  14.  
  15. 3. type = chain
  16. <result name="success" type="chain">
  17. <param name="actionName">rambo</param>
  18. </result>
  19.  
  20. Action:
  21. <action name="rambo" class="myPackage.barAction">
  22. ...
  23. </action>

2.4 interceptor

WebWork 截获 Action 请求,在 Action 执行之前或之后调用拦截器方法。这样,可以用插拔的方式将功能注入 Action 中。

实际开发中最常用拦截器主要封装了对表单参数提交时的处理,如对象化等,包括如下三类:

1) 默认拦截器 <interceptor-ref name="defaultStack"/>

2) 支持模型驱动拦截器 <interceptor-ref name="modelStack"/>

3) 支持文件上传拦截器 <interceptor-ref name="uploadStack"/>

2.4.1 defaultStack 默认拦截器

默认的表单处理拦截器。Xwork.xml 定义的 Action 只要继承 ActionSupport类,通过默认拦截器就可以自动将 jsp 表单数据转换为 java 文件定义的相应变量。

注意:jsp 文件表单 input 中的 name 名要与 java 文件中的变量名相对应。

如下面示例中的 sysId 和 gUser 对象。

前端:

  1. <form name="form1" id="form1" action="login.action" method="post">
  2. <input type="hidden" name="sysId" id="sysId"/><br/>
  3. 用户名:<input name="gUser.email" id="gUser.email"/><br/>
  4. 密码:<input name="gUser.password" id="gUser.password" type="password"/><br/>
  5. <input name="login" type="submit" value="登录"/></p>
  6. </form>

Xwork.xml:

  1. <action name="login" class="com.rambo.app.user.login.LoginAction">
  2. <result name="success" type="redirect">
  3. <param name="location">user/dirUser.action</param>
  4. </result>
  5. <result name="error" type="redirect">
  6. <param name="location">doError.action</param>
  7. </result>
  8. <interceptor-ref name="defaultStack"/>
  9. </action>

Java 端:

  1. public class LoginAction extends ActionSupport{
  2. private Integer sysId;
  3. public GUser gUser = new GUser();
  4. public LoginAction() {
  5. }
  6. public String execute() {
  7.  
  8. //业务处理......
  9. return Action.SUCCESS;
  10. }
  11.  
  12. //getter/setter......
  13. }

2.4.2 modelStack 模型驱动拦截器

Xwork.xml 定义的 Action 在继承 ActionSupport 类的同时需要实现 ModelDriven(模型驱动)接口中的 Object getModel()方法,通过这个方法返回的就是要接收的模型对象。

就可以直接将 jsp 表单数据转换为 java 文件定义的相应对象。

如下面 Java 示例中的 info 对象。注意:jsp 文件表单 input 中的 name 应该与 java 文件中 info 对象所对应 User 类中的属性相对应。

前端:

  1. <form name="form1" id="form1" action="editUserInfo.action" method="post">
  2. <input type="hidden" name="id" id="id"/>
  3. <div>邮箱:<input readonly name="email" id="email"/></div>
  4. <div>姓名:<input name="realName" id="realName" /></div>
  5. <div>电话:<input name="phone" id="phone"/></div>
  6. <div><input type="submit" value="保存"/></div>
  7. </form>

Xwork.xml:

  1. <action name="editUserInfo" class="com.rambo.app.user.info.EditUserInfo">
  2. <result name="success" type="dispatcher">
  3. <param name="location">../resultjson.jsp</param>
  4. </result>
  5. <result name="error" type="dispatcher">
  6. <param name="location">../resultjson.jsp</param>
  7. </result>
  8. <interceptor-ref name="modelStack"/>
  9. </action>

Java 端:

  1. public class EditUserInfo extends ActionSupport implements ModelDriven{
  2. private GUser info = new GUser();
  3. public Object getModel() {
  4. return info;
  5. }
  6. public EditUserInfo() {
  7. }
  8. protected String execute() {
  9. //业务处理.....
  10.  
  11. return Action.SUCCESS;
  12. }
  13.  
  14. //getter/setter......
  15. }

2.4.3 uploadStack 上传拦截器

Xwork.xml 定义的 Action需要继承 ActionSupport 类,通过文件上传拦截器就可以自动将 jsp 表单数据及二 进制文件数转换为 java 文件定义的相应变量各文件对象,如下面示例中的 userId 和 uploadFile 对象。

注意:jsp 文件表单 input 中的 name 名要与 java 文件中的变量名相对应。

前端:

  1. <form name="form1" action="uploadUserImg.action" method="post" ENCTYPE="multipart/form-data" >
  2. <input type="hidden" name="userId" id="userId" value="1" />
  3. 上传附件:<input type="file" name="uploadFile" id="uploadFile">
  4. <input type="submit" value="上传">
  5. </form>

Xwork.xml:

  1. <action name="uploadUserImg" class="com.rambo.app.user.info.UploadUserImg">
  2. <result name="success" type="dispatcher">
  3. <param name="location">../resultxml.jsp</param>
  4. </result>
  5. <result name="error" type="dispatcher">
  6. <param name="location">../resultxml.jsp</param>
  7. </result>
  8. <interceptor-ref name="uploadStack"/>
  9. </action>

Java 端:

  1. public class UploadUserImg extends ActionSupport {
  2. private Integer userId;
  3. private File uploadFile;
  4.  
  5. public UploadUserImg() {
  6. }
  7.  
  8. public String execute() {
  9. if (uploadFile == null || userId == null)
  10. return Action.ERROR;
  11.  
  12. //业务处理......
  13. return Action.SUCCESS;
  14. }
  15.  
  16. //getter/setter.....
  17. }

Webwork 学习之路【08】结合实战简析Controller 配置的更多相关文章

  1. Webwork【08】结合实战简析Controller 配置

    虽然现在 MVC 框架层出不穷,但做为 Struts 前身的 webwork. 其经典程度不亚于贝利之于足球,双 11 之于淘宝特卖. 本篇将结合 webwork controller 配置文件 xw ...

  2. Webwork 学习之路【06】Action 调用

    一路走来,终于要开始 webwork 核心业务类的总结,webwork 通过对客户端传递的 web 参数重新包装,进行执行业务 Action 类,并反馈执行结果,本篇源码分析对应下图 WebWork ...

  3. Webwork 学习之路【03】核心类 ServletDispatcher 的初始化

    1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...

  4. Webwork 学习之路【04】Configuration 详解

    Webwork做为经典的Web MVC 框架,个人觉得源码中配置文件这部分代码的实现十分考究. 支持自定义自己的配置文件.自定义配置文件读取类.自定义国际化支持. 可以作为参考,单独引入到其他项目中, ...

  5. Nutch学习笔记二——抓取过程简析

    在上篇学习笔记中http://www.cnblogs.com/huligong1234/p/3464371.html 主要记录Nutch安装及简单运行的过程. 笔记中 通过配置抓取地址http://b ...

  6. Webwork 学习之路【07】文件上传下载

    Web上传和下载应该是很普遍的一个需求,无论是小型网站还是大并发访问的交易网站.WebWork 当然也提供了很友好的拦截器来实现对文件的上传,让我们可以专注与业务逻辑的设计和实现,在实现上传和下载时顺 ...

  7. Python学习之路:MINST实战第一版

    1.项目介绍: 搭建浅层神经网络完成MNIST数字图像的识别. 2.详细步骤: (1)将二维图像转成一维,MNIST图像大小为28*28,转成一维就是784. (2)定义好神经网络的相关参数: # M ...

  8. Webwork 学习之路【05】请求跳转前 xwork.xml 的读取

    个人理解 WebWork 与 Struts2 都是将xml配置文件作为 Controler 跳转的基本依据,WebWork 跳转 Action 前 xml 文件的读取依赖 xwork-1.0.jar, ...

  9. Webwork 学习之路【02】前端OGNL试练

    1.OGNL 出现的意义 在mvc中,数据是在各个层次之间进行流转是一个不争的事实.而这种流转,也就会面临一些困境,这些困境,是由于数据在不同世界中的表现形式不同而造成的: a. 数据在页面上是一个扁 ...

随机推荐

  1. MVC采用Jquery实现局部刷新

    该文纯粹属于个人学习,有不足之处请多多指教! 效果图: 单击Detail下面出现详细,效果如下: 为了使操作时两个不同的数据源相互干扰,使用局部视图刷新,代码如下: 首先介绍主页Index代码: @m ...

  2. js验证输入的是否是数字,小数保留几位小数

    1.验证方法 validationNumber(e, num)  e代表标签对象,num代表保留小数位数 function validationNumber(e, num) { -]+\.?[-]*$ ...

  3. spring笔记5 spring IOC的基础知识1

    1,ioc的概念 Inverse of control ,控制反转,实际的意义是调用类对接口实现类的依赖,反转给第三方的容器管理,从而实现松散耦合: ioc的实现方式有三种,属性注入,构造函数注入,接 ...

  4. python之路目录

    python开发[第一篇]:目录 python开发[第二篇]:python初体验 python开发[第三篇]:python基础之条件控制与循环 python开发[第四篇]:python基础之运算符 p ...

  5. 回顾java基础—Java数据类型

    1  java数据类型.8种基本类型,3种引用类型 基本类型(也称:原始类型):byte.short.int.long.char.float.double.boolean 引用类型:类,接口,数组 2 ...

  6. 应用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)构建系统的整体方案

    SSIO的更新 在SSIO上增加了UDP通讯方式,可以到Github上下载源代码.在原来的项目中,远端的设备与中心站的数据交互并没有使用过UDP方式.这种短连接的通讯链路,不容易维护,主要体现在:(1 ...

  7. Mybatis框架的多对一关联关系(六)

    一.一对多的关联映射 一对多关联查询多表数据 1接口 public interface IDeptDAO { //根据部门编号查询该部门单个查询 public Emp getEmpById(Integ ...

  8. 如何在webapp中做出原生的ios下拉菜单效果

    github:https://github.com/zhoushengmufc/iosselect webapp模仿ios下拉菜单 html下拉菜单select在安卓和IOS下表现不一样,iossel ...

  9. sass安装

    第一步:下载ruby http://www.ruby-lang.org/zh_cn/downloads/ 第二步:安装ruby http://www.ruby-lang.org/zh_cn/docum ...

  10. JS函数声明的问题

    三个例子 var a = 10; 2 function test(){ 3 a = 100; 4 console.log(a); 5 console.log(this.a); 6 var a; 7 c ...