복붙노트

[SPRING] Spring MVC에서 PUT과 DELETE 메소드 사용하기

SPRING

Spring 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. ==============================

    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. ==============================

    2.설정을 변경해야합니다.

    설정을 변경해야합니다.

    <servlet-name>/*</servlet-name>  
    

    <servlet-name>[dispatch servlet name]</servlet-name> 
    
  3. from https://stackoverflow.com/questions/13629653/using-put-and-delete-methods-in-spring-mvc by cc-by-sa and MIT license