0

我曾经让它工作正常,不知何故经过一些开发后,我意识到 HTML 元素 _method 不是在页面上自动创建的,因此 REST 不起作用。

下面是我的 web.xml,其中包含HiddenHttpMethodFilter.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
             /WEB-INF/spring/root-context.xml,
             /WEB-INF/spring/appServlet/*-context.xml
        </param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
    </listener>
    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>trimSpaces</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter>
        <filter-name>HttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    <error-page>
        <error-code>403</error-code>
        <location>/errors/403.html</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/errors/404.html</location>
    </error-page>
    <error-page>
        <error-code>405</error-code>
        <location>/errors/405.html</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/errors/500.html</location>
    </error-page>
</web-app>

我试过的

  • Maven 更新项目
  • Maven 清理 > Maven 安装
  • 清除工作目录

更新

我的jsp的一部分

<html:form modelAttribute="user" id="user-form" formUrl="/user">

form.tag 将其转换为 Spring 表单

<form:form modelAttribute="${modelAttribute}" id="${id}"
    action="${processedFormUrl}" class="form-horizontal" 
            target="${target}" method="post">
    <fieldset>
       <jsp:doBody />
    </fieldset>
</form:form>
4

1 回答 1

0

仅当您的表单方法不是 post 即其 PUT/DELETE 时才需要 HiddenHttpMethodFilter,在这种情况下,spring 会自动使用正确的表单方法添加 _method 隐藏字段。

如果您想更改 put 请求method="put",spring-form 将负责休息

已编辑我查看了 spring FormTag 源代码,我发现了以下内容

 if (!isMethodBrowserSupported(getMethod())) {
                assertHttpMethod(getMethod());
                String inputName = getMethodParameter();
                String inputType = "hidden";
                tagWriter.startTag(INPUT_TAG);
                writeOptionalAttribute(tagWriter, TYPE_ATTRIBUTE, inputType);
                writeOptionalAttribute(tagWriter, NAME_ATTRIBUTE, inputName);
                writeOptionalAttribute(tagWriter, VALUE_ATTRIBUTE, processFieldValue(inputName, getMethod(), inputType));
                tagWriter.endTag();
}


    protected boolean isMethodBrowserSupported(String method) {
            return ("get".equalsIgnoreCase(method) || "post".equalsIgnoreCase(method));
        }

因此,只有当您的表单方法不是 get/post 时,才会添加 _method 隐藏字段。

对于您的情况,当单击删除按钮时,您可以在 subitting 之前使用 jquery 为 _method 字段添加输入隐藏标签,

var input = $("<input>").attr("type", "hidden").attr("name", "_method").val("DELETE");
            $('form#yoorFormID').append(input).submit();
于 2013-08-19T06:51:12.943 回答