SpringMvc概述
Spring MVC就是一个MVC框架。
Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据、业务与展现进行分离。从这样一个角度来说,Spring MVC和Struts、Struts2非常类似。Spring MVC的设计是围绕DispatcherServlet展开的,DispatcherServlet负责将请求派发到特定的handler。通过可配置的handler mappings、view resolution、locale以及theme resolution来处理请求并且转到对应的视图。
pring3.x中定义一个控制器类,必须以@Controller注解标记。当控制器类接收到一个请求时,它会在自己内部寻找一个合适的处理方法来处理请求。使用@RequestMapping注解将方法映射到一些请求上,以便让该方法处理那些请求。这种方法就像一般的类中的方法,方法名参数列表和返回值并不像Struts2之类的框架有很强的限制。方法参数列表具体以及返回值具体都有哪些,这里先不细说。这篇博客的目的在于简单介绍如何快速上手使用Spring MVC框架。
控制器在选择好适合处理请求的方法时,传入收到的请求(根据方法参数类型,可能以不同的类型传入),并且调用该方法中的逻辑来进行处理(也可以是调用Service来真正处理)。方法逻辑可能也会在参数中添加或者删除数据。处理方法处理完之后,会委派给一个视图,由该视图来处理方法的返回值。处理程序的返回值并不代表视图的具体实现,可以只是String类型,代表视图名,甚至是void(这时候Spring MVC可以根据方法名或者控制器名找默认视图)。也不需要担心返回值只是视图名称的话,视图拿不到要显示的数据。因为方法参数对于视图来说也是可以拿到的。比如说,如果处理方法以Map为参数,那么这个Map对于视图也是可以拿到的。
返回的视图名称会返回给DispatcherServlet,它会根据一个视图解析器将视图名称解析为一个具体的视图实现。这里说到的视图解析器是一个实现了ViewResolver借口的Bean,它的任务就是返回一个视图的具体实现(HTML、JSP、PDF等等).
Spring MVC的常用注解包括以下几类:
控制器注解
@Controller:用于标识一个类为SpringMVC的控制器,处理HTTP请求并返回响应结果。
@RestController:标识一个类为Rest风格的控制器,所有方法默认返回JSON或XML格式的响应结果。
请求映射注解
@RequestMapping:用于映射Web请求,包括访问路径和参数。
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping:根据请求类型使用不同的注解处理GET、POST、PUT、DELETE等请求。
依赖注入注解
@Resource:用于bean的注入,可以写在字段和setter方法上,支持ByName和ByType自动注入。
@Autowired:用于自动注入依赖,可以写在字段和setter方法上,支持byType和byName注入。
@Qualifier:与@Autowired一起使用,用于指定具体的Bean名称进行注入,解决多个匹配Bean的歧义问题。
其他常用注解
@PathVariable:用于将请求URL中的模板变量映射到功能处理方法的参数上。
@ResponseBody:支持将返回值放在response内,通常用于返回JSON数据。
@RequestBody:允许request的参数在request体中,而不是直接连接在地址后面。
访问自定义方式
方式一(注解方式):
@RequestMapping(“/映射路径”)
开启扫描注解
在配置文件中配置视图解析器
方式二(XML方式【不常用】):
去掉之前控制器实现的 Controller 接口,改为继承 多方法控制器(需要注意SpringMVC的
版本不能太高)
在配置文件中配置方法解析器
将方法解析器依赖注入到bean标签
RequestMapping详解
package com.hwq.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;@Controller
public class MappingController {/*一个路径映射一个方法*/@RequestMapping("/test1")public String test1() {System.out.println("方法访问");return "index";}/*多个路径映射一个方法*/@RequestMapping(value = {"/test2","/test21","/test22"})public String test2() {System.out.println("方法访问2");return "index";}/*多个路径映射一个方法 通配符方法* 0个或者多个? 有且只有一个*/@RequestMapping(value = {"/test3*"})public String test3() {System.out.println("方法访问3");return "index";}@RequestMapping(value = {"/test13?"})public String test31() {System.out.println("方法访问31");return "index";}@RequestMapping(value = {"/test3/*"})public String test32() {System.out.println("方法访问32");return "index";}@RequestMapping(value = {"/test13/?"})public String test33() {System.out.println("方法访问33");return "index";}/*限定方法的请求方式*/@RequestMapping(value = "/test4",method = RequestMethod.GET)public String test4() {System.out.println("方法访问4");return "index";}/*限定方法的请求方式*/@RequestMapping(value = "/test5",params = "username")public String test5(String username) {System.out.println("方法访问5"+username);return "index";}/*限定方法的请求方式*/@RequestMapping( value = "/test6")public String test6(@RequestParam(required = true, defaultValue = "郝伟强", value = "名字")String username) {System.out.println("方法访问6"+username);return "index";}@RequestMapping( value = "/test7")public String test7(@RequestHeader("Cookie") String username) {System.out.println("方法访问7"+username);return "index";}
}