`
liangfeng366
  • 浏览: 76793 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

@mvc的注意的地方

阅读更多
把@RequestMapping放在类级别上是合法的,这可令它与方法级别上的@RequestMapping注解协同工作,取得缩小选择范围的效果,下面是一些例子。

类级别:

RequestMapping("/accounts/*")方法级别:

@RequestMapping(value="delete", method=RequestMethod.POST)
@RequestMapping(value="index", method=RequestMethod.GET, params="type=checking")
@RequestMapping

第一个方法级的请求映射和类级别的映射结合,当HTTP方法是POST时与路径“/accounts/delete”匹配;第二个添加了一个要求,就是名为“type”的请求参数和其值“checking”都需要在请求中出现;第三个根本就没有指定路径,这个方法匹配所有的 HTTP方法,如果有必要的话可以用它的方法名。下面改写我们的方法,使它可以依靠方法名进行匹配,程序如下:

@Controller @RequestMapping("/accounts/*") public class AccountsController {    @RequestMapping(method=RequestMethod.GET)    public void show(@RequestParam("number") String number, Map<String, Object> model)   {       model.put("account", accountRepository.findAccount(number));    }    ...方法匹配的请求是“/accounts/show”,依据的是类级别的@RequestMapping指定的匹配路径“/accounts/*”和方法名“show”。

消除类级别的请求映射
Web层注解频遭诟病是有事实依据的,那就是嵌入源代码的URI路径。这个问题很好矫正,URI路径和控制器类之间的匹配关系用XML配置文件去管理,只在方法级的映射中使用@RequestMapping注解。
我们将配置一个ControllerClassNameHandlerMapping,它使用依赖控制器类名字的惯例,将URI映射到控制器:

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>现在“/accounts/*”这样的请求都被匹配到AccountsController上,它与方法级别上的@RequestMapping注解协作的很好,只要添加上方法名就能够完成上述映射。此外,既然我们的方法并不会返回视图名称,我们现在就可以依据惯例匹配类名、方法名、URI路径和视图名。

当@Controller被完全转换为@MVC后,程序的写法如下:

@Controller public class AccountsController {     private AccountRepository accountRepository;     @Autowired    public AccountsController(AccountRepository accountRepository) {       this.accountRepository = accountRepository;    }     @RequestMapping(method=RequestMethod.GET)    public void show(@RequestParam("number") String number, Map<String, Object> model)   {       model.put("account", accountRepository.findAccount(number));    }    ...对应的XML配置文件如下:

<context:component-scan base-package="com.abc.accounts"/>  <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">    <property name="prefix" value="/WEB-INF/views/" />    <property name="suffix" value=".jsp" /> </bean>你可以看出这是一个最精减的XML。程序里注解中没有嵌入URI路径,也没有显式指定视图名,请求处理方法也只有很简单的一行,方法签名与我们的需求精准匹配,其它的请求处理方法也很容易添加。不需要基类,也不需要XML(至少也是没有直接配置控制器),我们就能获得上述所有优势。

也许接下来你就可以看到,这种程序设计模型是多么有效了。

[size=x-large]惯例优先原则(convention over configuration)
对于很多项目来说,遵从已有的惯例和使用合理的缺省选项大概是最合情合理的做法。现在Spring Web MVC框架也明确支持这种惯例优先的配置。具体来说,如果你在项目中遵守一定的惯例(比如命名规范),你可以显著地减少系统需要的配置(比如处理器映射,视图解析器配置,ModelAndView的声明,等等)。这对快速系统建模(rapid prototyping)是非常有利的。如果你打算进一步把模型完成为可以工作的系统,这样写出的代码也具有很好的一致性。

提示
Spring的开发包中有一个web应用的范例。这个范例演示了这一节提到的惯例优先原则。你可以在samples/showcases/mvc-convention目录中找到这个范例。

This convention over configuration support address the three core areas of MVC - namely, the models, views, and controllers.

Spring对惯例优先原则的支持体现在MVC的3个核心领域:模型、视图和控制器。

13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping
ControllerClassNameHandlerMapping是HandlerMapping接口的一个实现。它检查请求的URL,然后通过惯例来决定与之相对应的控制器。

比如,下面有个非常简单的控制器实现,请特别注意这个类的名字。

public class ViewShoppingCartController implements Controller {    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {        // the implementation is not hugely important for this example...    }}下文是从Spring Web MVC 框架的配置文件中选出来的一段:

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping "/>                <bean id="viewShoppingCart" class="x.y.z.ViewShoppingCartController">    <!-- inject dependencies as required... --></bean>ControllerClassNameHandlerMapping在应用的上下文中找出所有的请求处理器(handler)(或实现了Controller接口的)bean。把这些bean的名字中Controller后缀去掉,就得到了每个控制器所能处理的URL。

让我们通过举例来进一步解释这个映射的工作原理。

WelcomeController映射到'/welcome*'这个URL

HomeController映射到'/home*'这个URL

IndexController映射到'/index*'这个URL

RegisterController映射到'/register*'这个URL

DisplayShoppingCartController映射到'/displayshoppingcart*'这个URL

(注意字母的大小写。URL全部都用小写,但在Java类名中每个单词的第一个字母要大写。)

当控制器是MultiActionController的子类时,自动生成的映射就稍有点复杂,但应该还是比较好理解的。下面例子中这几个控制器都是MultiActionController。

AdminController映射到 '/admin/*' 这个URL。

CatalogController映射到 '/catalog/*' 这个URL。

如果你的控制器类遵守这些命名规范(xxxController),ControllerClassNameHandlerMapping可以自动生成映射,这样你就不必费劲的定义和维护一长串SimpleUrlHandlerMapping(或者类似的映射策略)。

ControllerClassNameHandlerMapping是AbstractHandlerMapping的子类,所以你仍旧可以像对待其他HandlerMapping实例一样来定义HandlerInterceptor的实例。

13.11.2. 对模型的支持:ModelMap (ModelAndView)
ModelMap是一个加强版的Map实现。在这个Map里,每个对象的键都遵守一个命名规范,然后这些对象就可以显示在视图中。这个类的使用其实很简单,不需要长篇大论。下面让我们看几个例子,然后我们结合例子进行讲解。

下面是一个Controller的实现。请注意当我们把对象加到ModelAndView时,我们不需要声明每个对象的键名。

public class DisplayShoppingCartController implements Controller {    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {                List cartItems = // get a List of CartItem objects        User user = // get the User doing the shopping                ModelAndView mav = new ModelAndView("displayShoppingCart"); <-- the logical view name        mav.addObject(cartItems); <-- look ma, no name, just the object        mav.addObject(user); <-- and a'ain ma!        return mav;    }}ModelAndView在内部使用了ModelMap。ModelMap是一个自定义的Map实现,它可以为加入其中的每个对象自动生成一个键名。这些键名是有规律的。当存入的对象是存储单值的对象(scalar object),比如User,生成的键名就是对象的类名(不包括包的名字)。下面几个例子详细解释了这个命名规范:

x.y.User这个类的实例对应user。

x.y.Registration 这个类的实例对应registration

x.y.Foo这个类的实例对应foo

java.util.HashMap的实例对应hashMap(在这种情况下你最好还是自己声明键名,hashMap这个名字不那么直观)

当你视图把null这个值加入Map时,你会得到IllegalArgumentException。 所以如果你的某个对象可能为null,你最好也自己声明键名。

什么?不能自动生成复数?

Spring Web MVC框架对惯例优先原则的支持不包括自动生成模型名字的复数。这意味着,当你把一个由Person对象组成的List加入ModelAndView时,不要指望Spring生成的键名会是people。

这是经过一系列讨论之后作出的决定。这样做符合“最少意外原则(Principle of Least Surprise)”。

当你加入ModelAndView中的对象是Set、List或者数组时,Spring会检查这个集合,取出这个集合中的第一个对象,然后用它的类名,加上List后缀,就是最终生成的名字。下面几个例子进一步解释了这个命名规则:

一个由 x.y.User组成的数组对应userList这个名字。

一个由x.y.Foo组成的数组对应fooList这个名字。

一个由x.y.User组成的java.util.ArrayList对应userList这个名字。

一个由x.y.Foo组成的java.util.HashSet对应fooList这个名字。

一个空的java.util.ArrayList根本不可能被加到这个Map中。(在这种情况下,adObject(..)其实什么都没做)。

13.11.3. 对视图的支持: RequestToViewNameTranslator
RequestToViewNameTranslator这个接口的功能是自动寻找请求所对应的视图名(当某个视图名没有明确配置的时候)。这个接口目前只有一个实现,类名为DefaultRequestToViewNameTranslator。

为了解释DefaultRequestToViewNameTranslator是如何将请求的URL映射到视图名,最好的方法就是举例说明。下面是一个Controller的实现,和它对应的配置文件。

public class RegistrationController implements Controller {                    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {        // process the request...        ModelAndView mav = new ModelAndView();        // add data as necessary to the model...        return mav;        // notice that no View or logical view name has been set    }}<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"        "http://www.springframework.org/dtd/spring-beans-2.0.dtd"><beans>    <!-- this bean with the well known name generates view names for us -->    <bean id="viewNameTranslator" class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator"/>    <bean class="x.y.RegistrationControllerController">        <!-- inject dependencies as necessary -->    </bean>        <!-- maps request URLs to Controller names -->    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver ">        <property name="prefix" value="/WEB-INF/jsp/"/>        <property name="suffix" value=".jsp"/>    </bean></beans>请注意,在这个handleRequest(..)方法中,返回的ModelAndView实例不包含View的实例或者逻辑视图名。真正从请求的URL中分析出逻辑视图名(logical view name)的是DefaultRequestToViewNameTranslator。在上面这个例子中,RegistrationControllerController和ControllerClassNameHandlerMapping在一起使用,所有对http://localhost/registration.html这个URL的请求将会对应registration这个逻辑视图名。这个视图名正是由DefaultRequestToViewNameTranslator解析出来的。然后,InternalResourceViewResolver这个bean会将这个逻辑视图名进一步解析成/WEB-INF/jsp/registration.jsp这个视图。

提示
你甚至不需要配置类型为DefaultRequestToViewNameTranslator的bean。如果DefaultRequestToViewNameTranslator的缺省行为已经符合你的要求,你就可以使用这个类。当你没有明确声明时,Spring Web MVC 中DispatcherServlet这个类会自动生成一个DefaultRequestToViewNameTranslator的实例。

当然,如果你有自己特殊的要求,你就需要配置DefaultRequestToViewNameTranslator bean。如果你需要知道这个类有哪些可以设置的参数,请参阅DefaultRequestToViewNameTranslator的Javadoc
。[/[/size]size][[/color]color=cyan]http://blog.csdn.net/dengqf/archive/2008/11/19/3333597.aspx[/color]
分享到:
评论
1 楼 向日葵上的小蜜蜂 2014-08-13  
  你用这种字体颜色,你考虑过看的人的感受吗

相关推荐

    spring MVC要注意的地方

    NULL 博文链接:https://hw1287789687.iteye.com/blog/1947150

    基于ASP.NET MVC3与三层架构的电子商城源码2012929

    前台页面: 海产品 茗茶 茗酒 宝石 陶瓷 地方特产 后台管理: 文章管理 文章列表 文章分类 商品管理 商品列表 商品分类 系统管理 用户管理 注意: 开发环境为Visual Studio 2010,数据库为SQL Server 2008r2

    pureMVC最佳实践

    pureMVC最佳实践,详细的介绍了PureMVC的原理、使用方式及需要注意的地方,非常的不错哦

    基于ASP.NET MVC3与三层架构的电子商城源码

    本代码完全基于ASP.NET MVC3+EF+三层构架,主要功能分为: 所有页面美工均为作者独立完成,系统开发于1年前,稳定运行良好。 系统目前通过几乎所有PC端浏览器(IE6|7|8|9、火狐、谷歌浏览器、Opera) 以及含Linux...

    Sring MVC 组件类注解理解

    根据自己的学习过程详细整理了 Spring使用中常用的注解大全和解释,及学习参看的网址资料; 方便大家学习这块相关内容使用使用,并对需要注意的地方做了标注;

    基于NClay MVC框架的个人blog程序(开源)

    该程序是完全基本NClay MVC框架进行开发的个人blog程序。 注意: NClay框架并不提供源码。 程序也不会有任何技术支持。 程序是完全开源没有任何使用限制,可以随意修改和发布 程序部署站点:...

    外文翻译 stus MVC

    Struts——an open-source MVC implementation This article introduces Struts, a Model-View-Controller implementation that uses servlets and JavaServer Pages (JSP) technology. Struts can help you control...

    express-mvc:轻量级的mvc模式,用于具有最小依赖性的express框架

    Express MVC generator命令将被全局安装,因此您可以在任何地方调用它以生成项目框架。 express-mvc-generate my-project cd my-project npm install npm start 默认情况下,将在端口3000上创建服务器。 您可以...

    mvc_pattern:Flutter插件可实现MVC设计模式的众多变体之一

    mvc_pattern 请注意,框架包, ,用途mvc_pattern其核心。 软件包允许更轻松(我敢说),更快的开发和更好的可维护性。 借助内置的功能和功能,无需“重新发明轮子”。 容纳和集成功能: 错误处理系统偏好设定程序...

    asp.net mvc 实现文件上传带进度条的思路与方法

    前言 文件上传与下载的操作在实际项目中经常是很重要的一个内容,在使用ASP.NET Web Form的时候我们可以使用诸多的服务器控件,FileIpload就是其中之一,但是在ASP.NET不建议使用...注意:不能使用session来保存进度

    MVC、前端控制器、服务工作者三种模式写的jsp企业职员信息管理

    这是本人课程设计的一个j2ee项目,里面包含完整的文档、代码和安装手册。 本项目使用用JSP语言作为根本,选用经典的Tomcat作为服务器平台,采用...5.4 测试中其他要注意的地方 36 5.5 员工管理系统的测试 36 6、总结 37

    spring boot+mybatis+spring mvc+bootstrap开发停车位管理系统(调用百度地图API).zip

    随着时代和科技的进步,人们的生活水平越来越高,私家车的数量不断上涨,随之产生了一些问题,其中就包括停车难,很多地方人们根本找不到停车位,经常有司机为了找停车位转来转去,走了很多弯路,更重要的是浪费了...

    ASP.NET MVC文件上传教程(二)

    上文ASP.NET MVC 文件上传教程(一)我们讲了简单的上传以及需要注意的地方,查相关资料时,感觉上传里面涉及到的内容还是比较多,于是就将上传这一块分为几节来处理,同时后续也会讲到关于做上传时遗漏的C#应该注意...

    twiliochat-csharp:使用 ASP.NET MVC 的 Twilio Chat 的 C# 实现

    注意:您需要带有Visual Studio的Windows环境才能运行此项目。 由于此项目是使用 .NET Framework 4.5 制作的,因此它与 .NET Core 不兼容,因此必须在 Windows 上运行。 克隆这个存储库并cd到它的目录中: git ...

    浅谈ASP.NET MVC应用程序的安全性

    web应用程序的安全性算是一个老生常谈的问题了,当然asp.net mvc也不例外,虽然他在设计之初就对此有了一些防范,但是还是要差很多,有很多地方需要我们程序猿们注意的地方,我们今天就来简单的探讨下

    WritersBlock.MVC

    WriterBlock.MVC 作家的红色方块徽章自述文件作家区是一个共享的工作区,自出版作家可以在其中共同编辑和校对其作品。 不幸的是,拥有写作才能不会使一个人成为编辑。 同样,并不是每个人都能负担得起编辑进行项目的...

    heryerkaktus:PHP的MVC

    某个地方(heroku等)将被部署 要求 Bootstrap将用于该接口。 该项目将使用本地php编写。 它将使用面向对象的编程方法来完成。 应注意名称空间的使用。 必须建立自动装带器结构。 (最好是作曲家) 异常将得到...

    (毕业设计)-基于Springboot开发停车位管理系统(调用百度地图API)设计与实现(源码).zip

    随着时代和科技的进步,人们的生活水平越来越高,私家车的数量不断上涨,随之产生了一些问题,其中就包括停车难,很多地方人们根本找不到停车位,经常有司机为了找停车位转来转去,走了很多弯路,更重要的是浪费了...

    Spring MVC中上传文件实例

    SpringMVC(注解)上传文件需要注意的几个地方: 1、form的enctype=”multipart/form-data”,这个是上传文件必须的 2、applicationContext.xml配置: 代码如下: &lt;!– SpringMVC上传文件时,需要配置Multipart...

Global site tag (gtag.js) - Google Analytics