示例 @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变量,最后输出在浏览器上