领略Spring 3.x 时代的Spring MVC

2024-04-25 02:18
文章标签 java spring mvc 时代 领略

本文主要是介绍领略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中。

    上例再变通下:

@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代码

<form:form method="delete">  
<p class="submit"><input type="submit" value="Delete Pet"/></p> 
</form:form>

    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标准组件干成什么样?开源时代,至少我不愿意接受那种变态的潜规则。

 

    笔者早先常用Struts1.x框架,它搭配了一套自己的ActionForm,使得编程工作量增加,虽然可以变通使用自己的Pojo,但对于没有掌握J2EE底层工具类(BeanUtil)的开发人员来说,其类型匹配是非常复杂的事。事实上Spring MVC早在1.x版本就完全使用自己的pojo来对应表单的填充,配上属性编辑器,可以解决类型转换问题,完全实现领域模型驱动的设计模式。由于MVC层的控制器也是Spring容器的Bean而已,因此对整个项目的控制、扩展变得非常容易。同时上文也顺便点评了Struts2,可见Spring MVC在各类MVC框架的优势所在。本身罗德.约翰逊先生是设计模式高手,一个优秀的框架给我们带来的远远不只是开发效率,还有更先进的开发模式和理念...

 

 文澜阁社区 

这篇关于领略Spring 3.x 时代的Spring MVC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/933462

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows