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. 数据在页面上是一个扁 ...
随机推荐
- java netty socket库和自定义C#socket库利用protobuf进行通信完整实例
之前的文章讲述了socket通信的一些基本知识,已经本人自定义的C#版本的socket.和java netty 库的二次封装,但是没有真正的发表测试用例. 本文只是为了讲解利用protobuf 进行C ...
- IL实现简单的IOC容器
既然了解了IL的接口和动态类之间的知识,何不使用进来项目实验一下呢?而第一反应就是想到了平时经常说的IOC容器,在园子里搜索了一下也有这类型的文章http://www.cnblogs.com/kkll ...
- Java终止线程
Thread提供了stop()方法终止线程,但是该方法是强行终止,容易产生一些错误,已经被废弃. 可以使用退出标志来终止线程,在run()函数里面设置while循环,把退出标志作为while的条件,当 ...
- hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN&q ...
- Java - 网络编程
Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh. 参考:
- Mybatis框架的多对一关联关系(六)
一.一对多的关联映射 一对多关联查询多表数据 1接口 public interface IDeptDAO { //根据部门编号查询该部门单个查询 public Emp getEmpById(Integ ...
- windows go安装
1.安装git 因为golang是通过git来管理远程包的,所以我们首先要安装git,下载地址:http://www.git-scm.com/download/. git安装比较简单,直接下一步即可( ...
- 关于MySQL数据库优化的部分整理
在之前我写过一篇关于这个方面的文章 <[原创]为什么使用数据索引能提高效率?(本文针对mysql进行概述)(更新)> 这次,主要侧重点讲下两种常用存储引擎. 我们一般从两个方面进行MySQ ...
- ListView和Adapter数据适配器的简单介绍
ListView 显示大量相同格式数据 常用属性: listSelector listView每项在选中.按下等不同状态时的Drawable divider ...
- webservice入门实例,CXF方式
1.下载CXF,及先关jar包. CXF 下载地址:http://cxf.apache.org/download.html,选择"File"列中的zip格式下载.解压后可以看到一些 ...