SpringMvc(一)-初识

打印 上一主题 下一主题

主题 900|帖子 900|积分 2700

1、环境搭建

1.1 jar包
  1. <spring.version>4.3.18.RELEASE</spring.version>
  2. <dependency>
  3.     <groupId>org.springframework</groupId>
  4.     <artifactId>spring-web</artifactId>
  5.     <version>${spring.version}</version>
  6. </dependency>
  7. <dependency>
  8.     <groupId>org.springframework</groupId>
  9.     <artifactId>spring-webmvc</artifactId>
  10.     <version>${spring.version}</version>
  11. </dependency>
复制代码
1.2 web.xml


  • 前端核心控制器(dispatcherServlet)

    • 配置初始化参数,指定springMvc的核心配置文件,目的就是自动创建容器对象
    • 启动级别 1

  • Rest风格 请求转换过滤器
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  4.          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5.          id="WebApp_ID" version="3.1">
  6.    
  7.     <servlet>
  8.         <servlet-name>dispatcherServlet</servlet-name>
  9.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  10.         
  11.         <init-param>
  12.             <param-name>contextConfigLocation</param-name>
  13.             <param-value>classpath:spring-mvc.xml</param-value>
  14.         </init-param>
  15.         
  16.         <load-on-startup>1</load-on-startup>
  17.     </servlet>
  18.     <servlet-mapping>
  19.         <servlet-name>dispatcherServlet</servlet-name>
  20.         
  21.         <url-pattern>/</url-pattern>
  22.     </servlet-mapping>
  23.    
  24.     <filter>
  25.         <filter-name>hiddenHttpMethodFilter</filter-name>
  26.         <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  27.     </filter>
  28.     <filter-mapping>
  29.         <filter-name>hiddenHttpMethodFilter</filter-name>
  30.         <url-pattern>/*</url-pattern>
  31.     </filter-mapping>
  32. </web-app>
复制代码
1.3spring-mvc.xml


  • 组件扫描
  • 视图解析器
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:context="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <context:component-scan base-package="com.kgc.mvc"></context:component-scan>
  8.    
  9.    
  10.     <bean >
  11.         
  12.         <property name="prefix" value="/WEB-INF/views/"></property>
  13.         
  14.         <property name="suffix" value=".jsp"></property>
  15.     </bean>
  16. </beans>
复制代码
2、Mvc 使用流程

需求,浏览器发送请求helloMvc,请求后端处理方法,返回目标success。jsp页面,并在页面中显示 Hello Mvc in KH96;
2.1 HelloMvcController
  1. @Controller //不可以用其他的分层注解替换,只能用controller  (1.可以作为一个控制层组件扫描到容器  2.代表一个控制器)
  2. public class HelloMvcController {
  3.     //接收helloMvc,跳转到目标success.jsp
  4.     @RequestMapping("/helloMvc") //定义当前请求控制器中,可以处理请求的映射url字符串,前面的 / 可写 可不写
  5.     public String helloSpringMvc(){
  6.         System.out.println("------ 调用 HelloMvcController控制器的 helloSpringMvc() 请求处理方法------");
  7.         //目标jsp视图页面的名称(不带后缀),区分大小写
  8.         return "success";
  9.     }
  10. }
复制代码
2.2 success.jsp

webapp/WEB-INF/views/success.jsp
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4.     <title>成功页面</title>
  5. </head>
  6. <body>
  7.     <h2>KH96 Success Page</h2>
  8. </body>
  9. </html>
复制代码
2.3 测试


2.4 总结

springMvc使用流程小结:

  • 1、Tomcat服务器启动时,自动创建前端核心控制器的实例-DispatcherServlet,同时自动读取配置的spring-mvc.xml核心配置文件,创建容器对象,并扫描组件加入到容器中;

      1. 即:将控**制器组件**(加了@Controller注解)**加入到容器中**,并**自动解析**加入的**请求控制器**,可以得到**请求处理url**和**请求处理方法**的**映射**;
      复制代码

    1. 2、客户端浏览器,**发送请求**:http://localhost:8080/springmvc-01/helloMvc
    复制代码
    1. 3、请求会被 **前端核心控制器** **拦截**(匹配到**前端核心控制器**的**url-pattern**)
    复制代码
    1. 4、**前端核心控制器** ,自动根据请求**url和请求处理方法的映射关系**,进行**映射查找**,如果**找到了**对应关系,自动将**当前请求**发送**给目标请求处理器**的请求处理方法,进行业务处理,如果**没有找到**,直接**报错误404**;
    复制代码
    1. 5、目标请求处理方法,处理完业务后,**返回**一个目标**视图的名称**-success
    复制代码
  • 6、返回的目标视图名称,仍然会交给 前端核心控制器 进行视图解析(自动调用容器中添加的视图解析器解析),会得到一个真实的目标物理视图页面(要跳转的真实页面),进行响应跳转目标页面给浏览器显示;
3、@RequestMapping

3.1 @RequestMapping可以写的位置

类上方法上

  • 类上:相对于web应用根目录的;
  • 方法上:相对于类上的映射,如果类上没有,就是相对于web应用根目录
3.1.1 只用方法上有
  1. @RequestMapping("/testSpringMvcRequestMappingTarget")
  2. public String testMvcRequestMappingTarget(){
  3.     //返回成功页面
  4.     return "hello";
  5. }
复制代码
测试

3.1.2 类上 和 方法上都有
  1. @Controller
  2. @RequestMapping("/kh96")
  3. public class SpringMvcController {
  4.     @RequestMapping("/testSpringMvcRequestMappingTarget")
  5.     public String testMvcRequestMappingTarget(){
  6.         //返回成功页面
  7.         return "hello";
  8.     }
  9.    
  10. }
复制代码
测试

3.2 method属性


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

Post测试

3.2.2 method = RequestMethod.POST
  1. @RequestMapping(value = "/testSpringMvcRequestMappingMethodPost",method = RequestMethod.POST)
  2. public String testSpringMvcRequestMappingMethodPost(){
  3.     System.out.println("----- @RequestMapping method = RequestMethod.Post ------");
  4.     //返回成功页面
  5.     return "hello";
  6. }
复制代码
Get测试

Post测试

3.2.3 method = {RequestMethod.GET,RequestMethod.POST})
  1. @RequestMapping(value = "/testSpringMvcRequestMappingMethodGetAndPost",method = {RequestMethod.GET,RequestMethod.POST})
  2. public String testSpringMvcRequestMappingMethodGetAndPost(){
  3.     System.out.println("----- @RequestMapping method = RequestMethod.Post ------");
  4.     //返回成功页面
  5.     return "hello";
  6. }
复制代码
Get测试

Post测试

3.3 params属性

指定当前请求处理方法对于请求,必要携带的参数

  • 写法1:指定当前请求必须携带的参数名没有参数值,可以指定多个(大括号,逗号分割),如果请求没有携带params的所有参数,请求404;
  • 写法2:指定当前请求必须携带的参数名对应的参数值,可以指定多个(大括号,逗号分割),如果请求没有携带params指定的所有参数请求404,如果请求携带的参数及对应的参数值不匹配,请求404;

    • 注意:携带的参数值必须是指定的参数值

  • 总结,必须携带所有参数,如果有指定参数值必须携带参数值且携带的参数值必须一致
3.3.1 params ={"uname"}

指定一个参数,不指定参数值;
  1. @RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname"} )
  2. public String testSpringMvcRequestMappingParams(){
  3.     System.out.println("----- @RequestMapping 属性 params------");
  4.     //返回成功页面
  5.     return "hello";
  6. }
复制代码
测试,不带参数

测试,带参数,不带值

测试,带参数,带值

3.3.2 params ={"uname=kh96"}

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

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

3.3.3 params ={"uname=kh96","upwd=123"}

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

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

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

3.4 headers属性

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

3.5 @RequestMapping + @PathVariable

请求映射注解:参数占位符注解 @PathVariable:

  • 写法:只能携带请求处理方法的形参中,自动将RequestMapping中指定的url使用的占位符绑定参数值

    • 即:请求地址映射为: /url/{参数名},目标请求为:/url/参数值,自动将参数值绑定到指定参数名上;

  • 要求1:@RequestMapping("指定参数名")注解请求url中,指定的占位符参数名必须跟当前请求方法形参中@PathVariable注解指定的参数名一致;否者报错: Could not find @PathVariable [utel] in @RequestMapping
  • 要求2:@RequestMapping,只写注解,不指定参数名,指定的占位符参数名,必须跟当前请求方法形参名一致(也就是默认为形参名);否则,报错:Could not find @PathVariable [uemail] in @RequestMapping
3.5.1 测试

3.5.1.1  占位符与@PathVariable注解指定的参数名不一致
  1. @RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel#}/{uemail}")
  2. public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable("uemail") String uemail){
  3.     System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
  4.     //返回成功页面
  5.     return "hello";
  6. }
复制代码
测试结果

3.5.1.2  占位符与@PathVariable注解指定的参数名一致
  1. @RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail}")
  2. public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable("uemail") String uemail){
  3.     System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
  4.     //返回成功页面
  5.     return "hello";
  6. }
复制代码
测试结果

3.5.1.3  @PathVariable不指定参数名

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

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

4.Rest风格


  • get------查询select
  • post------新增insert
  • put------更新update
  • delete------删除delete
相同请求路径,通过请求方式判断请求方法
自定义请求方式,一定要带一个名字为_method的参数
4.1 Rest风格 请求转换过滤器
  1. <filter>
  2.     <filter-name>hiddenHttpMethodFilter</filter-name>
  3.     <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6.     <filter-name>hiddenHttpMethodFilter</filter-name>
  7.     <url-pattern>/*</url-pattern>
  8. </filter-mapping>
复制代码
4.1 get------查询 select

请求方法
  1. //请求映射注解:rest风格处理-get,查询select
  2. //@RequestMapping(value = "/testSpringMvcRequestMappingRestGet/{uid}",method = RequestMethod.GET)
  3. @RequestMapping(value = "/testSpringMvcRequestMappingRest/{uid}",method = RequestMethod.GET)
  4. public String testSpringMvcRequestMappingRestGet(@PathVariable("uid") String uid){
  5.     System.out.println("----- Rest Get 根据 uid:"+uid+" 查询用户详情 ------");
  6.     //返回成功页面
  7.     return "hello";
  8. }
复制代码
jsp
  1. <h3>Get 请求映射注解:rest风格处理-get,查询select</h3>
  2. <h3><a target="_blank" href="https://www.cnblogs.com/${pageContext.request.contextPath}/testSpringMvcRequestMappingRest/KH96_01">Test SpringMvc Rest Get</a> </h3>
复制代码
测试

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

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

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表