简化Spring(3) Controller层

Struts与Webwork的扇子请跳过本篇。

MVC不就是把M、V、C分开么?至唯物朴素的做法是两个JSP一个负责View,一个负责Controller,再加一个负责Model的Java Bean,已经可以工作得很好,那时候一切都很简单。

而现在为了一些不是本质的功能,冒出这么多非标准的Web框架,实在让人一阵郁闷。像Ruby On Rails那样简捷开发,可用可不用,而且没有太多的限制需要学习的,比如Webwork这型还可以考虑。但像Struts那样越用框架越麻烦,或者像Tapestry那样有严重自闭倾向,额上凿着"高手专用玩具"的,用在团队里就是不负责任的行为了。

so,我的MVC方案是使用Spring MVC的Controller接口,写最普通的JavaBean作为Controller,本质就和当年拿JSP作Controller差不多,但拥有了Spring IOC的特性。

之所以用这么消极的选择标准,是因为觉得这一代MVC框架离重回RAD时代的标准还很远,注定了只是一段短暂的,过渡的技术,不值得投资太多精力和团队学习成本。

1. 原理

Spring MVC按植物分类学属于Martin Flower〈企业应用模式〉里的静态配置型Front Controler,使用DispatchServlet截获所有*.do的请求,按照xml文件的配置,调用对应的Command对象的handleRequest(request,response)函数,同时进行依赖对象的注入。

我们的Controller层,就是实现handleRequest(request,response)函数的普通JavaBean。

2. 优势

Spring MVC与struts相比的优势:

一是它的Controller有着从松到紧的类层次结构,用户可以选择实现只有一个HandleRequest()函数的接口,也可以使用它有很多回调函数的SimpleFormController类。

二是不需要Form Bean,也不需要Tapestry那所谓面向对象的页面对象,对于深怕类膨胀,改一个东西要动N个地方的人最适合不过。

三是不需要强XML配置文件,宣告式编程是好的,但如果强制成框架,什么都要在xml里面宣告,写的时候繁琐,看的时候也要代码配置两边看才能明白就比较麻烦了。

那Webwork呢?没有实战过,不过因为对MVC框架所求就不多,单用Spring MVC的Controller已经可以满足需求,就不多搞一套Webwork来给团队设坎,还有给日后维护,spring,ww2之间的版本升级添麻烦了。真有什么需要添加的,Spring MVC源代码量很少,很容易掌控和扩展。

3.化简

3.1. 直接implement Controller,实现handleRequest()函数

首先,simple form controller非我所好,一点都不simple。所以有时我会直接implement Controller接口。这个接口的唯一函数是供Front Controller调用的handleRequest(request,response)。

如果需要application对象,比如想用application.getRealPath()时,就要extends webApplicationObjectSupport。

3.2.每个Controler负责一组相关的action

我是坚决支持一个Controler负责多个action的,一个Controler一个action就像一个function一个类一样无聊。所以我用最传统的方式,用URL参数如msg="insert"把一组相关action交给一个Controler控制。ROR与制作中的Groovy On Rails都是这种模式,Spring也有MultiActionController支持。

以上三者都是把URL参数直接反射为Controller的函数,而Stripes的设计可用annotation标注url action到响应函数的映射。

3.3.xml宣告式编程的取舍

我的取舍很简单,反正Spring没有任何强制,我只在可能需要不重新编译而改变某些东西的时候,才把东西放在xml里动态注入。jsp路径之类的就统统收回到controller里面定义.

3.4.Data Binder

Data Binder是Controller的必有环节,对于Spring提供的DataBinder,照理完全可用,唯一不爽是对象如果有内嵌对象,如订单对象里面包含了Customer对象,Spring需要你先自行创建了Customer对象并把它赋给了Order对象,才可能实现order.customer.customer_no这样的绑定。我偷懒,又拿Jakarta BeanUtils出来自己做了一个Binder。

3.5.提取基类

最后还是忍不住提取了一个基类,负责MultiAction和其他一些简便的方法。Sprnig的MultiActionController做得太死,规定所有函数的第1,2个参数必须是request和response,不懂动态的,温柔的进行参数注入。

经过化简再化简,已经是很简单一个Java Bean ,任谁都可以轻松上手,即使某年某月技术的大潮把现在所有MVC框架都淹没了,也不至于没人识得维护。

时间: 2024-07-31 07:48:57

简化Spring(3) Controller层的相关文章

简化Spring(4) View层

同样的,Freemarker和Velocity爱好者请跳过本篇.与弃用webwork而单用Spring MVC Controller接口的理由一样,Freemarker本来是一样好东西,还跨界支持jsp 的taglib,而且得到了WebWork的全力支持,但为了它的非标准化,用户数量与IDE的缺乏,在View层我们还是使用了保守但人人会用,IDE友好的JSP2.0 配合JSTL. 对于B/S结构的企业应用软件来说,基本的页面不外两种,一种是填Form的,一种是DataGrid 数据列表管理的,再

简化Spring(2) Model层

因为Spring自带的sample离我们的实际项目很远,所以官方一点的model层模式展现就靠Appfuse了. 但Appfuse的model层总共有一个DAO接口.一个DAOImpl类.一个Service接口.一个ServiceImpl类.一个DataObject.....大概只有受惯了虐待的人才会欣然接受吧. 另外,Domain-Driven逢初一.十五也会被拿出来讨论一遍. 其实无论什么模式,都不过是一种人为的划分.抽象和封装.只要在团队里理解一致,自我感觉优雅就行了. 我的建议是,一开始

关于spring controller层的设计

问题描述 最近在做一个关于相册网站的项目,由于本人经验严重欠缺,需要各位大侠帮助一下.项目是基于Springmvc+ibatis+velocity的.项目大概划分为Dao层.Servic层.Domain层.Controller层等几个大层.比如Service层里有PhotoDao,AlbumDao等.Service层里面有PhotoService.AlbumService等.把各个Dao注入到相应Service层里.各个Controller里注入相应Service.比如说我要上传一张图片,将图片

spring 基于aop 实现日志输出 定义在controller层无效

问题描述 spring 基于aop 实现日志输出 定义在controller层无效 如题,具体详情还请各位高抬贵手猛搓下方连接(并非偷懒而是之前就在segmentfault发了问题,而且贴了代码,感觉给个地址更方便.)segmentfault传送门 解决方案 spring的AOP实现日志输出

简化spring(5)--减少不必要的基于接口编程

编程     众所周知,Spring是提倡基于接口编程的.    但也有些Service类,比如SaleOrderManager 和SaleOrderManagerImpl,只有5%的机会再有另一个Impl实现.95%时间里这两兄弟站一起,就像C++里的.h和.cpp,徒增维护的繁琐,所以刚开始用Spring的时候就想去掉它,今天偶然在群里聊起动态代理,算是搞明白了其中的道理,谢谢Sparkle :)      IOC是不会强制基于接口的,是这些Service类一般要使用Spring的声明式事务

mysql-spring mvc事物配置 如何将事物配在controller层

问题描述 spring mvc事物配置 如何将事物配在controller层 大神们,有谁知道如何将spring mvc的事物配置在controller层吗?我现在的一些插入逻辑写在了controller层.可是事物不起作用,谁能帮帮我啊 解决方案 将事务配置定义在Spring MVC的应用上下文(*-servlet.xml)中,将@Transactional注解打在Controller上 解决方案二: 最好不要在controller中写逻辑,写在service层用@Transactional注

表单-新手spring,controller没有被调用问题

问题描述 新手spring,controller没有被调用问题 在index.jsp上登录-->login.jsp页面. login.jsp上有两个静态的连接add.jsp和sel.jsp 然后点add.jsp 是一个添加用户的表单 输入数据提交后 没有任何显示 debug报: 2015-11-20 11:06:56,613 [http-bio-9090-exec-10] DEBUG [org.springframework.web.servlet.mvc.method.annotation.R

使用Spring邮件抽象层发送简单邮件

Spring提供了一个发送电子邮件的高级抽象层,它向用户屏蔽了底层邮件系统的一些细节,同时负责低层次的代表客户端的资源处理.Spring邮件抽象层的主要包为org.springframework.mail.它包括了发送电子邮件的主要接口MailSender和 封装了简单邮件的属性如from, to,cc, subject, text的值对象叫做SimpleMailMessage. 1.我们定义一个发送邮件的接口:OrderManager.java 1 public interface Order

2013/11/22工作随笔-缓存是放在Model层还是放在Controller层

web网站的典型代码框架就是MVC架构,Model层负责数据获取,Controller层负责逻辑控制,View层则负责展示. 一般数据获取是去mysql中获取数据 但是这里有个问题,我们不会每次请求都去mysql中获取,当并发量大的时候,我们希望mysql前面有层缓存做着. 这层缓存可能是redis,memcache,File等,但是这个逻辑代码是放在Controller中好还是Model中好呢? 放在Controller中: 好处:可以单个Controller进行控制,每个controller