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

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

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

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

1. xwork.xml 主文件

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

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

<!DOCTYPE xwork
PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
<include file="webwork-default.xml"/>
<include file="common.xml"/>
<include file="user.xml"/>
</xwork>

2. xwork.xml 子文件

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

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

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

<!DOCTYPE xwork
PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-1.0.dtd"> <xwork>
<package name="user" extends="webwork-default" systemId="1001" caption="用户管理">
<default-interceptor-ref name="defaultStack" /> <action name="dirUser" class="com.rambo.app.base.user.action.DirUser" caption="查询用户" event-type="5">
<result name="success" type="dispatcher">
<param name="location">/user/diruser.jsp</param>
</result>
<result name="error" type="redirect">
<param name="location">doError.action</param>
</result>
</action> <action name="addUser" class="com.rambo.app.base.user.action.AddUser" caption="添加用户" event-type="3">
<result name="success" type="dispatcher">
<param name="location">/result.jsp</param>
</result>
<result name="error" type="dispatcher">
<param name="location">/result.jsp</param>
</result>
<interceptor-ref name="modelDrivenStack" />
</action>
</package>
</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. type = dispatcher
<result name="success" type="dispatcher">
<param name="location">userinfo.jsp</param>
</result> 简写:<result name="success" type="dispatcher">userinfo.jsp</result> 2. type = redirect
<result name="error" type="redirect">
<param name="location">../userinfo.jsp</param>
</result> 简写:<result name="error" type="redirect">../userinfo.jsp</result> 3. type = chain
<result name="success" type="chain">
<param name="actionName">rambo</param>
</result> Action:
<action name="rambo" class="myPackage.barAction">
...
</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 对象。

前端:

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

Xwork.xml:

       <action name="login" class="com.rambo.app.user.login.LoginAction">
<result name="success" type="redirect">
<param name="location">user/dirUser.action</param>
</result>
<result name="error" type="redirect">
<param name="location">doError.action</param>
</result>
<interceptor-ref name="defaultStack"/>
</action>

Java 端:

public class LoginAction extends ActionSupport{
private Integer sysId;
public GUser gUser = new GUser();
public LoginAction() {
}
public String execute() { //业务处理......
return Action.SUCCESS;
} //getter/setter......
}

2.4.2 modelStack 模型驱动拦截器

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

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

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

前端:

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

Xwork.xml:

        <action name="editUserInfo" class="com.rambo.app.user.info.EditUserInfo">
<result name="success" type="dispatcher">
<param name="location">../resultjson.jsp</param>
</result>
<result name="error" type="dispatcher">
<param name="location">../resultjson.jsp</param>
</result>
<interceptor-ref name="modelStack"/>
</action>

Java 端:

public class EditUserInfo extends ActionSupport implements ModelDriven{
private GUser info = new GUser();
public Object getModel() {
return info;
}
public EditUserInfo() {
}
protected String execute() {
//业务处理..... return Action.SUCCESS;
} //getter/setter......
}

2.4.3 uploadStack 上传拦截器

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

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

前端:

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

Xwork.xml:

        <action name="uploadUserImg" class="com.rambo.app.user.info.UploadUserImg">
<result name="success" type="dispatcher">
<param name="location">../resultxml.jsp</param>
</result>
<result name="error" type="dispatcher">
<param name="location">../resultxml.jsp</param>
</result>
<interceptor-ref name="uploadStack"/>
</action>

Java 端:

public class UploadUserImg extends ActionSupport {
private Integer userId;
private File uploadFile; public UploadUserImg() {
} public String execute() {
if (uploadFile == null || userId == null)
return Action.ERROR; //业务处理......
return Action.SUCCESS;
} //getter/setter.....
}

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. 如果你也会C#,那不妨了解下F#(3):F#集合类型和其他核心类型

    本文链接:http://www.cnblogs.com/hjklin/p/fs-for-cs-dev-3.html 在第一篇中,我们介绍了一些基础数据类型,其实那篇标题中不应该含有"F#&q ...

  2. Visual Studio 2013 Ultimate因为CodeLens功能导致Microsoft.Alm.Shared.Remoting.RemoteContainer.dll高CPU占用率的折中解决方案

    1.为什么Microsoft.Alm.Shared.Remoting.RemoteContainer.dll的CPU占用率以及内存使用率会那么高? 在Visual Studio 2013 Ultima ...

  3. asp.net实现图片在线上传并在线裁剪

    1.说明 接上一篇文章uploadify实现多附件上传完成后,又突然用到头像上传并在线裁剪.在网上找个众多例子都没有符合要求的,有一篇文章写的不错,就是文旺老兄写的这篇Asp.Net平台下的图片在线裁 ...

  4. JDBC 制作简单的登录验证

    两种方法: 一.直接拼接到SQL语句 public static void main(String[] args) throws Exception{ //输入账号密码 Scanner sc = ne ...

  5. OS存储管理——FIFO,LRU,OPT命中率

    课程设计课题 存储管理程序设计 摘 要 虚拟存储器作为现代操作系统中存储管理的一项重要技术,实现了内存扩充功能.而分页请求分页系统正好可以完美的支持虚拟存储器功能,它具有请求调页功能和页面置换功能.在 ...

  6. 用jmeter通过ssl验证访问https

    找了一个支付宝的网站尝试.https://memberprod.alipay.com/account/reg/index.htm 我用的是chrome,点这个小锁 如果是IE也可以在网页上右键,属性, ...

  7. echarts学习总结

    ECharts学习总结使用步骤1 引入ECharts <script src="echarts.min.js"></script>2 绘制一个简单的图表 为 ...

  8. 很强大的HTML+CSS+JS面试题(附带答案)

    一.单项选择(165题) 1.HTML是什么意思? A)高级文本语言 B)超文本标记语言 C)扩展标记语言 D)图形化标记语言 2.浏览器针对于HTML文档起到了什么作用? A)浏览器用于创建HTML ...

  9. win10家庭版查看已连接wifi密码

    点击屏幕右下角无线网路图标. 点击网络设置. 完成.

  10. window7 桌面新建快捷方式方法

    点击开始按钮 所有程序 找到某个文件夹点开,找到文件夹里的快捷方式图标,右键--属性-- 复制 目标:上图蓝色内容. 回到桌面,右键--新建--快捷方式--把复制的内容粘贴到  请键入对象的位置-- ...