示例 @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 {
@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(); } }
@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(); } }
@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">
<context:component-scan base-package="org.fkit.controller" /> <mvc:annotation-driven enable-matrix-variables="true" /> <mvc:default-servlet-handler />
<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
,查询的品牌是apple
和acer
,价格区间是从2000
到10000
单击“商品条件査询(品牌,价格区间)”超链接发送请求,将调用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
变量,最后输出在浏览器上