Spring MVC forme de la valeur d'entrée est toujours null

Je suis nouveau sur Spring MVC, mais pas de nouvelles pour le développement web en Java. Je suis d'essayer de créer un simple formulaire->contrôleur exemple.

J'ai un formulaire, un formulaire de contrôleur (configuré dans un contexte XML collé ci-dessous) et mon modèle (un simple haricot). Quand j'envoie le formulaire, la valeur de mon texte d'entrée est toujours nulle, quel que soit. Des idées?

Forme contrôleur de configuration spring:

<?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>

La JSP qui contient mon formulaire est comme suit:

<%@ 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>

Voici la source de mon contrôleur:

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

Tous les ci-dessus génère le code HTML suivant:

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

je suis maintenant primordial doSubmitAction(Object command) mais je n'ai pas encore touché la méthode. Le formulaire soumet, mais la prochaine chose que je sais, je suis présenté avec le formulaire vierge (après formBackingObject(HttpServletRequest request) est appelé).

C'est-à-dire, lorsque je soumets, la journalisation des appels sur la ligne 1 de doSubmitAction dans la forme contrôleur n'est jamais exécutée. Le validateur s'exécute, et échoue (ajoute des messages d'erreur bien), car la valeur du contrôle est toujours null (ou de les mettre correctement, il n'est jamais ensemble). L'appel à formBackingObject toujours se produit cependant. L'attribut de la requête de mon formulaire (le formulaire de saisie 'url') est toujours nulle.

Mise à jour: OK, donc après un certain sérieux de débogage comme suggéré par serg555, et la suppression de la validation, je peux confirmer le problème semble être avec la cartographie de la demande de certains paramètres tels que la valeur de 'url' de la forme - à ma commande/haricot; c'est à dire l'URL n'est jamais sur de mon haricot ou le haricot est recréée.

S'il vous plaît aider?

Vous ne vous montrez pas comment vous avez mappé l'URL du contrôleur. Avez-vous dans votre application de contexte? Peut-être que vous devriez mettre à jour votre question afin de montrer que.
Le mappage d'URL est définie dans le printemps contexte XML que j'ai déjà fourni. J'ai ajouté le reste du contexte XML pour plus de clarté, cependant.
Ce n'est pas la réponse à votre question, mais vous pouvez trouver cela plus facile à utiliser Spring 2.5-style annoté contrôleurs de la place de la vieille FormCintroller hiérarchie. C'est beaucoup plus simple et plus intuitive.
merci à vous, je vais vous donner que d'essayer.
Essayez d'ajouter <property name="synchronizeOnSession" value="true" /> pour votre contrôleur de définition. Aussi, vous devez onSubmit(), pourquoi vous avez changé d'doSubmitAction()? Vérifiez votre code html généré de la forme, peut-être que quelque chose est là. Également vérifier ce qui vient à la demande à l'intérieur de onSubmit() la méthode.

OriginalL'auteur |