SpringMvc入门,阿里P7亲自讲解

本文是SpringMVC的入门介绍,详细讲述了如何配置和使用SpringMVC,包括核心模块、SpringWeb模块的相关坐标,以及如何配置前端控制器、组件扫描、视图解析器。还涉及到控制器的@RequestMapping注解的使用,如限制特定浏览器访问,以及RESTful API的实现。通过实例展示了如何处理HTTP请求方法,如GET、POST、DELETE、PUT。
摘要由CSDN通过智能技术生成
    *   *   [key:指定要获取的参数的key](about:blank#keykey_801)

        *   [required:这个参数是否必须的](about:blank#required_802)

        *   [defaultValue:默认值,没带默认是null](about:blank#defaultValuenull_803)

    *   [获取请求头的信息](about:blank#_821)

    *   [如果请求头中没有这个信息会报错](about:blank#font_colorred_837)

    *   [value,required,defaultvalue三个属性与@RequestParam注解里面的参数用法一致](about:blank#valuerequireddefaultvalueRequestParam_851)

    *   [@CookieValue获取请求中带来的某个Cookie值](about:blank#CookieValueCookie_869)

    *   [@CookieValue注解中三个属性: value,defaultValue,required](about:blank#CookieValue_valuedefaultValuerequired_884)

*   [传入POJO,SpringMVC自动封装---POJO:自定义对象](about:blank#POJOSpringMVCPOJO_899)

*   *   [如果我们的请求参数是一个POJO,SpringMVC会帮我们自动赋值,将POJO中的每一个属性,从Request参数中尝试获取出来,并封装即可](about:blank#POJOSpringMVCPOJORequest_972)

    *   [要封装类的无参构造和set,get方法不能少,并且变量名要和请求参数里面的名字相同](about:blank#font_colorredsetget_974)

*   [POJO的级联封装,封装POJO成员变量里面的自定义类型](about:blank#POJOPOJO_976)

*   [传入原生API](about:blank#API_1079)

*   *   [使用前先导入servlet的相关依赖](about:blank#font_colorredservlet_1080)

    *   [springmvc中支持的相关原生API](about:blank#springmvcAPI_1095)

*   [请求到的数据出现中文乱码的问题](about:blank#_1129)

*   *   [以前的解决方式](about:blank#_1134)

    *   [解决方法:配置一个字符编码的filter----Spring提供,只能解决POST请求乱码,以及响应乱码,GET方式的请求乱码解决看下一条](about:blank#font_colorredfilterSpringPOSTGET_1138)

    *   [使用SpringMVC前端控制器写完就直接写字符编码的Filter,tomcat一装上,上手就是server.xml的8080处添加URIEncoding="UTF-8",用于解决GET方式请求乱码问题](about:blank#font_colorredSpringMVCFiltertomcatserverxml8080URIEncodingUTF8GET_1163)

    *   [IDEA里面无法直接改server.xml的配置,需要去tomcat文件夹下的conf目录下找到server.xml进行修改](about:blank#font_colorgreenIDEAserverxmltomcatconfserverxml_1166)

    *   [springMVC字符编码Filter无效问题解决](about:blank#font_colorbluespringMVCFilter_1168)

    *   [字符编码的filter一般都在其他filter之前](about:blank#font_colorbluefilterfilter_1176)

概述

=================================================================

在这里插入图片描述

Spring的mvc实现思想


在这里插入图片描述

POJO


简单的Java对象(Plain Ordinary Java Objects)实际就是普通JavaBeans


SpringMVC思想是一个前段控制器能拦截所有请求,并智能派发

===============================================================================================

这个前段控制器是一个servlet,应该在web.xml中配置这个servlet来拦截所有请求

==============================================================================================================

快速入门

===================================================================

在这里插入图片描述

1.导入相关坐标


SpringMvc是SpringWeb模块,所有模块的运行都是依赖于核心模块(IOC模块)

核心模块相关坐标

spring坐标:


<!--导入spring的坐标-->

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-context</artifactId>

      <version>5.0.5.RELEASE</version>

    </dependency> 

SpringWeb模块相关坐标

spring-web坐标:


 <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-web</artifactId>

      <version>5.2.9.RELEASE</version>

    </dependency> 

spring-webmvc坐标:


 <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-webmvc</artifactId>

      <version>5.0.15.RELEASE</version>

    </dependency> 

aop模块相关坐标


 <!--导入aspectj的坐标-->

    <dependency>

      <groupId>org.aspectj</groupId>

      <artifactId>aspectjweaver</artifactId>

      <version>1.8.4</version>

    </dependency> 


2.配置springmvc的前段控制器—web.xml



<!--SpringMVC相关配置-->



  <!--配置springmcv的前段控制器-->

  <servlet>

    <servlet-name>DispatcherServlet</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!--SpringMvc.xml是前段控制器需要使用-->

    <!--sevlet的初始化参数-->

   <!--contextConfigLocation:指定SpringMVC配置文件的位置-->

    <init-param>

      <param-name>contextConfigLocation</param-name>

      <param-value>classpath:SpringMVC.xml</param-value>

    </init-param>

    <!--默认第一次访问时创建对象,这里填入1,表示服务器启动时创建镀锡-->

    <load-on-startup>1</load-on-startup>

  </servlet>



  <servlet-mapping>

    <servlet-name>DispatcherServlet</servlet-name>

    <!--

    /和/*都是拦截所有请求,但是/*的范围更大,还会拦截到*.jsp这些请求

    一旦拦截jsp页面就不会显示了

    /会拦截所有请求,但是不会拦截*.jsp,能保证jsp访问正常

    -->

    <url-pattern>/</url-pattern>

  </servlet-mapping> 

3.配置SpringMvc.xml----组件扫描(注解配置)



<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:context="http://www.springframework.org/schema/context"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       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的组件扫描,需要引入context命名空间-->

    <!--组件扫描-->

    <context:component-scan base-package="com.SpringMvc"/>

</beans> 


5.在web.xml中配置监听器,通过监听器的初始化方法,来加载applicationContext.xml配置文件



 <!--全局初始化参数-->

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>classpath:applicationContext.xml</param-value>

    </context-param>

    <!--配置监听器-->

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener> 


7.userController类



/*

* 1.告诉SpringMvc这是一个处理器,可以处理请求

* @Controller:标识哪个组件是控制器,能够区分其他组件,这个注解不能乱加

* */

@Controller

public class userController {

    /*

    * /代表从当前项目开始

    * 处理当前项目下的hello请求

    * 请求映射

    * */

    @RequestMapping("/hello")

    public String show()

    {

        System.out.println("收到请求");

        return "Success.jsp";

    }



} 


8.success.jsp



<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>Success</title>

</head>

<body>

<h1>Success!!!</h1>

</body>

</html> 


9.index.jsp



<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>小朋友</title>

</head>

<body>

<h1>小朋友</h1>

<br>

<a href="hello">点击跳转页面</a>

</body>

</html> 


10.配置视图解析器,帮助我们拼接页面地址


springmvc.xml:


 <!--视图解析器-->

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="prefix" value="/"/><!--前缀-->

        <property name="suffix" value=".jsp"/><!--后缀-->

    </bean> 

/*

  • 1.告诉SpringMvc这是一个处理器,可以处理请求

  • @Controller:标识哪个组件是控制器

  • */

@Controller

public class userController {

/*

* /代表从当前项目开始

* 处理当前项目下的hello请求

* 请求映射

* */

@RequestMapping("/hello")

public String show()

{

    System.out.println("收到请求");

    //视图解析器自动拼串

    //前缀+返回值+后缀

    return "Success";

}

}




![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718151958619.png)  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718152019361.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)  

地址栏没变,说明这是一次转发操作



* * *



[]( )运行流程分析

=====================================================================



**1.客户端点击链接发送http://localhost:8080/springmvc/hello 请求**  

**2.来到tomcat服务器**  

**3.springmvc的前段控制器收到所有请求**  

**4.查看请求地址和@RequestMapping标注的哪一个匹配,来找到到底使用哪个类的哪个方法来处理**  

**5.前段控制器找到了目标处理器和目标方法,直接利用反射执行目标方法**  

**6.方法执行完成以后,会有一个返回值,springmvc认为这个返回值就是要去的页面地址**  

**7.拿到方法返回值以后,用视图解析器进行拼串得到完整的页面地址**  

**8.拿到页面地址,前段控制器帮我妈转发到页面**



* * *



[]( )@RequestMapping分析

================================================================================



**作用:就是告诉SpringMvc这个方法用来处理什么请求**



**这里@RequestMapping("/hello")里面的/可以省略,即使省略了,也是默认从当前项目下开始,最好加上**



* * *



[]( )如果不在web.xml中指定配置文件位置的解决办法

========================================================================================



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718153331247.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718153526101.png)  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718153712222.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718153938936.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)



* * *



[]( )url-pattern的配置

=============================================================================



<servlet-name>DispatcherServlet</servlet-name>

<!--

/和/*都是拦截所有请求,但是/*的范围更大,还会拦截到*.jsp这些请求

一旦拦截jsp页面就不会显示了

/会拦截所有请求,但是不会拦截*.jsp,能保证jsp访问正常

处理*.jsp是tomcat做的事情

DefaultServlet是tomcat中处理静态资源的

除了jsp和servlet外,剩下的都是静态资源

index.html:静态资源,tomcat会在服务器下找到这个资源并返回

我们前端控制器的/禁用了tomcat服务器中的DefaultServlet(相当于子类重写了父类的配置,那么就会隐藏父类的配置)

1.服务器的大Web.xml中有一个DefaultServlet的url-pattern=/

2.我们配置的前端控制器url-pattern=/

静态资源会来到DefaultServlet(前端控制器)来看哪个方法的RequestMapping是这个index.html

3.我们没有覆盖服务器中的JspServlet的配置

4./*直接就是拦截所有请求,我们写/是为了迎合后来的Rest风格的URL地址

-->

<url-pattern>/</url-pattern>



* * *



[]( )使用@RequestMapping映射请求

====================================================================================



![在这里插入图片描述](https://img-blog.csdnimg.cn/2021071815502991.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)



[]( )一个方法处理一个请求,不能两个方法处理一个请求,不然报错

-------------------------------------------------------------------------------------------



[]( )类上加上注解,访问时的路径需要多加一层

----------------------------------------------------------------------------------



/*

  • 为当前类的所有的方法的请求地址指定了一个基准路径

  • */

@Controller

@RequestMapping("/haha")

public class userController {

/*

* /代表从当前项目开始

* 处理当前项目下的hello请求

* 请求映射

* */

@RequestMapping("/hello")

public String show()

{

    System.out.println("收到请求");

    //视图解析器自动拼串

    //前缀+返回值+后缀

    return "Success";

}

}




![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718184440399.png)



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718184431803.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)



* * *



[]( )@RequestMapping注解的相关属性

-------------------------------------------------------------------------------------



### []( )method限定请求方式



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718163803453.png)



@Controller

public class userController {

/*

* /代表从当前项目开始

* 处理当前项目下的hello请求

* 请求映射

* */

@RequestMapping(value = "/hello",method = RequestMethod.GET)

public String show()

{

    System.out.println("收到请求");

    //视图解析器自动拼串

    //前缀+返回值+后缀

    return "Success";

}

}




* * *



### []( )params规定请求参数



#### []( )建议看下面的这篇链接文章



[@RequestMapping中的params(请求参数映射限定)]( )



* * *



### []( )headers规定请求头



[@RequestMapping中的headers(请求头数据映射限定)]( )



/*

  • 为当前类的所有的方法的请求地址指定了一个基准路径

  • */

@Controller

public class userController {

/*

  • user-agent: 浏览器信息

  • 实现让谷歌不能访问,火狐能访问

  • */

    @RequestMapping(value = “/hello”,headers =

         {"User-Agent=User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"})
    

    public String show()

    {

     System.out.println("收到请求");
    
     //视图解析器自动拼串
    
     //前缀+返回值+后缀
    
     return "Success";
    

    }

}




* * *



### []( )consumes:只接收内容类型是哪种的请求,规定请求头中的content-type



### []( )produces:告诉浏览器返回的内容类型是什么,给响应头中加上Content-Type:text/html;char



[@RequestMapping中的consumes属性和produces属性]( )



* * *



### []( )ant风格的URL----URL地址可以写模糊的通配符



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718185245675.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718171151936.png)  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718171408684.png)  

\*号优先级比?号低



[]( )模糊和精确多个匹配情况下,精确优先

--------------------------------------------------------------------------------



* * *



**?代替一个字符:**



/*

  • 为当前类的所有的方法的请求地址指定了一个基准路径

  • */

@Controller

public class userController {

@RequestMapping("/antTest0?")

public String show()

{

    System.out.println("收到请求");

    //视图解析器自动拼串

    //前缀+返回值+后缀

    return "Success";

}

}




![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718185542759.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718185551188.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)



* * *



\*号匹配任意多个字符



@Controller

public class userController {

@RequestMapping("/antTest0*")

public String show()

{

    System.out.println("收到请求");

    //视图解析器自动拼串

    //前缀+返回值+后缀

    return "Success";

}

}




![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718185844172.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)



* * *



\*号代替一层路径,只能代替一层路径



@Controller

public class userController {

@RequestMapping("/*/antTest01")

public String show()

{

    System.out.println("收到请求");

    //视图解析器自动拼串

    //前缀+返回值+后缀

    return "Success";

}

}




![在这里插入图片描述](https://img-blog.csdnimg.cn/2021071819002136.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)  

**只能代替一层路径**  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718190041887.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)



* * *



\*\*代替多层路径



@Controller

public class userController {

@RequestMapping("/**/antTest01")

public String show()

{

    System.out.println("收到请求");

    //视图解析器自动拼串

    //前缀+返回值+后缀

    return "Success";

}

}




![在这里插入图片描述](https://img-blog.csdnimg.cn/2021071819020948.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)



* * *



[]( )路径上可以有占位符,占位符语法就是在任意路径的地方上写一个{变量名}

-------------------------------------------------------------------------------------------------



[]( )路径上的占位符只能占掉一层路径

------------------------------------------------------------------------------



@Controller

public class userController {

@RequestMapping("/antTest01/{id}")

public String show()

{

    System.out.println("收到请求");

    //视图解析器自动拼串

    //前缀+返回值+后缀

    return "Success";

}

}




[]( )获取路径上的占位符-----@PathVariable()

--------------------------------------------------------------------------------------------



[获取路径中的参数值——@PathVariable中的value]( )



@Controller

public class userController {

@RequestMapping("/antTest01/{id}")

public String show(@PathVariable("id")String id)

{

    System.out.println("路径上的占位符的值:"+id);

    System.out.println("收到请求");

    //视图解析器自动拼串

    //前缀+返回值+后缀

    return "Success";

}

}




![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718190828506.png)  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718190837573.png)



### []( )获取路径上的多层占位符



@Controller

public class userController {

@RequestMapping("/ant/{id1}/{id2}")

public String show(@PathVariable("id1")String id1,@PathVariable("id2")String id2)

{

    System.out.println("路径上的占位符的值1:"+id1);

    System.out.println("路径上的占位符值2:"+id2);

    System.out.println("收到请求");

    //视图解析器自动拼串

    //前缀+返回值+后缀

    return "Success";

}

}




![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718191521999.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718191528719.png)



* * *



[]( )REST风格的URL地址约束

=============================================================================



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718191954450.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718192224163.png)  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718192413648.png)



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718192240855.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718192313347.png)



* * *



[]( )Rest风格增删改查搭建

===========================================================================



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718192607775.png)



**环境搭建:**



BookController类:



@Controller

public class BookController {

/*处理查询图书的请求*/

@RequestMapping(value = “/book/{bid}”,method = RequestMethod.GET)

public String getBook(@PathVariable(“bid”) Integer id)

{

System.out.println("查询到了"+id+"号图书");

return "Success";

}

/添加图书/

@RequestMapping(value = "/book",method = RequestMethod.POST)

public String addBook()

{

    System.out.println("添加了图书");

    return "Success";

}

/*删除图书*/

@RequestMapping(value = "/book/{bid}",method = RequestMethod.DELETE)

public String deleteBook(@PathVariable("bid") Integer id)

{

    System.out.println("删除了"+id+"号图书");

    return "Success";

}

/*删除图书*/

@RequestMapping(value = "/book/{bid}",method = RequestMethod.PUT)

public String updateBook(@PathVariable("bid") Integer id)

{

    System.out.println("更新了"+id+"号图书");

    return "Success";

}

}




index.jsp:



<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

<title>小朋友</title>

<%–发起图书的增删改查请求,使用Rest风格的URL地址

请求URL 请求方式 表示含义

/book/1 GET 查询1号图书

/book/1 DELETE 删除1号图书

/book/1 PUT 更新1号图书

/book POST 添加1号图书

–%>

查询图书<%–默认都是GET请求–%>


<input type="submit" value="添加1号图书">

<input type="submit" value="删除1号图书">

<input type="submit" value="更新1号图书">



[]( )从页面发起PUT和DELETE形式的请求,Spring提供了对REST风格的支持

-------------------------------------------------------------------------------------------------------



### []( )SpringMVC中有一个Filter,他可以把普通的请求转化为规定形式的请求



#### []( )在web.xml中配置这个filter



<filter-name>HiddenHttpMethodFilter</filter-name>

<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
<filter-name>HiddenHttpMethodFilter</filter-name>

<!--拦截所有请求-->

<url-pattern>/*</url-pattern>



#### []( )发送其他形式的请求



##### []( )1.创建一个post表单



##### []( )2.在表单中携带一个\_method的参数



##### []( )3.这个\_method的值,就是DELETE,PUT



<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

<title>小朋友</title>

<%–发起图书的增删改查请求,使用Rest风格的URL地址

请求URL 请求方式 表示含义

/book/1 GET 查询1号图书

/book/1 DELETE 删除1号图书

/book/1 PUT 更新1号图书

/book POST 添加1号图书

–%>

<input type="submit" value="查询1号图书">

<input type="submit" value="添加1号图书">

<%–发送delete请求–%>

<input name="_method" value="delete">

<input type="submit" value="删除1号图书">

<%–发送put请求–%>

<input name="_method" value="put">

<input type="submit" value="更新1号图书">



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718202531425.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718202522846.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)



* * *



#### []( )高版本tomcat,REST支持有点问题



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718202856685.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTU3MTcz,size_16,color_FFFFFF,t_70)



折中解决法: 在要跳转到的页面success,jsp中添加:



isErrorPage=“true”




这样发生异常时也会跳转到该页面



<%@ page contentType=“text/html;charset=UTF-8” language=“java” isErrorPage=“true” %>

<title>Success</title>

Success!!!




* * *




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值