虽然现在 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. java netty socket库和自定义C#socket库利用protobuf进行通信完整实例

    之前的文章讲述了socket通信的一些基本知识,已经本人自定义的C#版本的socket.和java netty 库的二次封装,但是没有真正的发表测试用例. 本文只是为了讲解利用protobuf 进行C ...

  2. IL实现简单的IOC容器

    既然了解了IL的接口和动态类之间的知识,何不使用进来项目实验一下呢?而第一反应就是想到了平时经常说的IOC容器,在园子里搜索了一下也有这类型的文章http://www.cnblogs.com/kkll ...

  3. Java终止线程

    Thread提供了stop()方法终止线程,但是该方法是强行终止,容易产生一些错误,已经被废弃. 可以使用退出标志来终止线程,在run()函数里面设置while循环,把退出标志作为while的条件,当 ...

  4. hibernate.cfg.xml

    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN&q ...

  5. Java - 网络编程

    Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh.     参考:  

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

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

  7. windows go安装

    1.安装git 因为golang是通过git来管理远程包的,所以我们首先要安装git,下载地址:http://www.git-scm.com/download/. git安装比较简单,直接下一步即可( ...

  8. 关于MySQL数据库优化的部分整理

    在之前我写过一篇关于这个方面的文章 <[原创]为什么使用数据索引能提高效率?(本文针对mysql进行概述)(更新)> 这次,主要侧重点讲下两种常用存储引擎. 我们一般从两个方面进行MySQ ...

  9. ListView和Adapter数据适配器的简单介绍

    ListView 显示大量相同格式数据 常用属性: listSelector            listView每项在选中.按下等不同状态时的Drawable divider            ...

  10. webservice入门实例,CXF方式

    1.下载CXF,及先关jar包. CXF 下载地址:http://cxf.apache.org/download.html,选择"File"列中的zip格式下载.解压后可以看到一些 ...