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 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 à doSubmitAction
dans la forme contrôleur n'est jamais exécutée.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?
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 |
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas où est le problème, permettez-moi de vous montrer mon contrôleur qui fonctionne et peut-être vous serez en mesure de comprendre quel est le problème:
Forme:
À L'Intérieur App-servlet.xml:
Validator:
Commande:
OriginalL'auteur serg
OK, vous avez vérifié que l'url définie dans le contrôleur ne viennent à travers de la page JSP, ce qui suggère que la correspondance est correcte pour la commande de haricot.
Une chose de plus. Si le "onSubmit" code n'est jamais atteint, qui peut être un problème avec le contrôleur de déterminer si c'est une forme de soumission. Il pourrait être utile d'ajouter un attribut de nom pour le bouton "soumettre", et de remplacer "isFormSubmission" pour vérifier si ce nom est présent (à savoir si les soumettre bouton a été cliqué). Si oui, isFormSubmission doit retourner true. (Cela ne devrait pas être nécessaire -- par défaut, le contrôleur suppose que toute demande de publication est la soumission d'un formulaire, mais si cela vous aide, vous allez en savoir plus sur le problème, et vous aurez un travail autour de réparer, au moins.)
OK, mais qui ne le suggèrent, au moins, que la cartographie est de travailler à partir de la forme de la sauvegarde de l'objet dans le champ du JSP, donc c'est un début. Pouvez-vous poster le code de votre commande bean?
J'ai changé ma réponse ci-dessus, de sorte s'il vous plaît lire de nouveau. 🙂
J'ai confirmé que le onSubmit est en cours d'exécution, c'est purement de la cartographie des valeurs d'un formulaire pour la commande/bean - le champ de l'URL sur mon haricot n'est jamais définie. WTF?
OK, à côté de choses à regarder: 1) votre commande bean -- les getters et les setters correcte, y compris la casse, etc. 2) regardez le code HTML généré pour votre forme et de regarder le nom de l'attribut sur la zone de texte généré par le formulaire:input. Ensuite, de débogage et de regarder les paramètres de la requête lorsque vous frappez la méthode onSubmit. Est-il un paramètre avec le nom donné à la zone de texte?
OriginalL'auteur
La cause était le fait que ma forme de haricot n'a pas été adhérant à la Java Bean contrat - le setter retourné au lieu d'être vide et ne pouvaient donc pas être compensée par du Printemps à l'invoquer.
OriginalL'auteur
Essayer de mettre le code suivant dans la aplication-context.xml. Ce pourrait être votre solution si vous rencontrez votre form encType= " multipart/form-data.
Également essayer de supprimer le Type de contenu de la page jsp. Eh bien dans mon cas, cela m'a aidé...!!
Mec éprouvaient des difficultés en raison de ce problème depuis 2 jours donc je l'ai mis ici, donc si quelqu'un est aux prises avec le même problème qu'il pourrait obtenir de l'aide. La réponse pourrait être inutile comme je suis nouveau sur stackoverflow.(Voir ma réputation ;))
OriginalL'auteur
Une fois, j'ai passé beaucoup de temps à enquêter sur un problème similaire. J'ai enfin trouvé le coupable à l'intérieur d'un Classeur méthode d'initialisation:
Cette méthode permet de définir une restriction sur les champs qui sont autorisés pour la liaison. Et tous les autres champs de rester indépendant, naturellement, résultant dans
null
valeurs.OriginalL'auteur