Spring MVC 注解
SpringMVC 框架提供了功能强大的注解,大大简化了代码开发的同时也提升了程序的可扩展性。
1. 注解参数详解
Spring MVC 通过 @RequestMapping 注解将 URL 请求与业务方法进行映射,在 Handler 的类定义处以及方法定义处都可以添加 @RequestMapping,在类定义处添加,相当于客户端多了一层访问路径。
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping(value="/index")
public String index(){
System.out.println("Hello World!");
return "index";
}
}
参数详解:
-
value:指定 URL 请求的实际地址,是 @RequestMapping 的默认值;
-
method:指定请求的 method 类型,包括 GET、POST、PUT、DELETE等;
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping(value = "/index",method = RequestMethod.POST)
public String index(){
System.out.println("Hello World!");
return "index";
}
}
浏览器地址栏只能向服务器发送 GET 请求,但是 method 表示只有 POST 请求可以方法该方法,若使用 GET 请求访问,则直接报错。
但是可以通过 Postman 工具发送不同类型的请求:
其他几种方式类似,可以在 @RequestMapping 注解的参数 method 中限定了请求的类型,我们常用的测试类型是 GET 和 POST。
- params:指定 request 中必须包含某些参数值,否则无法调用该方法;
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping(value = "/index",method = RequestMethod.GET,params = {"name","id=1"})
public String index(){
System.out.println("Hello World!");
return "index";
}
}
URL 请求中必须同时包含 name 和 id 两个参数,并且 id 的值必须为1,才能调用业务方法。否则会有如下的报错提示:
2. 参数绑定
方式一:@RequestParam 注解的参数绑定
params 是对 URL 请求的参数进行限制,不满足条件的 URL 无法达到该业务方法,这个特性并不是我们开发中常用的。我们需要用到的是在业务方法中获取 URL 的参数,实现这一步很简单。
- 在业务方法定义时声明参数列表;
- 给参数列表添加 @RequestParam 注解;
在形参列表中通过添加 @RequestParam 注解完成 HTTP 请求参数与业务方法形参的映射。
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping(value = "/index")
public String paramsBind(@RequestParam String name,@RequestParam Integer id){
System.out.println("执行了index方法...");
System.out.println(name);
id = id + 10;
System.out.println(id);
return "index";
}
}
将 URL 请求的参数 name 和 id 分别赋值给形参 name 和 id(参数名默认对应赋值),同时进行了数据类型的转换,因为浏览器地址栏输入的参数都是字符串文本类型,数据类型转换、JavaBean 封装等工作由 HandlerAdapter 默认完成了,所以根据形参的数据类型,将 id 转换为 Integer 类型,可以看到打印的 id 值为 11,完成了数学运算。
关于数据绑定,也可以在形参列表中通过添加 @RequestParam
注解完成 HTTP 请求参数与业务方法形参的映射。
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping(value = "/index")
public String paramsBind(@RequestParam("name") String uname,@RequestParam("age") Integer id){
System.out.println("执行了index方法...");
System.out.println(uname);
id = id + 10;
System.out.println(id);
return "index";
}
}
方式二:SpringMVC 同时也支持 restful 风格的 URL
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping(value = "/restful/{id}/{name}")
public String paramsBind(@PathVariable("name") String name, @PathVariable("id") Integer id){
System.out.println("执行了index方法...");
System.out.println(id);
System.out.println(name);
return "index";
}
}
浏览器地址栏 REST 风格的参数内容:http://localhost:8080/hello/restful/12/张三
通过 @PathVariable 注解完成请求参数与形参的映射。
方式三:Spring MVC 通过映射可以直接在业务方法中获取 Cookie 的值
package com.trainingl.handler;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping("/cookie")
public String cookie(@CookieValue(value = "JSESSIONID")String sessionId){
System.out.println(sessionId);
//5882BBB96E5CAE743566E7903EBE6463
return "index";
}
}
方式四:使用 JavaBean 绑定参数
Spring MVC 会根据请求参数名和 JavaBean 属性名进行自动匹配,自动为对象填充属性值,同时支持级联属性。
1、创建实体类 User、Address 并进行级联设置;
package com.trainingl.entity;
public class User {
private long id;
private String name;
private Address address;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", address=" + address +
'}';
}
}
package com.trainingl.entity;
public class Address {
private Integer id;
private String region;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
@Override
public String toString() {
return "Address{" +
"id=" + id +
", region='" + region + '\'' +
'}';
}
}
2、创建页面 addUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>添加新用户</title>
</head>
<body>
<form action="/hello/addUser" method="post">
编号:<input type="text" name="id"><br/>
姓名:<input type="text" name="name"><br/>
地址:<input type="text" name="address.region"><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
3、编写控制器的业务方法
package com.trainingl.handler;
import com.trainingl.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping("/addUser")
public String addUser(User user){
System.out.println(user);
return "index";
}
}
4、启动 Tomcat 服务器,运行 Web 应用程序
可以观察到页面发生跳转,并且 IDEA 的控制台有如下的信息输出:
出现了中文乱码的问题,Spring MVC 解决中文乱码很简单,只需在 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>/*</url-pattern>
</filter-mapping>
注意:如果<web-app>
标签标红线,则在写代码时<filter>
标签要写在 <servlet>
标签前面。
3. 页面跳转
JSP 页面跳转有两种方式:请求转换和重定向,Spring MVC 默认以转发的形式响应 JSP,也可以手动设置。
1、重定向
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping("/redirectTest")
public String redirectTest(){
return "redirect:/index.jsp";
}
}
通过地址栏可以看到 localhost:8080/hello/redirectTest
,地址改变,重定向跳转。
需要注意的是在业务方法中,设置重定向不能写逻辑视图,必须写明目标资源的物理路径,比如本例中的 “redirect:/index.jsp” 。
2、请求转发
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping("/forwardTest")
public String forwardTest(){
return "forward:/index.jsp";
}
}
可以看到请求前后,地址栏没有发生改变,这次请求是以转发的方式跳转。