请求 URL匹配: @RequestMapping
@RequestMapping 负责将请求映射到对应的控制器方法上。
@RequestMapping 注解可用于类或方法上。用于类上,表示类中的所有响应请求的方法都以该地址作为父路径。
在整个 Web 项目中,@RequestMapping 映射的请求信息必须保证全局唯一。
@RequestMapping 注解常用属性
value
@RequestMapping 注解的默认属性,如果只有 value 属性时,可以省略该属性名,如果有其它属性,则必须写上 value 属性名称。
// 斜杠可省略 @RequestMapping(value="/login") @RequestMapping("/login")
value 属性支持通配符匹配,如 value="user/*"
表示 user/1
或 user/login
都能够正常访问。
path
用法同 value。
name
用来添加描述信息,相当于方法注释。如 @RequestMapping(value = "/login",name = "用户登录")
。
method
method 属性用于表示该方法支持哪些 HTTP 请求。省略 method 则说明该方法支持全部的 HTTP 请求。
//表示该方法只支持 GET 请求 @RequestMapping(value = "login",method = RequestMethod.GET) //说明该方法同时支持 GET 和 POST 请求 @RequestMapping(value = "login",method = {RequestMethod.GET,RequestMethod.POST})
params
用于指定请求中规定的参数 。
//请求中必须包含 type 参数时才能执行该请求,即 /login?type=x 可访问该方法,/login 则无法访问该方法。 @RequestMapping(value = "login",params = "type") public String doLogin() { return "/test.jsp"; } //请求中必须包含 type 参数且值为1时才能执行该请求,否则无法访问 @RequestMapping(value = "login",params = "type=1") public String doLogin() { return "/test.jsp"; }
header
表示请求中必须包含某些指定的 header 值。
consumes
用于指定请求提交内容类型(Content-Type),例如:application/json、text/html。
@RequestMapping(value = "login",consumes = "application/json")
produces
用于指定返回的内容类型,返回的内容类型必须是 request 请求头(Accept)中所包含的类型。 除此之外,还可以指定返回值的编码。
// 指定返回内容类型 @RequestMapping(value = "login", produces = "application/json") // 指定返回内容类型,同时指定返回值编码 @RequestMapping(value = "login",produces = "application/json,charset=utf-8")
请求参数获取
Spring MVC Controller 接收请求参数的方式有很多种,有的适合 get 请求方式,有的适合 post 请求方式,有的两者都适合。主要有以下几种方式:
通过处理方法的简单形参接收请求参数
通过实体 Bean 接收请求参数
通过 HttpServletRequest 接收请求参数
通过 @RequestParam 接收请求参数
通过 @PathVariable 接收 URL 中的请求参数
通过处理方法的简单形参接收请求参数
通过方法形参接收请求参数,是根据请求参数名和方法形参名相同原则进行赋值。该接收参数方式适用于 get 和 post 提交请求方式。
@RequestMapping("/login") public String doLogin(String username,String pwd){ return "/show.jsp"; //请求转发 }
通过实体Bean接收请求参数
实体 Bean 接收请求参数适用于 get 和 post 提交请求方式。Bean 的属性名称必须与请求参数名称相同。请求参数按同名原则,赋值给 Bean 的属性。如果 Bean 中的属性是 数字类型,则 SpringMVC 会自动尝试参数类型的转换。
@RequestMapping("/login") public String doLogin(User user){ return "/show.jsp"; //请求转发 }
通过HttpServletRequest接收请求参数
@RequestMapping("/login") public String doLogin(HttpServletRequest request){ String name = request.getParameter("username"); String pwd = request.getParameter("pwd"); return "/show.jsp"; //请求转发 }
通过@RequestParam接收请求参数
@RequestParam 有以下三个参数:
value | name:参数名
required:是否必须,默认为 true,表示请求中必须包含对应的参数名,若不存在将抛出异常
defaultValue:参数默认值
@RequestMapping("/login") public String doLogin(@RequestParam(name = "name",defaultValue = "admin")String username, @RequestParam String pwd){ return "/show.jsp"; //请求转发 }
通过@PathVariable接收URL中的请求参数
/* 访问 /login/admin/123456, URL中的模板变量 {name} 和 {pwd} 将值 admin 和 123456 绑定到通过 @PathVariable 注解的参数 username 和 pwd 上。 */ @RequestMapping("/login/{name}/{pwd}") public String doLogin(@PathVariable("name") String username, @PathVariable String pwd){ return "/show.jsp"; //请求转发 }
请求转发和重定向
请求转发
方式 1
@RequestMapping("/login") public String doLogin(){ return "/show.jsp"; }
方式 2
@RequestMapping("/login") public String doLogin(){ return "forward:/show.jsp"; }
方式3
@RequestMapping("/login") public ModelAndView doLogin(){ ModelAndView mv = new ModelAndView("/show.jsp"); return mv; }
方式4
@RequestMapping("/login") public void doLogin(HttpServletRequest request, HttpServletResponse response){ request.getRequestDispatcher("show.jsp").forward(request,response); }
重定向
方式1
@RequestMapping("/login") public String doLogin(){ return "redirect:/show.jsp"; }
方式2
@RequestMapping("/login") public void doLogin(HttpServletResponse response){ response.sendRedirect("/demo/show.jsp"); }
传值到View
方式1
// 将放在 model 中的属性 m2 的作用域设置为 session 范围 @SessionAttributes("m2") public class LoginController { @RequestMapping("/login") public String doLogin(Model model){ model.addAttribute("m1","info"); //request model.addAttribute("m2","info2"); //session return "forward:/show.jsp"; } }
方式2
@RequestMapping("/login") public ModelAndView doLogin(){ ModelAndView mv = new ModelAndView(); mv.setViewName("/show.jsp"); mv.addObject("m","info"); return mv; }
方式3
@RequestMapping("/login") public String doLogin(HttpServletRequest request,HttpSession session){ request.setAttribute("m1","info"); //request session.setAttribute("m2","info2"); //session return "forward:/show.jsp"; }
方式4
@ModelAttribute 注解用于将其修饰的对象自动暴露为模型数据,在视图页面展示时使用。
@RequestMapping("/login") //等价于 model.addAttribute("user",user) public String doLogin(@ModelAttribute("user") User user){ return "/show.jsp"; } @RequestMapping("/login") //等价于 model.addAttribute("User",yh) public String doLogin(@ModelAttribute User yh){ return "/show.jsp"; }
Ajax 响应
@Controller
@Controller public class LoginController { @RequestMapping("/login") @ResponseBody // 响应 Ajax 请求,必须添加此注解 public Student doLogin(String name,String pwd){ User user = userService.selectUser(name,pwd); return user; // 返回到 view 的数据会自动转为 json(js) 对象 } }
@RestController
@RestController = @Controller+@ResponseBody
@RestController public class LoginController { @RequestMapping("/login") public User login(String name,String pwd) { User user = userService.selectUser(name,pwd); return user; } }
视图资源解析器
视图解析器(ViewResolver)是 Spring MVC 的重要组成部分,负责将逻辑视图名解析为具体的视图对象。
URLBasedViewResolver
UrlBasedViewResolver 是对 ViewResolver 的一种简单实现,主要提供了一种拼接 URL 的方式来解析视图。
UrlBasedViewResolver 通过 prefix 属性指定前缀,suffix 属性指定后缀。当 ModelAndView 对象返回具体的 View 名称时,它会将前缀 prefix 和后缀 suffix 与具体的视图名称拼接,得到一个视图资源文件的具体加载路径,从而加载真正的视图文件并反馈给用户。
使用 UrlBasedViewResolver 除了要配置前缀和后缀属性之外,还需要配置“viewClass”,表示解析成哪种视图。
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceViewResolver"/><!--不能省略-->
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
存放在 /WEB-INF/ 目录下的内容不能直接请求到,为了安全性考虑,通常把 jsp 文件放在 WEB-INF 目录下
InternalResourceViewResolver
InternalResourceViewResolver 为“内部资源视图解析器”,是日常开发中最常用的视图解析器类型。它是 URLBasedViewResolver 的子类,拥有 URLBasedViewResolver 的一切特性。
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>