[SPRING] Spring MVC에서 PUT과 DELETE 메소드 사용하기
SPRINGSpring MVC에서 PUT과 DELETE 메소드 사용하기
Spring MVC 컨트롤러 (버전 3.0.2) RequestMethod.PUT 및 RequestMethod.DELETE 사용하려고합니다. 다음과 같이 Spring 컨트롤러 클래스의 URL로 매핑되는 세 가지 메소드가있다 (데모 목적으로 만 PUT, GET 및 POST).
@RequestMapping(method = {RequestMethod.PUT}, value = {"admin_side/Temp"}, headers = {"content-type=multipart/form-data"})
public String update(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) {
if (ServletFileUpload.isMultipartContent(request)) {
System.out.println("true");
}
System.out.println("Request method PUT");
return "admin_side/Temp";
}
@RequestMapping(method = {RequestMethod.GET}, value = {"admin_side/Temp"})
public String showForm(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) {
System.out.println("Request method GET");
return "admin_side/Temp";
}
@RequestMapping(method = {RequestMethod.POST}, value = {"admin_side/Temp"})
public String onSubmit(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) {
System.out.println("Request method POST");
return "admin_side/Temp";
}
페이지가로드 될 때 GET 메소드가 명백하게 호출되지만 다른 모든 경우 (페이지가 제출 될 때) 호출되는 유일한 메소드는 POST이며 RequestMethod.PUT로 지정된 메소드는 호출되지 않습니다.
Spring 폼은 제출 버튼과 이미지 브라우저 만 포함한다.
<form:form id="mainForm"
name="mainForm"
method="PUT"
action="Temp.htm"
enctype="multipart/form-data"
commandName="tempBean">
<input type="file" id="myFile" name="myFile"/>
<input type="submit" id="btnSubmit" name="btnSubmit" value="Submit"/>
</form:form>
생성 된 HTML은 다음과 같습니다.
<form id="mainForm"
name="mainForm"
action="Temp.htm"
method="post"
enctype="multipart/form-data">
<input type="hidden" name="_method" value="PUT"/>
<!--This hidden field is implicitly included-->
<input type="file" id="myFile" name="myFile"/>
<input type="submit" id="btnSubmit" name="btnSubmit" value="Submit"/>
</form>
내 spring-config.xml (내 경우에는 dispatcher-servlet.xml)에서 CommonsMultipartResolver에 대한 참조를 추가했다.
<bean id="filterMultipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
내 web.xml 파일에서 HiddenHttpMethodFilter는 다음과 같이 구성됩니다.
<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
<init-param>
<param-name>multipartResolverBeanName</param-name>
<param-value>filterMultipartResolver</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MultipartFilter</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>
PUT (및 DELETE too) 메소드는 결코 호출되지 않습니다 (예외 또는 오류없이). 내가 여기서 무엇을 놓치고 있니?
업데이트 :
web.xml에서 다음 구성을 사용하면,
<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
<init-param> <!-- Makes no difference, if excluded. -->
<param-name>multipartResolverBeanName</param-name>
<param-value>filterMultipartResolver</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MultipartFilter</filter-name>
<servlet-name>dispatcher</servlet-name> <!--Changed from /* to dispatcher-->
</filter-mapping>
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>dispatcher</servlet-name> <!--Changed from /* to dispatcher-->
</filter-mapping>
다음 예외가 throw됩니다.
여기서 name dispatcher는 이미 web.xml에 매핑 된 Servlet - org.springframework.web.servlet.DispatcherServlet의 이름입니다.
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
그 밖의 무엇이 필요한지 잘 모르겠습니다. 필터 HiddenHttpMethodFilter가 여기에 표시된 것과 같은 자체 확장 OnePerRequestFilter에서 구현해야합니까? (내장 클래스입니다)
여기에 중요한 요점이 나와 있습니다.
해결법
-
==============================
1.대부분의 브라우저는 HTML 양식에서 action = PUT을 지원하지 않습니다. 그들은 단지 대신 POST 요청을 보냅니다. HiddenHttpMethodFilter는 문제를 해결하는 데 도움이되지만 폼에 숨겨진 필드 _method = PUT을 포함해야합니다. spring : form taglib을 사용하면 자동으로 수행되지만 예제는 일반 HTML을 사용하는 것 같습니다.
대부분의 브라우저는 HTML 양식에서 action = PUT을 지원하지 않습니다. 그들은 단지 대신 POST 요청을 보냅니다. HiddenHttpMethodFilter는 문제를 해결하는 데 도움이되지만 폼에 숨겨진 필드 _method = PUT을 포함해야합니다. spring : form taglib을 사용하면 자동으로 수행되지만 예제는 일반 HTML을 사용하는 것 같습니다.
NoSuchBeanDefinitionException은 아마 관련이없는 문제 일 것입니다.
-
==============================
2.설정을 변경해야합니다.
설정을 변경해야합니다.
<servlet-name>/*</servlet-name>
에
<servlet-name>[dispatch servlet name]</servlet-name>
from https://stackoverflow.com/questions/13629653/using-put-and-delete-methods-in-spring-mvc by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 페이징이있는 Spring-Data FETCH JOIN이 작동하지 않습니다. (0) | 2018.12.19 |
---|---|
[SPRING] JPA EntityManager 세션 무효화 (0) | 2018.12.19 |
[SPRING] XML없이 Spring 4에서 EhCache 사용하기 (0) | 2018.12.19 |
[SPRING] @Scheduled 주석을 사용하여 시작된 예약 된 작업을 중지하는 방법은 무엇입니까? (0) | 2018.12.19 |
[SPRING] 최대 절전 모드, 봄, JPA 및 격리 - 사용자 정의 격리는 지원되지 않습니다. (0) | 2018.12.19 |