Spring MVC分析

本文深入解析SpringMVC框架的设计理念与实现细节,包括其与传统Servlet的区别、如何进行请求映射、数据绑定与验证等功能,并介绍了自定义控制器的扩展方法。
Spring MVC
Author: 江南白衣

1.总体设计
MVC框架如Struts、Webwork,都在Servlet的基础上创建了一个自己的绝对空间,在自己的空间里定义MVC世界和规则。无论这个世界定义得是否漂亮,程序员都有一个学习世界的过程。

而Spring MVC则完全保留着Servlet概念中的request,response和session,并没有强制建立一个自己的概念模型(当然,他也有很烂的SimpleFormController,但你完全可以把它踢在一旁不管),也不强制需要FormBean和一堆XML定义。

同时,它透明完成了与Spring的集成,Multi-action的派发,提供了绑定request数据用的binder等基本API。

所以,如果想简单,使用Spring MVC的原始形态是一个很好的,类似于RoR中ActionPack的方案。

推荐使用一个Controller响应一组相关动作的MultiActionController。同时,虽然一点不喜欢FormController定义的概念模型,但还是不影响发挥拿来主义,在共性比较明显后台管理模块,定义MultiActionFormController,自动完成某些共同的Form流程。

你还是很喜欢WebWork?好在我们也提供了sample,见2.4 WebWork 。

2.写给在用其他MVC框架程序员的快速入门
也许,所有程序员都先放下自己框架里的概念模型,还原回一个JSP/Servlet程序员的角度,思考一个JSP/Servlet框架需要的功能。

0. 配置文件

Spring的配置文件默认为WEB-INF/xxxx-servelet.xml。

其中xxx为web.xml中org.springframework.web.servlet.DispatcherServlet的servlet-name。

1. 与Spring集成及IOC

天然兮,由DispatcherServlet完成。

2. Action及Multi-Action 分发

Spring将按照配置文件定义的URL,Mapping到具体Controller类,再根据URL里的action= xxx或其他参数,利用反射调用Controller里对应的Action方法。

3. 输入数据绑定

Spring提供Binder 通过名字的一一对应反射绑定Pojo,也可以直接从request.getParameter()取数据。

如果没有另外加入框架封装,需要手工调用Binder.

4. 输入数据验证

Sping 提供了Validator接口,而Spring Module还整合了Commons-Validaor 。

5. 结果数据放回View

有个ModelAndView的概念,代表了返回的View名及数据(Model,一个Map)。可以用modelAndView.addObject()放入数据。当然,也可以直接request.setAttribute()。

6. Interceptor

AOP概念,其实Servlet里面早有Filter概念,不过Inteceptor可以更灵活的Mapping,另提供postHandle的插入点

preHandle() handler开工之前。
postHandle() hander开工之后,但DispatchServlet还没有渲染页面。
afterCompletion() 一切完工之后。


7. Redirect,Forward页面及Token防止重复提交。

Spring提供 "redirect:index.jsp", "forward:index.jsp"这样的简写。

Spring Simple Form提供了防止重复提交的机制。

8. 如果想直接编写Response返回字符串, 而不是返回一个View

将函数的返回类型设为void,使用ss封装的 rendText(response,String text)函数。

3.Spring MVC Multi-action
3.1 基本配置
<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <property name="paramName"> <value>method</value> </property> <property name="defaultMethodName"> <value>index</value>
</property>
</bean>
以上配置将按xxx.do?method= list 将调用controller的list()方法

不过还要争取早日改为Web2.0式的写法./book/list.htm 要优于/book.do?action= list。

其余配置和其他Spring MVC配置差不多,请看bookstore-servlet.xml,留意下面几个关键节点
<bean id="exceptionResolver">
<bean id="methodNameResolver">
<bean id="viewResolver">
<bean id="urlMapping">(留意最新的urlMapping简写语法.)

4.SpringSide BaseController
继承于Spring的MultiActionController, 对其作了少量扩展--主要是对数据绑定的扩展,还加了一个SaveMessage函数。

1.对数据绑定的扩展:

a.InitBinder() 初始化Binder,注册日期类并允许数字类为空。

b.对Bind and Validate函数的再包装
本来Spring已有bind函数完成bind and validate, 但这个函数一来没有使用BindException作返回值而是抛出一个ServletException只好自己另外实现一个bindObject()函数。

c.另外稍稍扩展了一些函数使其更好用。

2.SaveMessage():

如果是redirect的关系,message信息放在request.attribute()就会丢失,SaveMessage()将其放在session。
配合messageFilter,在渲染页面前,把它从session又移回request。


5.后台管理通用的BaseManageController
Spring MVC中的SimpleFormController中的交互机制有值得参考的部分,但其只有一个onSubmit函数不能很好的表达CRUD的语义,所以将两者结合成Multi-ActionFormController是比较好的方法。通过约定命名,在基类实现list(),create()等函数和默认流程,而在子类实现onList(),onCreate()函数。

目前只是初步结合两者,还有很大的改进空间。

参考了RoR中的命名。BaseManageController即按照此命名定义基类。

list 显示对象列表的页面
create新增对象的输入界面
edit 修改对象的输入界面
show 只读显示对象detai的页面
save 新增对象的保存
update 修改对象的保存
remove 删除单个对象
removeAll 批量删除对象
query 查询
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值