<spring.version>4.3.18.RELEASE</spring.version><!-- spring-mvc begin --><dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version></dependency><dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version></dependency><!-- spring-mvc end -->前端核心控制器(dispatcherServlet)
Rest风格 请求转换过滤器
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <!--前端核心控制器 springMvc框架提供的 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置初始化参数,指定springMvc的核心配置文件,目的就是自动创建容器对象 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <!-- web容器启动,优先创建前端核心控制器实例对象 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <!-- 拦截所有的请求处理,放行jsp --> <url-pattern>/</url-pattern> </servlet-mapping> <!-- Rest风格 请求转换过滤器--> <filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping></web-app><?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="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="com.kgc.mvc"></context:component-scan> <!-- jsp 视图解析器 --> <!-- 作用:当请求处理方法返回一个目标视图页面的名称,视图解析器会自动将返回的视图名称解析为真实的物理视图(prefix + 目标视图页面名称 + suffix) --> <bean > <!-- 统一前缀,请求处理方法返回目标视图名称时,会被统一增加此前缀目录(目录视图目录),结尾的 / 不能少 --> <property name="prefix" value="/WEB-INF/views/"></property> <!-- 统一后缀,请求处理方法返回目标视图名称时,会被统一增加此后缀 --> <property name="suffix" value=".jsp"></property> </bean></beans>需求,浏览器发送请求helloMvc,请求后端处理方法,返回目标success。jsp页面,并在页面中显示 Hello Mvc in KH96;
@Controller //不可以用其他的分层注解替换,只能用controller (1.可以作为一个控制层组件扫描到容器 2.代表一个控制器)public class HelloMvcController { //接收helloMvc,跳转到目标success.jsp @RequestMapping("/helloMvc") //定义当前请求控制器中,可以处理请求的映射url字符串,前面的 / 可写 可不写 public String helloSpringMvc(){ System.out.println("------ 调用 HelloMvcController控制器的 helloSpringMvc() 请求处理方法------"); //目标jsp视图页面的名称(不带后缀),区分大小写 return "success"; }}webapp/WEB-INF/views/success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>成功页面</title></head><body> <h2>KH96 Success Page</h2></body></html>
springMvc使用流程小结:
即:将控**制器组件**(加了@Controller注解)**加入到容器中**,并**自动解析**加入的**请求控制器**,可以得到**请求处理url**和**请求处理方法**的**映射**; 2、客户端浏览器,**发送请求**:http://localhost:8080/springmvc-01/helloMvc 3、请求会被 **前端核心控制器** **拦截**(匹配到**前端核心控制器**的**url-pattern**) 4、**前端核心控制器** ,自动根据请求**url和请求处理方法的映射关系**,进行**映射查找**,如果**找到了**对应关系,自动将**当前请求**发送**给目标请求处理器**的请求处理方法,进行业务处理,如果**没有找到**,直接**报错误404**; 5、目标请求处理方法,处理完业务后,**返回**一个目标**视图的名称**-success类上和方法上 :
类上:相对于web应用根目录的;
方法上:相对于类上的映射,如果类上没有,就是相对于web应用根目录;
@RequestMapping("/testSpringMvcRequestMappingTarget")public String testMvcRequestMappingTarget(){ //返回成功页面 return "hello";}测试

@Controller@RequestMapping("/kh96")public class SpringMvcController { @RequestMapping("/testSpringMvcRequestMappingTarget") public String testMvcRequestMappingTarget(){ //返回成功页面 return "hello"; } }测试

作用:指定当前请求处理方法的请求方式;
一旦指定了请求方式,就只能使用指定的请求方式,才可以映射处理,不指定,自动适配(所有方式都可以);
method 属性可以指定多个请求方式;
@RequestMapping(value = "/testSpringMvcRequestMappingMethodGet",method = RequestMethod.GET)public String testSpringMvcRequestMappingMethodGet(){ System.out.println("----- @RequestMapping method = RequestMethod.GET ------"); //返回成功页面 return "hello";}使用PostMan测试
Get测试

Post测试

@RequestMapping(value = "/testSpringMvcRequestMappingMethodPost",method = RequestMethod.POST)public String testSpringMvcRequestMappingMethodPost(){ System.out.println("----- @RequestMapping method = RequestMethod.Post ------"); //返回成功页面 return "hello";}Get测试

Post测试

@RequestMapping(value = "/testSpringMvcRequestMappingMethodGetAndPost",method = {RequestMethod.GET,RequestMethod.POST})public String testSpringMvcRequestMappingMethodGetAndPost(){ System.out.println("----- @RequestMapping method = RequestMethod.Post ------"); //返回成功页面 return "hello";}Get测试

Post测试

指定当前请求处理方法对于请求,必要携带的参数:
指定一个参数,不指定参数值;
@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname"} )public String testSpringMvcRequestMappingParams(){ System.out.println("----- @RequestMapping 属性 params------"); //返回成功页面 return "hello";}测试,不带参数

测试,带参数,不带值

测试,带参数,带值

指定一个参数,指定值;
@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname=kh96"} )public String testSpringMvcRequestMappingParams(){ System.out.println("----- @RequestMapping 属性 params------"); //返回成功页面 return "hello";}测试,带参数,带值,值不匹配

测试,带参数,带值,值匹配

指定两个参数,并指定值;
@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname=kh96","upwd=123"})public String testSpringMvcRequestMappingParams(){ System.out.println("----- @RequestMapping 属性 params------"); //返回成功页面 return "hello";}测试,带一个参数,并指定值

测试,带两个参数,并指定第一个值

测试,带两个参数,并指定第两个值

指定当前请求处理方法对于请求,必要携带的请求头参数,用法和params类似,参数位置不同;
@RequestMapping(value = "/testSpringMvcRequestMappingHeaders",headers = {"token=123"})public String testSpringMvcRequestMappingHeaders(){ System.out.println("----- @RequestMapping 属性 headers------"); //返回成功页面 return "hello";}测试,主要观察参数位置,其他参数规则跟params一致

请求映射注解:参数占位符注解 @PathVariable:
@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel#}/{uemail}")public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable("uemail") String uemail){ System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------"); //返回成功页面 return "hello";}测试结果

@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail}")public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable("uemail") String uemail){ System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------"); //返回成功页面 return "hello";}测试结果

测试,占位符与形参不一致
@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail#}")public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable String uemail){ System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------"); //返回成功页面 return "hello";}测试结果

测试,占位符与形参一致
@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail}")public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable String uemail){ System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------"); //返回成功页面 return "hello";}测试结果

相同的请求路径,通过请求方式判断请求方法;
自定义请求方式,一定要带一个名字为_method的参数;
<!-- Rest风格 请求转换过滤器--><filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>请求方法
//请求映射注解:rest风格处理-get,查询select//@RequestMapping(value = "/testSpringMvcRequestMappingRestGet/{uid}",method = RequestMethod.GET)@RequestMapping(value = "/testSpringMvcRequestMappingRest/{uid}",method = RequestMethod.GET)public String testSpringMvcRequestMappingRestGet(@PathVariable("uid") String uid){ System.out.println("----- Rest Get 根据 uid:"+uid+" 查询用户详情 ------"); //返回成功页面 return "hello";}jsp
<h3>Get 请求映射注解:rest风格处理-get,查询select</h3><h3><a href="${pageContext.request.contextPath}/testSpringMvcRequestMappingRest/KH96_01">Test SpringMvc Rest Get</a> </h3>测试

//请求映射注解:rest风格处理-post,新增insert//@RequestMapping(value = "/testSpringMvcRequestMappingRestPost",method = RequestMethod.POST)@RequestMapping(value = "/testSpringMvcRequestMappingRest",method = RequestMethod.POST)public String testSpringMvcRequestMappingRestPost(){ System.out.println("----- Rest Post 新增用户详情 ------"); //返回成功页面 return "hello";}jsp
<h3>Post 求映射注解:rest风格处理-post,新增insert</h3><form action="testSpringMvcRequestMappingRest" method="post"> <input type="submit" value="Test SpringMvc Rest Post"></form>测试

//请求映射注解:rest风格处理-put,更新update//@RequestMapping(value = "/testSpringMvcRequestMappingRestPut",method = RequestMethod.PUT)@RequestMapping(value = "/testSpringMvcRequestMappingRest",method = RequestMethod.PUT)public String testSpringMvcRequestMappingRestPut(){ System.out.println("----- Rest Put 更新用户详情 ------"); //返回成功页面 return "hello";}jsp
<h3>Put 请求映射注解:rest风格处理-put,更新update</h3><form action="testSpringMvcRequestMappingRest" method="post"> <input type="hidden" name="_method" value="put"> <input type="submit" value="Test SpringMvc Rest put"></form>测试

//请求映射注解:rest风格处理-delete,删除delete//@RequestMapping(value = "/testSpringMvcRequestMappingRestDelete/{uid}",method = RequestMethod.DELETE)@RequestMapping(value = "/testSpringMvcRequestMappingRest/{uid}",method = RequestMethod.DELETE)public String testSpringMvcRequestMappingRestDelete(@PathVariable("uid") String uid){ System.out.println("----- Rest Delete 根据 uid:"+uid+" 删除用户 ------"); //返回成功页面 return "hello";}jsp
<h3>Delete 请求映射注解:rest风格处理-delete,删除delete</h3><form action="testSpringMvcRequestMappingRest/KH96_01" method="post"> <input type="hidden" name="_method" value="delete"> <input type="submit" value="Test SpringMvc Rest delete"></form>测试
