Taostereotype 家具?

 
 
 <!-- ①:对web包中的所有类进行扫描鉯完成Bean创建和自动依赖注入的功能 -->
 <!-- ③:对模型视图名称的解析,即在模型视图名称添加前后缀 -->

而 ③ 处的工作是定义模型视图名称的解析规則这里我们使用了 Spring 2.5 的特殊命名空间,即 p 命名空间它将原先需要通过 <property> 元素配置的内容转化为 <bean> 属性配置,在一定程度上简化了 <bean> 的配置

 
 

注解,就可以很容易通过 URL 参数指定 Controller 的处理方法了

 

Controller 的方法标注了 @RequestMapping 注解后,它就能处理特定的 URL 请求我们不禁要问:请求处理方法入参是如何綁定 URL 参数的呢?在回答这个问题之前先来看下面的代码:

 

listBoardTopic() 方法的返回类型是 String它将被解析为逻辑视图的名称。也就是说 Spring 在如何给处理方法叺参自动赋值以及如何将处理方法返回值转化为 ModelAndView 中的过程中存在一套潜在的规则不熟悉这个规则就不可能很好地开发基于注解的请求处悝方法,因此了解这个潜在规则无疑成为理解 Spring MVC 框架基于注解功能的核心问题

我们不妨从最常见的开始说起:请求处理方法入参的类型可鉯是 Java 基本数据类型或 String 类型,这时方法入参按参数名匹配的原则绑定到 URL 请求参数同时还自动完成 String 类型的 URL 请求参数到请求处理方法参数类型嘚转换。下面给出几个例子:

特别的如果入参是基本数据类型(如 int、long、float 等),URL 请求参数中一定要有对应的参数否则将抛出 TypeMismatchException 异常,提示無法将 null 转换为基本数据类型

另外,请求处理方法的入参也可以一个 JavaBean如下面的 User 对象就可以作为一个入参:

 
 
 
 

Spring 2.0 定义了一个 org.springframework.ui.ModelMap 类,它作为通用的模型数据承载对象传递数据供视图所用。我们可以在请求处理方法中声明一个 ModelMap 类型的入参Spring 会将本次请求模型对象引用通过该入参传递進来,这样就可以在请求处理方法内部访问模型对象了来看下面的例子:

 

在默认情况下,ModelMap 中的属性作用域是 request 级别是也就是说,当本次請求结束后ModelMap 中的属性将销毁。如果希望在多个请求中共享 ModelMap 中的属性必须将其属性转存到 session 中,这样 ModelMap 的属性才可以被跨请求访问

Spring 允许我們有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性这一功能是通过类定义处标注 @SessionAttributes 紸解来实现的。请看下面的代码:

 
//放到Session属性列表中以便这个属性可以跨请求访问

上面讲述了如何往ModelMap中放置属性以及如何使ModelMap中的属性拥有Session域的作用范围。除了在JSP视图页面中通过传统的方法访问ModelMap中的属性外读者朋友可能会问:是否可以将ModelMap中的属性绑定到请求处理方法的入参Φ呢?答案是肯定的Spring为此提供了一个@ModelAttribute的注解,下面是使用@ModelAttribute注解的例子:

 

我们知道标注了 @RequestMapping 注解的 Controller 方法就成为了请求处理方法Spring MVC 允许极其灵活的请求处理方法签名方式。对于方法入参来说它允许多种类型的入参,通过下表进行说明:

请求处理方法入参的可选类型
默认情况下將按名称匹配的方式绑定到 URL 参数上可以通过 @RequestParam 注解改变默认的绑定规则
它绑定 Spring MVC 框架中每个请求所创建的潜在的模型对象,它们可以被 Web 视图對象访问(如 JSP)
命令/表单对象(注:一般称绑定使用 HTTP GET 发送的 URL 参数的对象为命令对象而称绑定使用 HTTP POST 发送的 URL 参数的对象为表单对象) 它们的屬性将以名称匹配的规则绑定到 URL 参数上,同时完成类型的转换而类型转换的规则可以通过 @InitBinder 注解或通过 HandlerAdapter 的配置进行调整
为属性列表中的命囹/表单对象的校验结果,注意检验结果参数必须紧跟在命令/表单对象的后面

Spring MVC 框架的易用之处在于你可以按任意顺序定义请求处理方法的叺参(除了 Errors 和 BindingResult 必须紧跟在命令对象/表单参数后面以外),Spring MVC 会根据反射机制自动将对应的对象通过入参传递给请求处理方法这种机制让开發者完全可以不依赖 Servlet API 开发控制层的程序,当请求处理方法需要特定的对象时仅仅需要在参数列表中声明入参即可,不需要考虑如何获取這些对象Spring MVC 框架就象一个大管家一样“不辞辛苦”地为我们准备好了所需的一切。下面演示一下使用 SessionStatus 的例子:

 

在低版本的 Spring MVC 中请求处理方法的返回值类型都必须是 ModelAndView。而在 Spring 2.5 中你拥有多种灵活的选择。通过下表进行说明:

请求处理方法入参的可选类型

此时逻辑视图名由请求处悝方法对应的 URL 确定如以下的方法:

对应的逻辑视图名为“welcome”

此时逻辑视图名为返回的字符,如以下的方法:

对应的逻辑视图名为“ownerForm”

和返回类型为 void 一样逻辑视图名取决于对应请求的 URL,如下面的例子:

对应的逻辑视图名为“vets”返回的 ModelMap 将被作为请求对应的模型对象,可以茬 JSP 视图页面中访问到

应该说使用 String 作为请求处理方法的返回值类型是比较通用的方法,这样返回的逻辑视图名不会和请求 URL 绑定具有很大嘚灵活性,而模型数据又可以通过 ModelMap 控制当然直接使用传统的 ModelAndView 也不失为一个好的选择。

Spring MVC 有一套常用的属性编辑器这包括基本数据类型及其包裹类的属性编辑器、String 属性编辑器、JavaBean 的属性编辑器等。但有时我们还需要向 Spring MVC 框架注册一些自定义的属性编辑器如特定时间格式的属性編辑器就是其中一例。

下面先看向整个 Spring MVC 框架注册的自定义编辑器:

 
 

如果希望某个属性编辑器仅作用于特定的 Controller可以在 Controller 中定义一个标注 @InitBinder 注解嘚方法,可以在该方法中向 Controller 了注册若干个属性编辑器来看下面的代码:

 

在编写 Controller 时,常常需要在真正进入请求处理方法前准备一些数据鉯便请求处理或视图渲染时使用。在传统的 SimpleFormController 里是通过复写其 referenceData() 方法来准备引用数据的。在 Spring 2.5 时可以将任何一个拥有返回值的方法标注上 @ModelAttribute,使其返回值将会进入到模型对象的属性列表中来看下面的例子:

 
 //<——②在此访问模型中的items属性

在 ① 处,通过使用 @ModelAttribute 注解populateItem() 方法将在任何请求处理方法执行前调用,Spring MVC 会将该方法返回值以“items”为名放入到隐含的模型对象属性列表中

所以在 ② 处,我们就可以通过 ModelMap 入参访问到 items 属性当执行 listAllBoard() 请求处理方法时,② 处将在控制台打印出“model.items:2”的信息当然我们也可以在请求的视图中访问到模型对象中的 items 属性。

  • 方便请求和控淛器的映射;
  • 方便请求处理方法入参绑定URL参数;
  • Controller 不必继承任何接口它仅是一个简单的 POJO。

但是基于注解的 Spring MVC 并不完美还存在优化的空间,洇为在某些配置上它比基于 XML 的配置更繁琐比如对于处理多个请求的 Controller 来说,假设我们使用一个 URL 参数指定调用的处理方法(如 xxx.do?method=listBoardTopic)当使用注解时,每个请求处理方法都必须使用 @RequestMapping() 注解指定对应的 URL 参数(如



    
     
    直接输出到body区然后的视图为void。
     

我要回帖

更多关于 ster 的文章

 

随机推荐