Spring MVC 通过 @RequestMapping 注解将 URL 请求与业务方法进行映射,在控制器的类定义处以及方法定义处都可以添加 @RequestMapping,在类定义处添加相当于多了一层访问路径。
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping("/index")
public String index(){
System.out.println("接收到请求了");
return "index";
}
}
访问路径:http://localhost:8080/hello/index
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping(value = "/index",method = RequestMethod.POST)
public String index(){
System.out.println("接收到请求了");
return "index";
}
}
上述代码表示只有 POST 请求可以访问该方法,若使用其他请求访问,直接抛出异常,比如 GET。
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping(value = "/index",method = RequestMethod.POST,params = {"id=1", "name=tom"})
public String index(){
System.out.println("接收到请求了");
return "index";
}
}
上述代码啊表示 request 请求中必须包含 name 和 id 两个参数,并且 id 的值必须为1,name 的值必须为tom,才可调用,否则抛出 400 异常。
访问路径为:http://localhost:8080/hello/index?id=1&name=tom
如果需要在业务方法中获取 URL 的参数值,可以使用 @RequestParam 注解
1、在业务方法定义时声明参数列表
2、给参数列表添加 @RequestParam 注解进行绑定
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping(value = "/index",method = RequestMethod.POST)
public String index(@RequestParam("num") Integer id,@RequestParam("str") String name){
System.out.println("接收到请求了,参数是:id=" + id + ",name=" + name);
return "index";
}
}
请求路径:http://localhost:8080/hello/index?num=1&str=tom
输出结果:接收到请求了,参数是:id=1,name=tom
Spring MVC 可以自动完成数据类型转换,该工作是由 HandlerAdapter 来完成的。
传统的 URL:http://localhost:8080/hello/index?num=1&str=tom
RESTful URL:http://localhost:8080/hello/index/1/tom
@RequestMapping("/restful/{id}/{name}")
public String restful(@PathVariable("id") Integer id, @PathVariable("name") String name){
System.out.println(id + "-" + name);
return "index";
}
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中。
@CookieValue的作用:用来获取Cookie中的值
@RequestMapping("/cookie")
public String getCookie(@CookieValue("JSESSIONID") String sessionId){
System.out.println(sessionId);
return "index";
}
输出结果:895AB5BA04AB4B038DDD859151C84C18
Spring MVC 会根据请求参数名和 POJO 属性名进行匹配,自动为该对象填充属性值,并且支持属性级联。
创建实体类User:
package com.southwind.pojo;
import lombok.Data;
@Data
public class User {
private Integer id;
private String name;
private Address address;
}
**加粗样式**
创建 Address 试题列:
package com.southwind.pojo;
import lombok.Data;
@Data
public class Address {
private Integer code;
private String name;
}
创建 addUser.jsp
<%--
Created by IntelliJ IDEA.
User: liquanpeng
Date: 2021/12/16
Time: 10:35 下午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/hello/add" method="post">
<table>
<tr>
<td>编号:</td>
<td><input type="text" name="id"></td>
</tr>
<tr>
<td>姓名:</td>
<td>
<input type="text" name="name">
</td>
</tr>
<tr>
<td>地址编号:</td>
<td>
<input type="text" name="address.code">
</td>
</tr>
<tr>
<td>地址信息:</td>
<td>
<input type="text" name="address.name">
</td>
</tr>
<tr>
<td>
<input type="submit" value="提交">
</td>
</tr>
</table>
</form>
</body>
</html>
Handler:
@RequestMapping("/add")
public String add(User user){
System.out.println(user);
return "index";
}
输出结果:
解决乱码问题:
如果出现中文乱码,可以通过配置过滤器来解决,在 web.xml 中添加配置即可。
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*
Spring MVC 默认以转发的形式响应 JSP,可以手动进行修改。
重定向:
@RequestMapping("/redirect")
public String redirect(){
System.out.println("重定向");
return "redirect:/index.jsp";
}
设置重定向的时候不能写逻辑视图,必须写明资源的物理路径,如“redirect:/index.jsp”
转发:
@RequestMapping("/forward")
public String forward(){
System.out.println("转发");
return "forward:/index.jsp";
}
等同于
@RequestMapping("/forward")
public String forward(){
System.out.println("转发");
return "index";
}