SpringMVC 与表单提交(post/put/delete的用法)
为了迎合Restful风格,提供的接口可能会包含:put、delete提交方式。在springmvc中实现表单以put、delete方式提交时,需要使用HiddenHttpMethodFilter过滤器。该过滤器的实现原理,默认在form表单内部定义一个hidden隐藏的标签,默认需要标签名为:_method,hidden标签的value为put或delete;过滤器会接收_method的hidden标签的value,如果发现存在_method的标签,并且value为put或delete时,会重新包装一个请求,请求类型会设置为_method标签的value值。进而实现将post方式提交表单转化为Delete或Put请求。
实现form post表当以put或delete方式提交的步骤包含以下:
idea下创建一个pom.xml工程:
创建完后,工程结构如下:
设置web.xml配置如下:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>springmvcdemo</display-name> <welcome-file-list> <welcome-file>/index</welcome-file> </welcome-file-list> <!--结束后端数据输出到前端乱码问题--> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> <!--可以通过配置覆盖默认'_method'值 --> <init-param> <param-name>methodParam</param-name> <param-value>_method</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>myAppServletName</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>myAppServletName</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
此时在WEB-INF下还需要新建一个applicationContext.xml配置文件,配置文件内容如下:
<?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" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--扫描所有的 spring包下的文件;--> <!--当然需要在spring配置文件里面配置一下自动扫描范围 <context:component-scan base-package="*"/> *代表你想要扫描的那些包的目录所在位置。Spring 在容器初始化时将自动扫描 base-package 指定的包及其子包下的所有的.class文件, 所有标注了 @Repository 的类都将被注册为 Spring Bean。 --> <context:component-scan base-package="com.dx.test"/> <!--新增加的两个配置,这个是解决406问题的关键--> <!--mvc注解驱动(可代替注解适配器与注解映射器的配置),默认加载很多参数绑定方法(实际开发时使用)--> <context:annotation-config/> <mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> <property name="contentType" value="text/html;charset=UTF-8" /> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> </bean> <!--自己后加的,该BeanPostProcessor将自动对标注@Autowired的bean进行注入--> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"></bean> <bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> <property name="messageConverters"> <list> <!--<ref bean="stringHttpMessageConverter"/>--> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/> <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/> <bean class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"/> <!-- <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> --> </list> </property> </bean> </beans>
配置pom.xml引入依赖如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.dx.test</groupId> 8 <artifactId>demo</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 <packaging>war</packaging> 11 12 <name>demo Maven Webapp</name> 13 <!-- FIXME change it to the project's website --> 14 <url>http://www.example.com</url> 15 16 <properties> 17 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 18 <maven.compiler.source>1.8</maven.compiler.source> 19 <maven.compiler.target>1.8</maven.compiler.target> 20 <!--Spring版本号--> 21 <spring.version>5.2.0.RELEASE</spring.version> 22 <!--jstl标签库--> 23 <jstl.version>1.2</jstl.version> 24 <standard.version>1.1.2</standard.version> 25 </properties> 26 27 <dependencies> 28 <!-- servlet相关 29 <dependency> 30 <groupId>javax.servlet</groupId> 31 <artifactId>servlet-api</artifactId> 32 <version>2.5</version> 33 <scope>provided</scope> 34 </dependency> 35 --> 36 <dependency> 37 <groupId>javax.servlet</groupId> 38 <artifactId>javax.servlet-api</artifactId> 39 <version>3.0.1</version> 40 <scope>provided</scope> 41 </dependency> 42 43 <!--form 设置为enctype="multipart/form-data",多文件上传,在applicationContext.xml中配置了bean multipartResolver时,需要依赖该包。--> 44 <dependency> 45 <groupId>commons-fileupload</groupId> 46 <artifactId>commons-fileupload</artifactId> 47 <version>1.4</version> 48 </dependency> 49 50 <dependency> 51 <groupId>commons-io</groupId> 52 <artifactId>commons-io</artifactId> 53 <version>2.5</version> 54 </dependency> 55 56 <!--spring单元测试依赖--> 57 <dependency> 58 <groupId>org.springframework</groupId> 59 <artifactId>spring-test</artifactId> 60 <version>${spring.version}</version> 61 <scope>test</scope> 62 </dependency> 63 64 <!--springMVC核心包--> 65 <dependency> 66 <groupId>org.springframework</groupId> 67 <artifactId>spring-webmvc</artifactId> 68 <version>${spring.version}</version> 69 </dependency> 70 71 <!--spring核心包--> 72 <dependency> 73 <groupId>org.springframework</groupId> 74 <artifactId>spring-core</artifactId> 75 <version>${spring.version}</version> 76 </dependency> 77 78 <dependency> 79 <groupId>org.springframework</groupId> 80 <artifactId>spring-beans</artifactId> 81 <version>${spring.version}</version> 82 </dependency> 83 84 <dependency> 85 <groupId>org.springframework</groupId> 86 <artifactId>spring-context</artifactId> 87 <version>${spring.version}</version> 88 </dependency> 89 90 <dependency> 91 <groupId>org.springframework</groupId> 92 <artifactId>spring-context-support</artifactId> 93 <version>${spring.version}</version> 94 </dependency> 95 96 <dependency> 97 <groupId>org.springframework</groupId> 98 <artifactId>spring-aop</artifactId> 99 <version>${spring.version}</version> 100 </dependency> 101 102 <dependency> 103 <groupId>org.springframework</groupId> 104 <artifactId>spring-aspects</artifactId> 105 <version>${spring.version}</version> 106 </dependency> 107 108 <dependency> 109 <groupId>org.springframework</groupId> 110 <artifactId>spring-tx</artifactId> 111 <version>${spring.version}</version> 112 </dependency> 113 114 <dependency> 115 <groupId>org.springframework</groupId> 116 <artifactId>spring-web</artifactId> 117 <version>${spring.version}</version> 118 </dependency> 119 120 <dependency> 121 <groupId>org.springframework</groupId> 122 <artifactId>spring-jdbc</artifactId> 123 <version>${spring.version}</version> 124 </dependency> 125 126 <!--AOP begin--> 127 <dependency> 128 <groupId>org.aspectj</groupId> 129 <artifactId>aspectjrt</artifactId> 130 <version>1.8.13</version> 131 </dependency> 132 133 <dependency> 134 <groupId>org.aspectj</groupId> 135 <artifactId>aspectjrt</artifactId> 136 <version>1.8.13</version> 137 </dependency> 138 139 <dependency> 140 <groupId>cglib</groupId> 141 <artifactId>cglib</artifactId> 142 <version>3.2.5</version> 143 </dependency> 144 <!--AOP end--> 145 146 <!--json依赖--> 147 <dependency> 148 <groupId>org.codehaus.jackson</groupId> 149 <artifactId>jackson-core-asl</artifactId> 150 <version>1.5.2</version> 151 </dependency> 152 <dependency> 153 <groupId>org.codehaus.jackson</groupId> 154 <artifactId>jackson-mapper-asl</artifactId> 155 <version>1.5.2</version> 156 </dependency> 157 158 <!--jstl库--> 159 <dependency> 160 <groupId>javax.servlet</groupId> 161 <artifactId>jstl</artifactId> 162 <version>${jstl.version}</version> 163 <scope>runtime</scope> 164 </dependency> 165 <dependency> 166 <groupId>taglibs</groupId> 167 <artifactId>standard</artifactId> 168 <version>${standard.version}</version> 169 </dependency> 170 171 <dependency> 172 <groupId>junit</groupId> 173 <artifactId>junit</artifactId> 174 <version>4.11</version> 175 <scope>test</scope> 176 </dependency> 177 </dependencies> 178 179 <build> 180 <finalName>demo</finalName> 181 <plugins> 182 <!-- 配置Tomcat插件 --> 183 <plugin> 184 <groupId>org.apache.tomcat.maven</groupId> 185 <artifactId>tomcat7-maven-plugin</artifactId> 186 <version>2.2</version> 187 <configuration> 188 <port>9090</port> 189 <path>/</path> 190 <uriEncoding>UTF-8</uriEncoding> 191 <server>tomcat7</server> 192 </configuration> 193 </plugin> 194 </plugins> 195 <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> 196 <plugins> 197 <plugin> 198 <artifactId>maven-clean-plugin</artifactId> 199 <version>3.1.0</version> 200 </plugin> 201 <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> 202 <plugin> 203 <artifactId>maven-resources-plugin</artifactId> 204 <version>3.0.2</version> 205 </plugin> 206 <plugin> 207 <artifactId>maven-compiler-plugin</artifactId> 208 <version>3.8.0</version> 209 </plugin> 210 <plugin> 211 <artifactId>maven-surefire-plugin</artifactId> 212 <version>2.22.1</version> 213 </plugin> 214 <plugin> 215 <artifactId>maven-war-plugin</artifactId> 216 <version>3.2.2</version> 217 </plugin> 218 <plugin> 219 <artifactId>maven-install-plugin</artifactId> 220 <version>2.5.2</version> 221 </plugin> 222 <plugin> 223 <artifactId>maven-deploy-plugin</artifactId> 224 <version>2.8.2</version> 225 </plugin> 226 </plugins> 227 </pluginManagement> 228 </build> 229 </project>