Spring MVC的表单输入值总是空(Spring MVC form input value is

2019-09-17 03:46发布

我是新来的Spring MVC,但不是新的Java Web开发。 我试图创建一个简单的形式 - >控制器的例子。

我有一个表格,表单控制器和我的模型(在上下文XML粘贴以下配置)(一个简单的bean)。 当我提交表单我的文字输入的值始终为空,而不管。 有任何想法吗?

形式控制器弹簧配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- controllers -->

    <bean name="/home.html" class="atc.web.view.controller.HomeController" />

    <!--bean name="/mirror.html" class="atc.web.view.controller.MirrorController" -->

    <bean name="/url-cache.html" class="atc.web.view.controller.URLCacheFormController">
        <property name="synchronizeOnSession" value="true" />
        <!--property name="sessionForm" value="false"-->
        <property name="commandName" value="urlForm"/>
        <property name="commandClass" value="atc.web.view.model.URLBean"/>
        <property name="validator">
            <bean class="atc.web.view.validators.URLValidator"/>
        </property>
        <property name="formView" value="mirror"/>
        <property name="successView" value="url-cache.html"/>
        <property name="URLCachingService" ref="urlCachingService" />
    </bean>

    <!-- end controllers -->

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- custom beans -->

    <bean id="breakcrumbInjectionFilter" class="atc.web.view.filter.BreadcrumbInjectionFilter">
        <property name="contextPrefix" value="/home-web" />
    </bean>

    <!-- end custom beans -->
</beans>

包含我的形式JSP如下:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="/WEB-INF/jspf/core/taglibs.jspf" %>
<html>
<head><title>Simple tools</title></head>
<style>
.error s {
    color:#FF0000;
}
</style>
<body>
<%@ include file="/WEB-INF/jspf/nav/nav.jspf" %>
    Errors: <form:errors path="url" cssClass="error"/>
    <form:form method="post" commandName="urlForm">
        <form:input path="url" />
        <input type="submit" align="center" value="Execute" />
    </form:form>
</body>
</html>

这里是我的控制器的全部源:

public class URLCacheFormController extends SimpleFormController {
    private URLCachingService cachingService;

    private static Logger log = Logger.getLogger(URLCacheFormController.class);

    public ModelAndView onSubmit(Object command) throws ServletException {
        log.debug(String.format("URLCachingFormController received request with object '%s'", command));
        URLBean urlBean = (URLBean) command;
        try {
            URL url = new URL(urlBean.getUrl());
            URLCache cache = cachingService.cacheURL(url);
            cache.cacheToTempFile();

        } catch (IOException e) {
            log.error("Invalid URL...", e);
        }
        return new ModelAndView(new RedirectView(getSuccessView()));
    }

    protected Object formBackingObject(HttpServletRequest request) throws ServletException {
        log.debug("formBackingObject() ");
        return new URLBean();
    }

    public void setURLCachingService(URLCachingService cachingService) {
        this.cachingService = cachingService;
    }
}

所有上述的产生以下HTML:

<html>
<head></head>
<body>
<div><span><a href="home.html">Home </a></span><span> | <a href="url-cache.html">Page Mirror</a></span></div>
<div id="breadcrumb"><span>Your trail:<a href=""/></span></div>Attrs:<div/>
<form id="urlForm" method="post" action="/home-web/url-cache.html">
<input id="url" type="text" value="" name="url"/>
<input type="submit" align="center" value="Execute"/>
</form>
</body>
</html>

现在我重写doSubmitAction(Object command) ,但我还是不打的方法。 表单提交的,但我知道我接下来的事情我带有空白表格(后formBackingObject(HttpServletRequest request)被调用)。

这就是说,当我提出,在第1行记录通话doSubmitAction永远不会执行的形式控制。 验证程序执行,并且失败(正确添加错误信息),因为它的检查值始终为空(或放正确,它从来没有设置)。 要将呼叫formBackingObject但总是发生。 我的表格(表格输入“URL”)的请求属性总是空。

更新:好了,之后由serg555删除验证建议,以及一些严重的调试,我可以证实这个问题似乎是与映射请求参数-比如从形式“网址”的价值-我的指挥/豆; 即URL是永远不会被我的豆设置,或豆正在重建。

请帮忙?

Answer 1:

我不知道问题出在哪里,让我告诉你我的控制器工作,也许你就可以找出什么是错的:

public class TestController extends SimpleFormController  {

    public TestController () {
        setFormView("testView");
        setSuccessView("testView");
        setCommandClass(TestCmd.class);
        setCommandName("cmd");
    }

    protected Object formBackingObject(HttpServletRequest request)throws Exception {
        Object o = super.formBackingObject(request);
        TestCmd cmd = (TestCmd) o;

        return cmd;
    }


    public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object obj, BindException errors) throws Exception {

        TestCmd cmd = (TestCmd) obj;

        log.debug("test value = " + cmd.getTestValue());

        return super.onSubmit(request, response, obj, errors);
    }

}

形成:

<form method="post" action="/test.html">
    <form:input path="cmd.testValue"/>
    <input type="submit">
</form>

里面的App-servlet.xml中:

    <bean id="urlMapping"
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="alwaysUseFullPath" value="true" />
        <property name="mappings">
            <props>
                <prop key="/test.html">testController</prop>
            </props>
        </property>
    </bean>
    <bean id="testController"
        class="com.sample.TestController">
        <property name="synchronizeOnSession" value="true" />
        <property name="validator">
            <bean class="com.sample.TestValidator"/>
        </property>
    </bean>

验证器:

public class TestValidator implements Validator {

    public boolean supports(Class clazz) {
        return (TestCmd.class.equals(clazz));
    }

    public void validate(Object obj, Errors errors) {
        TestCmd cmd = (TestCmd) obj;
        if (obj == null) {
            // nothing
        } else {

            ValidationUtils.rejectIfEmptyOrWhitespace(errors, "testValue", null, "<b>Value</b> is required");

        }
    }

}

命令:

public class TestCmd {

    private String testValue;

    public TestCmd() {
    }

    public String getTestValue() {
        return testValue;
    }

    public void setTestValue(String testValue) {
        this.testValue = testValue;
    }

}


Answer 2:

OK,你已经验证了控制器内设置网址不来通过对JSP,这表明映射是正确的命令bean。

还有一件事。 如果从未被达到“的onsubmit”的代码,这可能是与控制器搞清楚它是否是一个表单提交的问题。 这可能有助于增加一个name属性提交按钮,并覆盖“isFormSubmission”检查名称是否存在(提交按钮即是否已被点击)。 如果是这样,isFormSubmission应返回true。 (这不应该是必要的 - 默认控制器假定任何POST请求是一个表单提交 - 但如果它可以帮助你了解更多的问题,你就会有一个变通解决,至少。)



Answer 3:

其原因是,我的form bean并没有秉承Java Bean的合同的事实 - 二传手返回的是无效代替,因此不能被Spring匹配来调用。



Answer 4:

尝试把下面的代码aplication-context.xml中。 如果你有你的表单的enctype =多/表单数据,这可能是您的解决方案。

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10000000"/>
</bean>

也尝试从JSP页面中移除的内容类型。 那么在我的情况下,帮我...!



Answer 5:

我曾经花了很多时间研究类似的问题。 最后,我发现了一个活页夹的初始化方法里面的罪魁祸首:

@InitBinder
void allowFields(final WebDataBinder binder) {
    binder.setAllowedFields("name");
}

此方法设置上所允许的结合领域的限制。 和所有其他领域留下的未结合,自然导致null值。



文章来源: Spring MVC form input value is always null