SpringMVC处理Put或Delete请求报错及解决方法

首先先贴原代码和报错提示
1.在web.xml配置文件中配置HiddenHttpMethodFilter,它的作用是能把POST请求转换为PUT或DELETE请求。

<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>/*
  		

2.配置视图解析器

<!-- 配置自动扫描的包 -->
	<context:component-scan base-package="com.boyu.springmvc"></context:component-scan>
	
	<!-- 配置视图解析器:如何把Handler方法返回的值解析为实际的物理视图 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/view/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>

3.在JSP页面中发送PUT或DELETE请求。注意表单中method必须为post,隐藏域中name和value属性如下所示:

<form action="SpringMVC/testRest/1" method="post">
		<input type="hidden" name="_method" value="PUT"/>
		<input type="submit" value="testRest PUT"/>
	</form>
	<br><br>
	
	<form action="SpringMVC/testRest/1" method="post">
		<input type="hidden" name="_method" value="DELETE"/>
		<input type="submit" value="testRest DELETE"/>
	</form>
	<br><br>

4.在目标方法中接收请求

@RequestMapping("/SpringMVC")
@Controller
public class SpringMVCTest {
	
	private static final String Success = "Success";
	
	@RequestMapping(value="/testRest/{id}", method=RequestMethod.PUT)
	@ResponseBody
	public String testRestPut(@PathVariable Integer id) {
		System.out.println("testRest Put:"+id);
		return Success;
	}
	
	@RequestMapping(value="/testRest/{id}", method=RequestMethod.DELETE)
	public String testRestDelete(@PathVariable Integer id) {
		System.out.println("testRest Delete:"+id);
		return Success;
	}
}

4.正常来说是可以跳转到Success.jsp页面的,但是却出现了错误(我就只贴文字了)
HTTP Status 405 – Method Not Allowed
Type Status Report
消息 JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS
描述 请求行中接收的方法由源服务器知道,但目标资源不支持
Apache Tomcat/9.0.20

5.原因分析:JSP只支持GET与POST请求,而我们发起的是REST风格的请求,同样调用了PUT与DELETE方法,JSP无法解析。

6.解决方法:为controller里的testRestPut和tsetRestDelete方法添加**@ResponseBody注解**。如下所示:

@RequestMapping(value="/testRest/{id}", method=RequestMethod.PUT)
	@ResponseBody
	public String testRestPut(@PathVariable Integer id) {
		System.out.println("testRest Put:"+id);
		return Success;
	}
	
	@RequestMapping(value="/testRest/{id}", method=RequestMethod.DELETE)
	@ResponseBody
	public String testRestDelete(@PathVariable Integer id) {
		System.out.println("testRest Delete:"+id);
		return Success;
	}

然后上网查阅了@responseBody注解的作用,这里大致贴一段:
-)将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。添加此注解后,直接将数据写入到输入流,不会再走视图处理器。他的效果等同于通过response对象输出指定格式的数据。
添加注解之后顺利解决问题。

你可能感兴趣的:(Spring学习)