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. 数据在页面上是一个扁 ...
随机推荐
- 如果你也会C#,那不妨了解下F#(3):F#集合类型和其他核心类型
本文链接:http://www.cnblogs.com/hjklin/p/fs-for-cs-dev-3.html 在第一篇中,我们介绍了一些基础数据类型,其实那篇标题中不应该含有"F#&q ...
- Visual Studio 2013 Ultimate因为CodeLens功能导致Microsoft.Alm.Shared.Remoting.RemoteContainer.dll高CPU占用率的折中解决方案
1.为什么Microsoft.Alm.Shared.Remoting.RemoteContainer.dll的CPU占用率以及内存使用率会那么高? 在Visual Studio 2013 Ultima ...
- asp.net实现图片在线上传并在线裁剪
1.说明 接上一篇文章uploadify实现多附件上传完成后,又突然用到头像上传并在线裁剪.在网上找个众多例子都没有符合要求的,有一篇文章写的不错,就是文旺老兄写的这篇Asp.Net平台下的图片在线裁 ...
- JDBC 制作简单的登录验证
两种方法: 一.直接拼接到SQL语句 public static void main(String[] args) throws Exception{ //输入账号密码 Scanner sc = ne ...
- OS存储管理——FIFO,LRU,OPT命中率
课程设计课题 存储管理程序设计 摘 要 虚拟存储器作为现代操作系统中存储管理的一项重要技术,实现了内存扩充功能.而分页请求分页系统正好可以完美的支持虚拟存储器功能,它具有请求调页功能和页面置换功能.在 ...
- 用jmeter通过ssl验证访问https
找了一个支付宝的网站尝试.https://memberprod.alipay.com/account/reg/index.htm 我用的是chrome,点这个小锁 如果是IE也可以在网页上右键,属性, ...
- echarts学习总结
ECharts学习总结使用步骤1 引入ECharts <script src="echarts.min.js"></script>2 绘制一个简单的图表 为 ...
- 很强大的HTML+CSS+JS面试题(附带答案)
一.单项选择(165题) 1.HTML是什么意思? A)高级文本语言 B)超文本标记语言 C)扩展标记语言 D)图形化标记语言 2.浏览器针对于HTML文档起到了什么作用? A)浏览器用于创建HTML ...
- win10家庭版查看已连接wifi密码
点击屏幕右下角无线网路图标. 点击网络设置. 完成.
- window7 桌面新建快捷方式方法
点击开始按钮 所有程序 找到某个文件夹点开,找到文件夹里的快捷方式图标,右键--属性-- 复制 目标:上图蓝色内容. 回到桌面,右键--新建--快捷方式--把复制的内容粘贴到 请键入对象的位置-- ...