Webwork 学习之路【08】结合实战简析Controller 配置
虽然现在 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(必须) |
调度到 jsp 页面展现,其中 Action 请求对应 java 处理程序中的 |
redirect | location(必须) parse |
将响应重定向到浏览器指定的位置,它将会导致 Action 执行完成 |
chain |
actionName(必须) |
Action Chaining:一种特殊的视图结果,将 Action 执行完之后链接到另一个 |
- 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 配置的更多相关文章
- Webwork【08】结合实战简析Controller 配置
虽然现在 MVC 框架层出不穷,但做为 Struts 前身的 webwork. 其经典程度不亚于贝利之于足球,双 11 之于淘宝特卖. 本篇将结合 webwork controller 配置文件 xw ...
- Webwork 学习之路【06】Action 调用
一路走来,终于要开始 webwork 核心业务类的总结,webwork 通过对客户端传递的 web 参数重新包装,进行执行业务 Action 类,并反馈执行结果,本篇源码分析对应下图 WebWork ...
- Webwork 学习之路【03】核心类 ServletDispatcher 的初始化
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
- Webwork 学习之路【04】Configuration 详解
Webwork做为经典的Web MVC 框架,个人觉得源码中配置文件这部分代码的实现十分考究. 支持自定义自己的配置文件.自定义配置文件读取类.自定义国际化支持. 可以作为参考,单独引入到其他项目中, ...
- Nutch学习笔记二——抓取过程简析
在上篇学习笔记中http://www.cnblogs.com/huligong1234/p/3464371.html 主要记录Nutch安装及简单运行的过程. 笔记中 通过配置抓取地址http://b ...
- Webwork 学习之路【07】文件上传下载
Web上传和下载应该是很普遍的一个需求,无论是小型网站还是大并发访问的交易网站.WebWork 当然也提供了很友好的拦截器来实现对文件的上传,让我们可以专注与业务逻辑的设计和实现,在实现上传和下载时顺 ...
- Python学习之路:MINST实战第一版
1.项目介绍: 搭建浅层神经网络完成MNIST数字图像的识别. 2.详细步骤: (1)将二维图像转成一维,MNIST图像大小为28*28,转成一维就是784. (2)定义好神经网络的相关参数: # M ...
- Webwork 学习之路【05】请求跳转前 xwork.xml 的读取
个人理解 WebWork 与 Struts2 都是将xml配置文件作为 Controler 跳转的基本依据,WebWork 跳转 Action 前 xml 文件的读取依赖 xwork-1.0.jar, ...
- Webwork 学习之路【02】前端OGNL试练
1.OGNL 出现的意义 在mvc中,数据是在各个层次之间进行流转是一个不争的事实.而这种流转,也就会面临一些困境,这些困境,是由于数据在不同世界中的表现形式不同而造成的: a. 数据在页面上是一个扁 ...
随机推荐
- MVC采用Jquery实现局部刷新
该文纯粹属于个人学习,有不足之处请多多指教! 效果图: 单击Detail下面出现详细,效果如下: 为了使操作时两个不同的数据源相互干扰,使用局部视图刷新,代码如下: 首先介绍主页Index代码: @m ...
- js验证输入的是否是数字,小数保留几位小数
1.验证方法 validationNumber(e, num) e代表标签对象,num代表保留小数位数 function validationNumber(e, num) { -]+\.?[-]*$ ...
- spring笔记5 spring IOC的基础知识1
1,ioc的概念 Inverse of control ,控制反转,实际的意义是调用类对接口实现类的依赖,反转给第三方的容器管理,从而实现松散耦合: ioc的实现方式有三种,属性注入,构造函数注入,接 ...
- python之路目录
python开发[第一篇]:目录 python开发[第二篇]:python初体验 python开发[第三篇]:python基础之条件控制与循环 python开发[第四篇]:python基础之运算符 p ...
- 回顾java基础—Java数据类型
1 java数据类型.8种基本类型,3种引用类型 基本类型(也称:原始类型):byte.short.int.long.char.float.double.boolean 引用类型:类,接口,数组 2 ...
- 应用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)构建系统的整体方案
SSIO的更新 在SSIO上增加了UDP通讯方式,可以到Github上下载源代码.在原来的项目中,远端的设备与中心站的数据交互并没有使用过UDP方式.这种短连接的通讯链路,不容易维护,主要体现在:(1 ...
- Mybatis框架的多对一关联关系(六)
一.一对多的关联映射 一对多关联查询多表数据 1接口 public interface IDeptDAO { //根据部门编号查询该部门单个查询 public Emp getEmpById(Integ ...
- 如何在webapp中做出原生的ios下拉菜单效果
github:https://github.com/zhoushengmufc/iosselect webapp模仿ios下拉菜单 html下拉菜单select在安卓和IOS下表现不一样,iossel ...
- sass安装
第一步:下载ruby http://www.ruby-lang.org/zh_cn/downloads/ 第二步:安装ruby http://www.ruby-lang.org/zh_cn/docum ...
- JS函数声明的问题
三个例子 var a = 10; 2 function test(){ 3 a = 100; 4 console.log(a); 5 console.log(this.a); 6 var a; 7 c ...