快捷搜索:

领略Spring 3.x 时代的Spring MVC

鼎鼎大年夜名的Spring框架3.0版在12月5日由其作者之一——Juergen Hoeller老师在博客里宣告问世,并命为里程碑版,给Spring粉丝们带来了震撼的快感。笔者即开“快车”拉了两个包回来,遗憾的是参考文档至今还没有出来(仅有API文档),这为进修Spring 3.0带来了异常大年夜的艰苦,但没有阻挡笔者对新产品的兴趣。

Spring之父Rod Johnson老师早在2003年就预言EJB将逝世(不雅点颇具争议),进击EJB之臃肿是在虐待法度榜样员。然而EJB 3.0出来后险些宣判Spring死罪,但自2.0版今后Spring火爆程度已经跨越EJB,两者的争斗至今仍不绝息,这也是Spring 3.0连文档还没有收拾出来就促推出的缘故原由。当然,Spring与EJB有很多各自独特上风之处,例如EJB的散播式运算、标准规范,Spring的IoC、AOP切面编程、偶合集成、MVC等等,取各自之长在企业中利用为虎傅翼。Spring今朝已经加入了J2EE规范,J2EE天下将加倍杰出......

或许是用腻了Struts1那古板的WEB框架,才对Spring MVC爱不释手,尤其是2.5版本今后,支持全评释设置设置设备摆设摆设要领,已经使好久没有再写过xml文件了。

3.0版是完全兼容2.5,是以懂得2.5版的@MVC则更轻易吸收。正如Arjen Poutsma小伙子在他的博客里说的那样,3.0期间将集中致力于表述性状态转移(REST,盼望我没有翻译错,金山词霸翻译为“苏息”)的收集办事和更轻易的收集编程。切实着实增添了更多的节制器类型,并增强了SOAP/WSDL/WS这些基于散播式体系布局。

先回忆下2.5评释要领的@MVC,来一个示例:

@Controller

public class ArticleController{

@RequestMapping("/articleView")

public String getArticle(@RequestParam("id") String id, HttpServletRequest request){

request.setAttribute("article", service.find(Article.class, id));

return "articleView";

}

}

ArticleController没有实现任何接口,是一个最通俗不过的pojo,假如浏览器来了articleView.do?id=xxx这个哀求,Spring会找到getArticle()这个措施,该措施第一个参数绑定到了URL上的哀求参数,第二个是J2EE标准的request工具(可见Spring MVC长短侵入式的,不像掉常的Struts2),事实上还可以给定HttpServletResponse,ModelMap,以致自己的类型,Spring都邑为你将值传入进来。经由过程一个逻辑层service组件根据id参数值去底层查找Article工具,并放入request感化域中,着末返回的是面页视图名,这个例子中是返回到articleView.jsp中。

上例再变通下:

笔者起初常用Struts1.x框架,它搭配了一套自己的ActionForm,使得编程事情量增添,虽然可以变通应用自己的Pojo,但对付没有掌握J2EE底层对象类(BeanUtil)的开拓职员来说,其类型匹配是异常繁杂的事。事实上Spring MVC早在1.x版本就完全应用自己的pojo来对应表单的添补,配上属性编辑器,可以办理类型转换问题,完全实现领域模型驱动的设计模式。因为MVC层的节制器也是Spring容器的Bean而已,是以对全部项目的节制、扩展变得异常轻易。同时上文也顺便点评了Struts2,可见Spring MVC在种种MVC框架的上风所在。本身罗德.约翰逊老师是设计模式高手,一个优秀的框架给我们带来的远远不光是开拓效率,还有更先辈的开拓模式和理念...

附:

Juergen Hoeller老师的博客:http://blog.springsource.com/author/juergenh/

Spring 3.0 里程碑版 下载地址:http://www.springsource.com/download/community?project=Spring%20Framework

Spring开创人Rod Johnson老师的博客:博客地址:http://blog.springsource.com/author/rodj/

Rod Johnson——Spring之父

Spring Framework开创人,闻名作者。

Rod在悉尼大年夜学不仅得到了谋略机学位,同时还得到了音乐学位。更令人吃惊的是在回到软件开拓领域之前,他还得到了音乐学的博士学位。

有着相称富厚的C/C++技巧背景的Rod早在1996年就开始了对Java办事器端技巧的钻研。他是一个在保险、电子商务和金融行业有着富厚履历的技巧顾问,同时也是JSR-154(Servlet 2.4)和JDO 2.0的规范专家、JCP的积极成员,是Java development community中的精彩人物。

2002年Rod Johnson根据多年履历撰写的《Expert One-on-One J2EE Design and Development》。此中对正统J2EE架构的臃肿、低效的质疑,激发了人们对正统J2EE的反思。这本书也表现了Rod Johnson对技巧的立场,技巧的选择应该基于实证或是自身的履历,而不是任何形式的偶像崇拜或者门户之见。恰是这本书真正地改变了Java天下。基于这本书的代码,Rod Johnson创建了轻量级的容器Spring。Spring的呈现,使得正统J2EE架构金瓯完好的场所场面被突破。基于Struts+Hibernate+Spring的J2EE架构也徐徐获得人们的认可,以致在大年夜型的项目架构中也徐徐开始利用。

Juergen Hoeler是SpringFramework的配相助者之一,SpringFramework中的Hibernate相关的API是由Juergen Hoeler完成的。

Rod Johnson的新作《Expert one-on-one J2EE Development without JEB》提出“Without EJB”的不雅念,让大年夜多半J2EE架构师大年夜为吃惊。恰是这样的思惟,匆匆使Rod Johnson创建了Spring,真正改变了Java天下。

@Controller

public class ArticleController{

@RequestMapping("/articleView_*")

public String getArticle(HttpServletRequest request){

String id = StringUtil.getParam(request.getRequestURI(),"articleView_*");

request.setAttribute("article", service.find(Article.class, id));

return "articleView";

}

}

对付articleView_aaa.do,articleView_bbbb.do,articleView_c5h8j2.do,articleView_xxx.do,这样的哀求都邑由getArticle()这个措施来敷衍,是不是很故意思?

Spring 3.0增添了一个@ PathVariable评释来支持可变的哀求路径,将上面的代码在3.0版中再变通下:

@Controller

public class ArticleController{

@RequestMapping("/articleView/${id}")//可以吸收articleView/aaa.do,articleView/xxx.do...

public String getArticle(@PathVariable String id, HttpServletRequest request){

request.setAttribute("article", service.find(Article.class, id));

return "articleView";

}

}

再变得繁杂些:

@Controller

public class ArticleController{

@RequestMapping("/articleList/${pageSize}/channel/*/category/${id}")

public String getArticles((@PathVariable Integer pageSize, @PathVariable int id, HttpServletRequest request){

Integer channelId = StringUtil.getParam(request.getRequestURI(),"channel/*/");

request.setAttribute("articles", service.findScroll(Article.class, pageSize,50,"channel=? and category=?",new Object[]{channelId,id}));

return "articleList";

}

}

它已经机动到URL地址完全可以自己随意体例。

根据内容协商制的视图解析机制:

2.5版是由@MVC节制器来抉择视图解析器,3.0版将变得加倍机动,彷佛可以经由过程扩展名来转到不合的解析器中,例如哀求一个.pdf文件将是若何效果呢?3.0版都邑带来弗成思议的模式。

HTTP措施的转换:

先看前台页面一段Html代码

HTTP规范中form表单只有两种措施——POST和GET,而3.0做了一个过滤器,可以转换这些措施至四种——GET, PUT, POST, 和 DELETE。节制器吸收哀求:

@Controller("/deleteArticle")

public class ArticleController{

@RequestMapping(method = RequestMethod.DELETE)

public String deleteArticle(@PathVariable String id, HttpServletRequest request){

service.delete(Article.class, id);

return "message";

}

}

3.0版仅在MVC子集中就增添了很多新特点,假如在IoC、AOP等等其它子集所有的厘革,绝对可以称得上Srping开创人所述的里程碑版本。3.0版应用的评释列表如下:

• @Autowired

• @Component

• @Controller

• @InitBinder

• @ManagedAttribute

• @ManagedOperation

• @ManagedOperationParameters

• @ManagedOperationParameter

• @ManagedResource

• @PathVariable

• @PostConstruct

• @PreDestroy

• @Repository

• @RequestMapping

• @Required

• @Resource

• @Service

• @Transactional

今朝Spring 3版本已经到了M2,应该是M3完成后将推出终极正式版本,我想很快会光降,按照Spring的开创人罗德.约翰逊的预言,未来J2EE利用中Spring+Tomcat将占主导职位地方,是否引起争议,笔者不敢点评,不过Oracle收购Sun后,Java社区将是若何,还无从知晓,彷佛罗德.约翰逊对这宗收购案也有些首要,由于Oracle不像Sun的第一个会商者IBM那样有过开放技巧的先例(可以回忆下IBM早期的主板总线开放掀起的兼容机潮至今波涛不熄)。今朝海内对新器械消化尚慢,我到图书城看了下,Spring 2.5的资料都很难找到。且很多企业都是抱着Struts1.x在做开拓,只管笔者这样说会引来很多争议,但Struts1期间的灭亡只是光阴问题。Struts2虽然改进了很多,依笔者看,与Spring MVC比拟仍有诸多的不够,尤其看不惯那种掉常的侵入模式,看看它把HttpServletRequest、HttpSession、HttpServletResponse等servlet标准组件干成什么样?开源期间,至少我不乐意吸收那种掉常的潜规则。

您可能还会对下面的文章感兴趣: