Spring MVC форма ввода значения всегда равна нулю - PullRequest
3 голосов
/ 27 июня 2009

Я новичок в Spring MVC, но не новичок в веб-разработке на Java. Я пытаюсь создать простой пример формы -> контроллера.

У меня есть форма, контроллер формы (настроенный в контексте XML, вставленный ниже) и моя модель (простой компонент). Когда я отправляю форму, значение моего ввода текста всегда равно нулю, независимо от того. Есть идеи?

Форма пружины контроллера формы:

<?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' из форма - моей команде / бобу; то есть URL никогда не задается для моего компонента или создается заново.

Пожалуйста, помогите?

Ответы [ 5 ]

2 голосов
/ 28 июня 2009

Я не знаю, в чем проблема, позвольте мне показать вам мой контроллер, который работает, и, возможно, вы сможете выяснить, что не так:

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>

Validator:

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;
    }

}
1 голос
/ 06 декабря 2013

Причиной был тот факт, что мой bean-компонент формы не придерживался контракта Java-бина - установщик вернулся, а не стал void, и поэтому Spring не смог сопоставить его с вызовом.

1 голос
/ 28 июня 2009

ОК, вы убедились, что URL-адрес, установленный в контроллере, поступает в JSP, что говорит о том, что сопоставление верно для командного компонента.

Еще одна вещь. Если код «onSubmit» никогда не достигается, это может быть проблемой для контроллера, выясняющего, является ли это отправкой формы. Это может помочь добавить атрибут имени к кнопке отправки и переопределить «isFormSubmission», чтобы проверить, присутствует ли это имя (т.е. была ли нажата кнопка отправки). Если это так, isFormSubmission должен вернуть true. (В этом не должно быть необходимости - по умолчанию контроллер предполагает, что любой запрос POST является отправкой формы, - но если это поможет, вы узнаете больше о проблеме и по крайней мере получите обходное решение .)

0 голосов
/ 20 марта 2015

Однажды я потратил много времени на изучение подобной проблемы. Наконец, я нашел виновника в методе инициализации Binder:

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

Этот метод устанавливает ограничение для полей, которые разрешены для привязки. Все остальные поля остаются свободными, что, естественно, приводит к значениям null.

0 голосов
/ 06 декабря 2013

Попробуйте поместить следующий код в файл aplication-context.xml. Это может быть вашим решением, если у вас есть форма encType = multipart / form-data.

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

Также попробуйте удалить тип содержимого со страницы jsp. Ну, в моем случае это помогло мне ... !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...