示例 @PathVariable注解和@MatrixVariable注解的使用

示例 @PathVariable注解和@MatrixVariable注解的使用

新建一个项目VariableTest,加入所需的jar文件:

项目结构

展开/折叠
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
G:\Desktop\随书源码\Spring+Mybatis企业应用实战(第2版)\codes\03\VariableTest
├─src\
│ └─org\
│ └─fkit\
│ └─controller\
│ └─VariableController.java
└─WebContent\
├─index.jsp
├─META-INF\
│ └─MANIFEST.MF
└─WEB-INF\
├─lib\
│ ├─commons-logging-1.2.jar
│ ├─spring-aop-5.0.1.RELEASE.jar
│ ├─spring-aspects-5.0.1.RELEASE.jar
│ ├─spring-beans-5.0.1.RELEASE.jar
│ ├─spring-context-5.0.1.RELEASE.jar
│ ├─spring-context-indexer-5.0.1.RELEASE.jar
│ ├─spring-context-support-5.0.1.RELEASE.jar
│ ├─spring-core-5.0.1.RELEASE.jar
│ ├─spring-expression-5.0.1.RELEASE.jar
│ ├─spring-instrument-5.0.1.RELEASE.jar
│ ├─spring-jcl-5.0.1.RELEASE.jar
│ ├─spring-jdbc-5.0.1.RELEASE.jar
│ ├─spring-jms-5.0.1.RELEASE.jar
│ ├─spring-messaging-5.0.1.RELEASE.jar
│ ├─spring-orm-5.0.1.RELEASE.jar
│ ├─spring-oxm-5.0.1.RELEASE.jar
│ ├─spring-test-5.0.1.RELEASE.jar
│ ├─spring-tx-5.0.1.RELEASE.jar
│ ├─spring-web-5.0.1.RELEASE.jar
│ ├─spring-webflux-5.0.1.RELEASE.jar
│ ├─spring-webmvc-5.0.1.RELEASE.jar
│ └─spring-websocket-5.0.1.RELEASE.jar
├─springmvc-config.xml
└─web.xml

示例代码如下:

index.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>处理请求URL注解测试</title>
</head>
<body>
<h2>处理请求URL注解测试</h2>
<a href="pathVariableTest/1">测试@PathVariable注解</a>
<br>
<a href="matrixVariableTest/1;name=jack;age=23">测试@MatrixVariable注解</a>
<br>
<a href="productTest/computer;brand=apple,acer;low=2000;height=10000">商品条件查询(品牌,价格区间)</a>
<br>
<!-- 跨域请求 -->
<a href="http://localhost:8080/CrossOriginTest/welcome">测试@CrossOrigin注解</a>
<br>
</body>
</html>

VariableController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package org.fkit.controller;

import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.MatrixVariable;
import org.springframework.web.bind.annotation.PathVariable;

@Controller
public class VariableController
{

// 测试@PathVariable注解
// 该方法映射的请求为/VariableTest/pathVariableTest/1
@GetMapping(value = "/pathVariableTest/{userId}")
public void pathVariableTest(@PathVariable Integer userId,
HttpServletResponse response)
{
// 直接响应不跳转页面
try
{
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("通过@PathVariable获得数据: userId=" + userId);
} catch (IOException e)
{
e.printStackTrace();
}
}

// 测试@MatrixVariable注解
// 该方法映射的请求为/VariableTest/matrixVariableTest/1;name=jack;age=23
@GetMapping(value = "/matrixVariableTest/{userId}")
public void matrixVariableTest(@PathVariable Integer userId,
@MatrixVariable(value = "name", pathVar = "userId") String name,
@MatrixVariable(value = "age", pathVar = "userId") Integer age,
HttpServletResponse response)
{
// 直接响应不跳转页面
try
{
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("通过@PathVariable获得数据: userId=" + userId);
response.getWriter().write(
"通过@MatrixVariable获得数据: name=" + name + " age=" + age);
} catch (IOException e)
{
e.printStackTrace();
}
}

// 测试@MatrixVariable注解的复杂例子
// 该方法映射的请求为//VariableTest/productTest/computer;brand=apple,acer;low=2000;height=10000
@GetMapping(value = "/productTest/{goods}")
public void productTest(@PathVariable String goods,
@MatrixVariable(value = "brand", pathVar = "goods") List<String> brand,
@MatrixVariable(value = "low", pathVar = "goods") Integer low,
@MatrixVariable(value = "height", pathVar = "goods") Integer height,
HttpServletResponse response)
{
// 直接响应不跳转页面
try
{
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().println("通过@PathVariable获得数据: goods=" + goods+"<br>");
response.getWriter().println("通过@MatrixVariable获得数据:brand=" + brand+"<br>");
response.getWriter().println(
"通过@MatrixVariable获得数据: low=" + low + " height=" + height+"<br>");
} catch (IOException e)
{
e.printStackTrace();
}
}
}

springmvc-config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<!-- spring可以自动去扫描base-pack下面的包或者子包下面的java文件, -->
<!-- 如果扫描到有Spring的相关注解的类,则把这些类注册为Spring的bean -->
<context:component-scan
base-package="org.fkit.controller" />
<!-- 默认装配方案 -->
<!-- @MatrixVariable注解功能在SpringMVC中默认是不启用的 -->
<!-- 启用它需要设置enable-matrix-variables="true" -->
<mvc:annotation-driven
enable-matrix-variables="true" />
<!-- 静态资源处理 -->
<mvc:default-servlet-handler />

<!-- 视图解析器 p:prefix属性表示前缀 p:suffix 表示后缀 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/content/" p:suffix=".jsp" />

</beans>

此外,还需要在web.xml文件中配置Spring MVC的前端控制器DispatcherServlet,因为每次配置基本相同此处不再赘述,读者可自行配置。
部署VariableTest这个Web应用,在浏览器中输入如下URL来测试应用:

1
http://localhost:8080/VariableTest/

此时Spring MVC会跳转到index.jsp

测试

测试@PathVariable注解

VariableController类的pathVariableTest方法用于测试@PathVariable注解,它会将请求路径/pathVariableTest/1"userId的值“1”赋给方法参数的userId变量。单击”测试@PathVariable注解“超链接发送请求,将调用pathVariableTest方法,此时浏览器显示如下文字:

1
通过@PathVariable获得数据: userId=1

测试@MatrixVariable注解

VariableController类的matrixVariableTest方法用于测试@MatrixVariable注解,它会将请求路径"/matrixVariableTest/1;name=jack;age=23"中的name参数的值"jack"赋给方法形式参数name,将age参数的值23赋给方法参数的形式参数age。单击“测试@Matrixvariable注解”超链接发送请求,将调用matrixVariableTest方法.此时浏览器显示的如下文字:

1
通过@PathVariable获得数据: userId=1通过@MatrixVariable获得数据: name=jack age=23

可以看到,<a href=" matrixVariableTest/1;name=jack;age=23">测试MatrixVariable注解</a>的参数name的值"jack"被传递到方法形式参数name,参数age的值“23”被传递到方法的age变量,并显示在浏览器上。

多条件组合查询

MatrixVariable注解还可以完成复杂的参数注入,非常方便地进行多条件组合查询。本例以商品查询为例,详细介绍MatrixVariable的使用。
VariableController类的productTest方法用于商品条件查询,传递的参数包括商品品牌价格区间,它会将请求路径"/productTest/computer;brand=apple,acer;low=2000;height=10000"之中的:

  • brand参数的值"apple,acer"赋给方法参数的brand变量,该变量是一个List集合;
  • low参数的值"2000"赋给方法参数的low变量;
  • height参数的值"10000"赋给方法参数的height变量。

该请求表示一个商品的条件组合查询,商品名称是computer,查询的品牌是appleacer,价格区间是从200010000

单击“商品条件査询(品牌,价格区间)”超链接发送请求,将调用productTest方,浏览器显示结果如下:

1
2
3
通过@PathVariable获得数据: goods=computer
通过@MatrixVariable获得数据:brand=[apple, acer]
通过@MatrixVariable获得数据: low=2000 height=10000

可以看到,<a href="productTest/computer;brand=apple,acer;low=2000;height=10000">商品条件查询(品牌,价格区间)</a>的:

  • 参数brand的值"apple,acer"被传递到方法的brand集合变量,
  • 参数low的值"2000"被传递到方法的low变量参数
  • 参数height的值"10000"被传递到方法的height变量,最后输出在浏览器上