一、@RequestMapping
①作用:
SpringMVC使用@RequestMapping注解为控制器指定可以处理哪些URL请求。DispatcherServlet 截获请求后,就通过控制器上 @RequestMapping 提供的映射信息确定请求所对应的处理方法。
在控制器的类定义及方法定义处都可标注 @RequestMapping
- 标记在类上:提供初步的请求映射信息。相当于WEB 应用的根目录,相当于Strtus2的命名空间
- 标记在方法上:提供进一步的细分映射信息。相当于标记在类上的 URL,相当于Strtus2的命名
②SpringMVC源码参考
③@RequestMapping的value属性
@RequestMapping包含一个value属性!改属性也是默认属性,value属性主要指定的是!方法被访问的具体路径!
例如:
类 @RequestMapping(value="/user"或者"user");
方法 @RequestMapping(value="/list"或者"list");
那么此方法对应路径为: 协议://主机IP:端口号/项目根路径/user/list
注意: 类上@RequestMapping可以不写,那么就不需要追加/user即可!
④@RequestMapping的method属性
可以指定方法对应的请求方式!如果客户端请求的方式和方法设置的方式不同,请求不成功!
@RequestMapping(value = "/helloworld" , method =RequestMethod.GET)
@RequestMapping(value = "/helloworld" , method =RequestMethod.POST)
注意: 如果不指定method,可以接收任何类型的请求!如果指定但是访问类型不对会出现405错误
二、@RequestParam
①获取表单参数:
这里代码说明,比如获取表单参数
创建一个登陆表单:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<body>
<!--action指定controller中对应的方法路径即可!-->
<form action="xx/login" method="POST">
用户名:<input type="text" id="username" name="username" /> <br/>
密码:<input type="text" id="password" name="password" /> <br/>
<input type="submit" value="登陆">
</form>
</body>
获取参数的控制器:
@RequestMapping("/xx")
@Controller
public class LoginController {
// 接收form表单
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(String username, String password) {
System.out.println("username = " + username);
System.out.println("password = " + password);
return "helloworld";
}
}
获取参数,只需要在对应的方法中添加参数即可,如果参数名与请求传参的name值相同即可直接赋值,注意:对应类型很重要,如果是普通的输入框,使用字符串即可,如果是多选框,可以使用List类型的参数接值
如果参数名和name值相同,无需使用@RequestParam注解
开发中会碰到请求参数name的值与方法的参数名不同,还需要将指定的name对应参数传给方法的指定参数,需要使用@RequestParam注解
<form action="xx/login" method="POST">
用户名:<input type="text" id="username" name="name" /> <br/>
密码:<input type="text" id="password" name="password" /> <br/>
<input type="submit" value="登陆">
</form>
// 接收form表单
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(@RequestParam(value = "name") String username, String password) {
System.out.println("username = " + username);
System.out.println("password = " + password);
return "helloworld";
}
②方法参数设置默认值
有一种特殊情况,如果客户端没有在请求传参,那么我们将得到null,我们不希望得到null,希望得到一个默认值,这个时候,我们还需要使用@RequestParam的defaultValue属性进行对应的设置。
@RequestMapping("/list")
public String list(@RequestParam(defaultValue = "1") Integer currentPage, @RequestParam(defaultValue = "10") Integer pageSize) {
// 设置默认值,如果不传递使用参数的默认值
System.out.println("currentPage = " + currentPage);
System.out.println("pageSize = " + pageSize);
return "list";
}
三、@PathVariable
可以通过此注解,获取路径部分的数据!
例如: http://localhost:8080/user/lde/1
获取路径/list/后面1的数据!
@RequestMapping("/user/list/{id}")
public String getData(@PathVariable(value = "id") Integer id) {
System.out.println("id = " + id);
return "list";
}
代码解释: 将路径中想要获取部分使用 {标注名}标注,在方法对应赋值的参数添加@PathVariable注解即可!value值为标注名
四、@CookieValue
@CookieValue注解可以获取请求中的cookie!!
@RequestMapping("/cookie")
public String testCookie(@CookieValue("JSESSIONID") String cookie) {
System.out.println("cookie:" + cookie);
return "result";
}
五、@RequestHeader
@RequestHeader注解可以获取请求头中的数据
@RequestMapping("/header")
public String testHeader(@CookieValue("JSESSIONID") String cookie, @RequestHeader("User-Agent") String header) {
System.out.println("cookie:" + cookie);
System.out.println("header:" + header);
return "result";
}
六、请求和跳转
①请求表达式
通过表达式精准映射请求
- params和headers支持简单的表达式
- param:表示请求必须包含名为param的请求参数
- !param:表示请求中不能包含名为param的参数
- param != value:表示请求中包含param的请求参数,但是值不能为value
- param == value:表示请求中包含param的请求参数,但是值为value
param:
@RequestMapping(value = "/param", params = { "!username", "age!=10" })
public String testParam(String usernam, Integer age) {
System.out.println("usernam:" + usernam);
System.out.println("age:" + age);
return "result";
}
param 和 header
@RequestMapping(value = "/param1", headers = { "Connection!=keep-alive" }, params = { "!username", "age!=10" })
public String testParam1(String usernam, Integer age) {
System.out.println("usernam:" + usernam);
System.out.println("age:" + age);
return "result";
}
②转发和重定向
转发: forward
重定向:redirect
转发语法:
重定向语法:
③解决参数乱码
Spring MVC中 GET方式不会乱码
在web.xml配置文件中添加spring自带的Filter设置编码格式
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>