[有书共读]JavaWeb高级编程

JavaWeb高级编程 -- 篇11

使用控制器替代Servlet

@RequestMapping是Spring工具集中一个非常强大的工具,通过它可以映射请求、请求的Content-Type或者Accept头、HTTP请求头、指定请求参数或头是否存在,或者这些信息的任意组合。使用了@RequestMapping之后,在Servlet的doGet或者类似的方法中选择正确的方法时,就不再需要使用复杂的切换或者逻辑分支。请求将被自动路由到正确的控制器和方法。
@RequestMapping注解将把请求被映射到的方法缩小到特定的方法上。可以只在控制器方法中添加@RequestMapping,或者同时在控制器类和它的方法中添加。

@RequestMapping("viewProduct")
public String viewProduct(...){...}

@RequestMapping("addToCart")
public String addProductToCart(...){...}

@RequestMapping("writeReview")
public String writeReview(...){...}

在上例中,如果将DispatcherServlet映射到上下文根(/),那么这些方法相对于应用程序的URL将分别变成/viewProduct、/addToCart、/writeReview。
如果控制器中的许多URL都共享一个相同的元素,那么可以使用映射继承来减少映射中的冗余。

@RequestMapping("product")
public class ProductController
{
    @RequestMapping("view")
    public String viewProduct(...){...}

    @RequestMapping("addToCart")
    public String addToCart(...){...}

    @RequestMapping("writeReview")
    public String writeProductReview(...){...}
}

在上例中,如果DispatcherServlet映射到上下文根的话,那么方法URL将分别变成/product/view、/product/addToCart、和/product/writeReview。

URL映射的另一个重要方面是:如果请求匹配到多个不同的URL映射,那么最具体的映射胜出。

关于@RequestMapping value特性需要了解的最后一件事情是:它可以接受一组URL映射。因此,可以将多个URL映射到指定的方法上。在下例中,home方法将响应URL/,/home和/dashboard:

@RequestMapping({"/","home","dashboard"})
public String home(...){...}

控制器方法可以有任意数量的不同类型的参数。
可以使用几个参数注解表示方法参数的值应该从请求的某些属性中获取。
@RequestParam注解表示被注解的方法参数应该派生自命名请求参数。使用value特性指定请求参数的名称。

@RequestMapping("uesr")
public String user(@RequestParam("id") long userId,
                    @RequestParam(value="name", request=false) String name,
                    @RequestParam(value="key",defaultValue="") String key)
{...}

@RequestHeader的工作方式与@RequestParam一致,它提供了对请求头的值的访问,它指定了一个必须的或者可选的请求头,用作相应方法的参数值。因为HTTP头也可以有多个值,所以如果出现这种请求的话,应该使用数组或集合参数类型。
Spring Framework中的URL映射不必是静态值。相反,该URL可以包含一个模板,表示URL的某个部分是不可变的,它的值将在运行时决定。下面的代码脚本演示可如何在URL映射中指定一个URL模板,并通过@PathVariable的方式将该模板变量用作方法参数的值。

@RequestMapping(value="user/(userId)", method=RequestMothod.GET)
public String user(@PathVariable("userId") long userId){...}

URL映射中可以包含多个模板变量,每个模板变量都可以有一个关联的方法参数。另外,还可以将类型为Map<String,String>的单个方法参数标注为@PathVariavble,它将包含URL中所有URI模板变量值。
Spring提供了@MatrixVariable注解,从URL中提取路径参数用作方法参数。
Spring Framework允许指定一个表单对象作为控制器方法的参数。表单对象是含有设置和读取方法的简单POJO。它们不必事先实现任何特殊的接口,也不需要使用任何特殊的注解对控制器方法参数进行标记,Spring将把它识别为一个表单对象。

通过使用@RequestBody注解,Spring将自动把一个请求实体转换为控制器方法参数。

public String update(@RequestBody Account account){...}

Spring将再继续执行两个步骤,将模型从请求中完全离开,并提供可以通过无限种方式实现的高级View接口。InternalResourceView和JstlView将分别实现传统的JSP和JSTL增强JSP视图。它们负责将模型特性转换成请求特性,并将请求转发到正确的JSP。
当控制器方法返回一个View、或者ModelAndView的实现时,Spring将直接使用该View,并且不需要额外的逻辑用于判断如何向客户端展示模型。如果控制器方法返回了一个字符串视图名称或者使用字符串视图名称构造的ModelAndView,Spring必须使用已配置的org.springframework.web.servlet.ViewResolver将视图名称解析成一个真正的视图。如果方法返回的是模型或者模型特性,Spring首先使用已配置的RequestToViewNameTranslator隐式地将请求转换成视图名称,然后使用ViewResolver解析已命名地视图。最后,当控制器方法返回的是响应实体ResponseEntity或者HttpEntity时,Spring将使用内容协商决定将实体展示到哪个视图中。

#Java##读书笔记#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务