【Spring实战学习笔记】第5章 构建Spring WEB应用程序

目录

5.1 Spring MVC起步

5.2 编写基本的控制器

5.3 接受请求的输入

5.4 处理表单

5.5 小结


SpringMVC基于模型视图控制器(Model-View-Controller,MVC)模式实现,

它能够帮你构建像Spring框架那样灵活和松耦合的Web应用程序。

5.1 Spring MVC起步

5.1.1 跟踪 Spring MVC 的请求

 

【Spring实战学习笔记】第5章 构建Spring WEB应用程序

SpringMVC所有的请求都会通过一个前端控制器(front controller)Servlet。一个单实例的Servlet将请求委托给应用程序的其他组件来执行实际的处理。在SpringMVC中,DispatcherServlet就是前端控制器。

DispatcherServlet的任务是将请求发送给Spring MVC控制器(controller,控制器是一个用于处理请求的Spring组件)。在典型的应用程序中可能会有多个控制器,DispatcherServlet需要知道应该将请求发送给哪个控制器。所以DispatcherServlet会查询一个或多个处理器映射(handler mapping)来确定请求的下一站在哪里。处理器映射会根据请求所携带的URL信息来进行决策。

控制器在完成逻辑处理后,通常会产生一些信息,这些信息需要返回给用户并在浏览器上显示。这些信息被称为模型(model)。这些信息需要以用户友好的方式进行格式化,一般会是HTML。所以,信息需要发送给一个视图(view)

传递给DispatcherServlet的视图名并不直接表示某个特定视图。相反,它仅仅传递了一个逻辑名称,这个名字将会用来查找产生结果的真正视图。DispatcherServlet将会使用视图解析器(view resolver)来将逻辑视图名匹配为一个特定的视图实现

5.1.2 搭建 Spring MVC

配置 DispatcherServlet

DispatcherServlet是SpringMVC的核心。在这里请求会第一次接触到框架,它要负责将请求路由到其他的组件之中。

【Spring实战学习笔记】第5章 构建Spring WEB应用程序

 

当DispatcherServlet启动的时候,它会创建Spring应用上下文,并加载配置文件或配置类中所声明的bean。

启用 Spring MVC

最简单的SpringMVC配置就是一个带有@EnableWebMvc注解的类

【Spring实战学习笔记】第5章 构建Spring WEB应用程序

 

5.2 编写基本的控制器

在SpringMVC中,控制器只是方法上添加了@RequestMapping注解的类,这个注解声明了它们所要处理的请求。

Controller是一个构造型(stereotype)的注解,它基于@Component注解。它的目的就是辅助实现组件扫描。类带有@Controller注解,组件扫描器会自动找到它,并将其声明为Spring应用上下文中的一个bean。

@RequestMapping注解,它的value属性指定了这个方法所要处理的请求路径,method属性细化了它所处理的HTTP方法

5.2.1 测试控制器

5.2.2 定义类级别的请求处理

当控制器在类级别上添加@RequestMapping注解时,这个注解会应用到控制器的所有处理器方法上。处理器方法上的@RequestMapping注解会对类级别上的@RequestMapping的声明进行补充

5.2.3 传递模型数据到视图中

在spittles()方法中给定了一个Model作为参数。这样,spittles()方法就能将Repository中获取到的Spittle列表填充到模型中。Model实际上就是一个Map(也就是key-value对的集合),它会传递给视图,这样数据就能渲染到客户端了。

【Spring实战学习笔记】第5章 构建Spring WEB应用程序

 

5.3 接受请求的输入

Spring MVC允许以多种方式将客户端中的数据传送到控制器的处理器方法中,包括:

  • 查询参数(Query Parameter)。
  • 路径变量(Path Variable)。
  • 表单参数(Form Parameter)。

5.3.1 处理查询参数

查询参数形如:http://ip:port/url?param1=value1&param2=value2

处理器方法要同时处理有参数和没有参数的场景。@RequestParam注解的defaultValue属性可以完成这项任务:

@RequestMapping(method=RequestMethod.GET)

public List<Spittle> spittles(

       @RequestParam(value="max", defaultValue=MAX_LONG_AS_STRING)long max,

       @RequestParam(value="count", defaultValue="20")int count) {

}

 

** 查询参数都是String类型的

5.3.2 通过路径参数接受输入

在理想情况下,要识别的资源(Spittle)应该通过URL路径进行标示,而不是通过查询参数。对“/spittles/12345”发起GET请求要优于对“/spittles/show?spittle_id=12345”发起请求。前者能够识别出要查询的资源,而后者描述的是带有参数的一个操作

为了实现路径变量,Spring MVC允许我们在@RequestMapping路径中添加占位符。占位符的名称要用大括号(“{”和“}”)括起来。路径中的其他部分要与所处理的请求完全匹配,但是占位符部分可以是任意的值。

@RequestMapping(value="/{spittleId}", method=RequestMethod.GET)

public String spittle(@PathVariable("spittleId")long spittleId, Model model)

{

    model.addAttribute(spittleRepository.findOne(spittleId));

    return"spittle";

}

spittleId参数上添加了@PathVariable("spittleId")注解,这表明在请求路径中,不管占位符部分的值是什么都会传递到处理器方法的spittleId参数中。

** 如果@PathVariable中没有value属性的话,它会假设占位符的名称与方法的参数名相同。这时,如果要重命名参数,必须同时修改占位符名称。

5.4 处理表单

使用表单分为两个方面:展现表单以及处理用户通过表单提交的数据

5.4.1 编写处理表单的控制器

表单的样式:

【Spring实战学习笔记】第5章 构建Spring WEB应用程序

控制器:

【Spring实战学习笔记】第5章 构建Spring WEB应用程序

processRegistration()方法,它接受一个Spitter对象作为参数。这个对象有firstName、lastName、username和password属性,这些属性将会使用请求中同名的参数进行填充

当InternalResourceViewResolver看到视图格式中的“redirect:”前缀时,它就知道要将其解析为重定向的规则,而不是视图的名称。

5.4.2 校验表单

Java校验API定义了多个注解,这些注解可以放到属性上,从而限制这些属性的值。所有的注解都位于javax.validation.constraints包中

【Spring实战学习笔记】第5章 构建Spring WEB应用程序

 

参数添加了@Valid注解,这会告知Spring,需要确保这个对象满足校验限制。

5.5 小结

借助于注解,SpringMVC提供了近似于POJO的开发模式,这使得开发处理请求的控制器变得非常简单

* @Controller 注解标明一个类是一个控制器

* @RequestMapping 注解的value属性指定了这个方法所要处理的请求路径,method属性细化了它所处理的HTTP方法

* 接受输入参数的三种方式:查询参数、路径变量、表单参数

* 在控制器方法中使用Model,可以将模型数据传递到视图中