Dati del form non visibili in metodo controller

di il
9 risposte

Dati del form non visibili in metodo controller

Sto utilizzando Spring STS per creare una web application.
Utilizzo SQL Server come database.
Utilizzo Hibernate per la validazione dei dati e JPA
Ho fatto la form di inserimento prodotti indicando tutti i campi necessari.
Effettuato il submit della form, nel controller ho il metodo "GestInsProdotti" con RequestMapping "/aggiungi" e metodo POST che, dopo aver effettuato la validazione dei campi deve effettuare l'inserimento del record.
Il record non viene inserito perchè vengono rilevati errori nei campi ricevuti.
Mettendo in debug noto che i campi ricevuti tramite la notazione @ModelAttribute (che fa riferimento ai dati della form, non sono impostati come quelli
inseriti a form, ma sono Null.
Non riesco a capire il perchè la form (pagina .jsp) non passa in mnaiera corretta i campi.

ecco il codice della pagina insProdotti.jsp


<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


<!-- Form originale con select sui campi categoria ecc con relazioni 2019/02/05 -->

<div class="jumbotron jumbotron-billboard">
	<div class="img"></div>
	<div class="container">
		<div class="row">
			<div class="col-lg-12">
				<h2>${Titolo}</h2>
				<p>${Titolo2}</p>
			</div>
		</div>
	</div>
</div>
<section class="container">
	<div class="portlet light bordered">
		 <div class="portlet-title">
		 	 <div class="caption font-red-sunglo">
            	<i class="icon-settings oi oi-pencil"></i>
             	<span class="caption-subject bold uppercase"><spring:message code="insprodotto.form.titolo.label"/></span>
            </div>
            
            <ul class="nav nav-form" id="account-tabs" role="tablist">
	            <li class="nav-item">
	            	<a class="nav-link active" id="dati-tab" data-toggle="tab" href="#dati1" role="tab" aria-controls="dati1" aria-selected="true">
	            		<spring:message code="insprodotto.form.tab1.label"/>
	            		<img src="<c:url value="/img/icoxx.png" />">
	            	</a>
	            </li>
	            <li class="nav-item">
	            	<a class="nav-link" id="avatar-tab" data-toggle="tab" href="#dati2" role="tab" aria-controls="dati2" aria-selected="false">
	            		<spring:message code="insprodotto.form.tab2.label"/>
	            	</a>
				</li>
 				<li>
					<a class="nav-link" id="utenti-tab" data-toggle="tab" href="#dati3" role="tab" aria-controls="dati3i" aria-selected="false">
						<spring:message code="insprodotto.form.tab3.label"/>
					</a>
			    </li>
            </ul>  
             
             <section class = "locale-link"> 
            	<a href="?language=en"><img src="<c:url value="/img/US.png" />"></a> - 
            	<a href="?language=it"><img src="<c:url value="/img/IT.png" />"></a>                
      		</section> 
		 </div>
	
				
				
		 
		 
<!-- <div class="portlet-body form">  -->
	 <!-- Tab panes -->	
	  							<!-- Tab Dati utente -->
		<div class="tab-content" id="myTabContent">
			<div class="tab-pane fade show active" id="dati1" role="tabpanel" aria-labelledby="dati-tab">
		
				<form:form  method="POST" modelAttribute="newProdotto" enctype="multipart/form-data" action="aggiungi">
				<form:errors path="*" cssClass="alert alert-danger" element="div"/> 
				<div class="form-body">
				
					<div class="form-group">
						<label for="idProdotto"><spring:message code="insprodotto.form.idProdotto.label"/></label>
						<form:input id="idProdotto" path="idProdotto" type="text" class="form-control" placeholder="Codice Prodotto" />  
						<form:errors path="idProdotto" cssClass="text-danger"/>
					</div>
					
					<div class="form-group">
						<label for="descrProdotto"><spring:message code="insprodotto.form.descrProdotto.label"/></label>
						<form:input id="descrProdotto" path="descrProdotto" type="text" class="form-control" placeholder="Descrizione Prodotto"/> 	 
						<form:errors path="descrProdotto" cssClass="text-danger"/>
					</div>
					<div class="form-group">
						<label for="dispon"><spring:message code="insprodotto.form.dispon.label"/></label>
						<form:input id="dispon" path="dispon" type="text" class="form-control" placeholder="Disponibilita Prodotto"/> 	 
						<form:errors path="dispon" cssClass="text-danger"/>
					</div>					
					<div class="form-group">
						<label for="scomin"><spring:message code="insprodotto.form.scomin.label"/></label>
						<form:input id="scomin" path="scomin" type="text" class="form-control" placeholder="Scorta Minima"/> 	 
						<form:errors path="scomin" cssClass="text-danger"/>
					</div>			
					<div class="form-group">
						<label for="prezzo"><spring:message code="insprodotto.form.prezzo.label"/></label>
						<form:input id="prezzo" path="prezzo" type="text" class="form-control" placeholder="Prezzo"/> 	 
						<form:errors path="prezzo" cssClass="text-danger"/>
					</div>								
					<div class="form-group">
						<label for="tcategoria"><spring:message code="insprodotto.form.idCategoria.label"/></label>
						<form:select path="tcategoria" class="form-control">
							 <form:options items="${categoria}" itemValue="idCategoria" itemLabel="dCategoria" />
						</form:select>
					</div>
					<div class="form-group">
						<label for="ttipologia"><spring:message code="insprodotto.form.idTipologia.label"/></label>
						<form:select path="ttipologia" class="form-control">
							 <form:options items="${tipologia}" itemValue="idTipologia" itemLabel="dTipologia" />
						</form:select>
					</div>
					<!-- Bottone di submit -->
					<div class="form-actions">
						<input type="submit" id="btnAdd" class="btn btn-primary form-buttons" value = <spring:message code="insprodotti.form.btnAdd.label"/> />
						<a href="<spring:url value="/prodotti/" /> " id="btnAbort" class="btn btn-default form-buttons" >
							<spring:message code="insprodotti.form.btnAbort.label"/>
						</a>
					</div>
				</div>
			</form:form>
		</div>
		<!-- Form Dati Utente -->
		<div class="tab-pane fade" id="dati2" role="tabpanel" aria-labelledby="avatar-tab"> 
			
				<!--  
				<form:form  method="POST" modelAttribute="newProdotto">
				<form:errors path="*" cssClass="alert alert-danger" element="div"/> 	
			
					<div class="form-group">
						<label for="keyUserOp"><spring:message code="insprodotto.form.dispon.label"/></label>
						<form:input id="keyUserOp" path="keyUserOp" type="text" class="form-control" placeholder="Operatore"/> 	 
						<form:errors path="keyUserOp" cssClass="text-danger"/>
					</div>	
				</form:form>	-->		
		</div>	
	</div>	
	
	<hr class="line-form">
		
			</div>
		
</section>


ecco il codice della classe controller


	@RequestMapping(value = "/aggiungi", method = RequestMethod.POST)
	public String GestInsProdotti(@Valid @ModelAttribute("newProdotto") Prodotti prodotto, BindingResult result,
			Model model, RedirectAttributes redirectAttributes, HttpServletRequest request)
	{

		System.out.println("il prodotto ricevuto da form è: " + prodotto.getDescrProdotto());
		
		
		
		if (result.hasErrors())
		{
			return "insProdotto";
		}

			
		if (result.getSuppressedFields().length > 0)
			throw new RuntimeException("ERRORE: Tentativo di eseguire il binding dei seguenti campi NON consentiti: "
					+ StringUtils.arrayToCommaDelimitedString(result.getSuppressedFields()));
		else
		{
			prodotto.setDateOp(date);
			prodottiService.Salva(prodotto);  

		}

		
		
		return "redirect:/prodotti";
	}


Vi sarei grato se poteste aiutarmi a capire perchè nel modelAttribute "newProdotto" non vengono passati i campi della form, ma solo campi a null.
Resto a disposizione per ogni chiarimento.
grazie

Moreno

9 Risposte

  • Re: Dati del form non visibili in metodo controller

    Come ho potuto notare stai utilizzando Spring MVC.
    Segui questa guida, https://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation
  • Re: Dati del form non visibili in metodo controller

    Si.
    ci sono problemi utilizzando questo ide ?
    mi sembra otimo e si appoggia su eclipse
  • Re: Dati del form non visibili in metodo controller

    misonsan ha scritto:


    Vi sarei grato se poteste aiutarmi a capire perchè nel modelAttribute "newProdotto" non vengono passati i campi della form, ma solo campi a null.
    Quale versione di Spring? 4 o 5? (non è molto rilevante ma è per sapere ..)

    Come è fatta la classe Prodotti? Quando il tuo GestInsProdotti sta per essere invocato, Spring deve poter ottenere o creare una istanza di quella classe Prodotti (per farci poi il binding dalla request). Per ottenere/creare l'istanza ci sono delle regole, sono ben descritte nella documentazione ufficiale:

    https://docs.spring.io/spring/docs/5.1.4.RELEASE/spring-framework-reference/web.html#mvc-ann-modelattrib-method-args
  • Re: Dati del form non visibili in metodo controller

    Ciao Andbin
    Grazie per la preziosa assistenza.

    ecco la classe Prodotti.

    ci sono 3 campi con relazioni @ManytoOne verso tabelle correlate e sono commentate nella descrizione dei campi
    
    package com.sifhb.webapp.entities;
    
    import java.io.Serializable;
    import java.util.Date;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.Table;
    import javax.validation.constraints.Digits;
    import javax.validation.constraints.Max;
    import javax.validation.constraints.Min;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Positive;
    import javax.validation.constraints.Size;
    
    import org.hibernate.validator.constraints.Range;
    
    import com.sifhb.webapp.entities.T_Categoria;
    import com.sifhb.webapp.entities.T_Tipologia;
    
    @Entity
    @Table(name="PRODOTTI")
    public class Prodotti implements Serializable {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 4758948296951581391L;
    	
    	private int idProdotto;
    	private String descrProdotto;
    	private int dispon;
    	private int scomin;
    	private float prezzo;
    	private int qtavend;
    	private String pathImange;
    	private int keyUserOp;
    	private Date dateOp;
    	private int idStatoprodotto;
    	// relazioni 
    	private T_Categoria tcategoria;
    	private T_Tipologia ttipologia;
    	private T_Competenza tcompetenza;
    	
    	public Prodotti()
    	{
    		
    	}
    
    	@Id
    	@Column(name= "IdProdotto", unique = true,nullable = false)
    	@NotNull(message = "{NotNull.Prodotto.IdProdotto.validation}")
    	public int getIdProdotto() {
    		return idProdotto;
    	}
    
    	public void setIdProdotto(int idProdotto) {
    		this.idProdotto = idProdotto;
    	}
    
    	@Column(name= "DescrizioneProdotto",nullable = true)
    	@NotNull(message="Inserire la Descrizione del Prodotto")
    	@Size(min=2, max=50, message = "{Size.Prodotto.descrProdotto.validation}")	
    	public String getDescrProdotto() {
    		return descrProdotto;
    	}
    
    	public void setDescrProdotto(String descrProdotto) {
    		this.descrProdotto = descrProdotto;
    	}
    
    	
    	@Column(name= "Disponibile")
    	@NotNull(message="Inserire la Disponibilità del prodotto")
    	@Min(value = 1,message="la Disponibilità minima 1 pezzo")
    	@Max(value = 999,message="la Disponibilità massima 999 pezzi")
    	public int getDispon() {
    		return dispon;
    	}
    
    	public void setDispon(int dispon) {
    		this.dispon = dispon;
    	}
    
    	@Column(name= "ScortaMinima")
    	@Digits(integer=4, fraction=0,message="{Digits.Prodotti.Scomin.validation}")
    	@NotNull(message="Inserire la Scorta Mionima del prodotto")
    	@Min(value = 1,message="la scorta minima può essere  1 pezzo")
    	@Max(value = 999,message="la scorta minima non può essere maggiore della disponibilità")
    	public int getScomin() {
    		return scomin;
    	}
    
    	public void setScomin(int scomin) {
    		this.scomin = scomin;
    	}
    
    	@Column(name= "Prezzo")
    	@Digits(integer=4, fraction=2,message="{Digits.Prodotti.Prezzo.validation}")
    	@NotNull(message="Inserire il prezzo del prodotto")
    	@Min(value = 0 ,message="il Prezzo deve essere positivo")
    	@Max(value = 999,message="il prezzo non può essere maggiore di 999")
    	@Range(min = 01, message = "il Prezzo non può essere negativo")
    	public float getPrezzo() {
    		return prezzo;
    	}
    
    	public void setPrezzo(float prezzo) {
    		this.prezzo = prezzo;
    	}
    
    	@Column(name= "QtaVendute")
    	@NotNull(message="Inserire la quantità del prodotto")
    	@Min(value = 0 ,message="la Quantità deve essere positiva")
    	@Max(value = 999,message="la Quantità non può essere maggiore di 999")
    	public int getQtavend() {
    		return qtavend;
    	}
    
    	public void setQtavend(int qtavend) {
    		this.qtavend = qtavend;
    	}
    
    	@Column(name= "PathImage")	
    	public String getPathImange() {
    		return pathImange;
    	}
    
    	public void setPathImange(String pathImange) {
    		this.pathImange = pathImange;
    	}
    
    	@Column(name= "KeyUtentiOperation")	
    	public int getKeyUserOp() {
    		return keyUserOp;
    	}
    
    	public void setKeyUserOp(int keyUserOp) {
    		this.keyUserOp = keyUserOp;
    	}
    
    	@Column(name= "DataOperation")
    	public Date getDateOp() {
    		return dateOp;
    	}
    
    	public void setDateOp(Date dateOp) {
    		this.dateOp = dateOp;
    	}
    
    	@Column(name= "IdStatoProdotto")
    	public int getIdStatoprodotto() {
    		return idStatoprodotto;
    	}
    
    	public void setIdStatoprodotto(int idStatoprodotto) {
    		this.idStatoprodotto = idStatoprodotto;
    	}
    
    	@ManyToOne(optional = false)
    	@JoinColumn(name = "Categoria", nullable = true)
    	public T_Categoria getTcategoria() {
    		return tcategoria;
    	}
    
    	public void setTcategoria(T_Categoria tcategoria) {
    		this.tcategoria = tcategoria;
    	}
    
    	@ManyToOne(optional = false)
    	@JoinColumn(name = "Tipologia", nullable = false)
    	public T_Tipologia getTtipologia() {
    		return ttipologia;
    	}
    
    	public void setTtipologia(T_Tipologia ttipologia) {
    		this.ttipologia = ttipologia;
    	}
    
    	
    	@ManyToOne(optional = false)
    	@JoinColumn(name = "Competenza", nullable = false)
    	public T_Competenza getTcompetenza() {
    		return tcompetenza;
    	}
    
    	public void setTcompetenza(T_Competenza tcompetenza) {
    		this.tcompetenza = tcompetenza;
    	}
    
    	
    }
    
    
    Ho guardato la spiegazione della notazione @ModelAttribute e mi sembra ci sia coerenza tra la classe, il controller e la pagina .jsp
    Qualcosa certamente sfugge, ma non riesco a trovarlo.
    Grazie

    Moreno
  • Re: Dati del form non visibili in metodo controller

    Scusa AndBin, ma nella fretta di rispondere ho omesso la versione di STS che uso.
    E' la 3.9.6_Release

    grazie

    Moreno
  • Re: Dati del form non visibili in metodo controller

    misonsan ha scritto:


    Scusa AndBin, ma nella fretta di rispondere ho omesso la versione di STS che uso.
    E' la 3.9.6_Release
    Intendevo la versione di Spring Framework ... non del IDE STS.

    Comunque, innanzitutto, togli enctype="multipart/form-data"
    Questo si usa quando si hanno dei <input type="file"> per fare dei file "upload".
  • Re: Dati del form non visibili in metodo controller

    Ciao AndBin

    ecco la versione dell Spring da pom.xml

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sifHb.webapp</groupId>
    <artifactId>SifHb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <description>ambiente test per gestione Hibernate</description> <properties>
    <springframework.version>5.1.1.RELEASE</springframework.version>
    <hibernate.version>5.3.6.Final</hibernate.version>
    <springsecurity.version>5.0.9.RELEASE</springsecurity.version>
    </properties>
  • Re: Dati del form non visibili in metodo controller

    Ciao AndBin

    ho tolto come da tua indicazione
    "togli enctype="multipart/form-data"
    e tutto si è sistemato.
    Ora ho un altro problema, ma lo riporto in un altra richiesta di assistenza.
    Grazie per la pazienza e cortesia.
    Sei Magico.
    ciao

    Moreno
  • Re: Dati del form non visibili in metodo controller

    misonsan ha scritto:


    <springframework.version>5.1.1.RELEASE</springframework.version>
    Ok, è una molto recente.

    Comunque verifica anche (con i developer tools del browser) che il POST sia corretto, cioè che nel body hai i dati inseriti.
Devi accedere o registrarti per scrivere nel forum
9 risposte