[Spring] 轻巧使用 Spring-Controller

spring评价

    大家都知道,Spring MVC提供了一些功能齐全的Controller,并和Struts一样,为这些Controller配套了很多可配置、可扩展的东西,如 successView,validator,Bean绑定框架,ResourceBundle。但我的观点是:

   1.“可配置”性有意义吗?可配置是为了重用,但WEB层的东西能有几次重用?比起写一大堆配置文件的痛苦,追求一点点的重用有什么意义?

   2. 有必要把validator独立出来吗?几个Controller共用一个validator的情况并不多见,而且就算要共用,也可以把校验逻辑写在pojo里,而不是写在丑陋不堪的Spring-validator里

   3.Spring-Bind 通过字段级的绑定,可以在表单提交失败时给出具体的失败原因,提高用户体验,与resourceBundle结合使用还可以实现国际化。但是这个代价太大了,因为你要在表单页面中写很多 <spring-bind>这样的东西,而且,你的项目真的需要国际化吗?

   4.有些Form Controller很有框架的特点(半成品),但是用起来更不顺手。以SimpleFormController为例,你要另外定义一个Form Object,要告诉系统在请求form和提交form时分别作什么,而且程序还人为地把校验逻辑和业务逻辑调用彻底分成不同的阶段,既麻烦,又不灵活

简化使用

   在厌倦了这些烦人的东西之后,我开始简化地使用Spring MVC。最终我形成了自己的模式。这个模式的核心思想就是:Spring MVC仅用作URL映射和Bean注入,而它的Controller仅当作普通的Servlet,用request.getParameter()的方式获取输入,用POJO的风格来完成功能,既灵活,又舒服。具体来说:

 

   1.基本只用最简单的AbstractController。以表单处理为例,请求form用一个controller,提交form再用一个controller,把两个步骤分开,这样的代码都比较简洁,长度少了很多;采用了POJO风格编码,可读性也强了很多

   2.调用javabean的方法完成校验。既可在controller间重用,又维持了pojo风格

  

   3.successView 可以作为表单页面的隐藏变量传到controller中来,这样就不用写XML了。其实,大多数情况下,把successView写死在Controller的代码中就够了。不同功能模块共享Controller的情况是不多见的。

   4.校验异常,或者发现业务错误,直接throw Exception。然后用一个通用的处理error的JSP来处理所有Exception (这是Spring的功能),这个jsp里加上一个“返回”按钮,就可以方便用户在出错之后重新提交请求

 

     5.相近的请求让一个controller处理就够了(如添加用户、删除用户),这样的话写URL配置就只需要写一次。仍然可以只用AbstractController,然后用一个Http Parameter参数来区分请求即可。

  现在能想到的就是这么多,以后再补充

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.