2010-09-16 27 views
0

J'ai un objet dans mon formulaire qui contient diverses propriétés de chaîne.Ecriture d'une propriété de chaîne d'un objet avec <html:text />

Quand je veux imprimer dans ma forme JSP que je pouvais le faire avec

<c:out value="${form.company.address}" /> 

qui fonctionne parfaitement.

Maintenant, je veux créer un champ de saisie HTML. Mais quand j'écris

<html:text property="company.address" />

Je reçois une erreur disant

Caused by: javax.servlet.jsp.JspException: No getter method for property company.address of bean org.apache.struts.taglib.html.BEAN 

Savez-vous comment je peux créer un champ de saisie HTML avec l'adresse de mon entreprise?

Mon haricot possède les getters et setters correspondants.

Répondre

0

La bonne façon de traduire ceci:

<c:out value="${UFForm.company.address}" /> 

à Struts est

<html:text name="UFForm" property="company.address"> 

Cela signifie qu'il y a une demande avec le nom UFForm avec un bean qui contient une méthode getCompany() (qui je m en supposant renvoie un objet Company) et que, à son tour, a un getter getAddress() (si vous comprenez ce que je veux dire).En un mot, le bean de demande/session UFForm, le TagLib accède à getCompany().getAddress();

PS espoir que getAddress() ne retourne pas d'autre null<html:text /> lancera une exception.


Modifier Pour expliquer ce que je l'ai fait ci-dessus:

public class Company implements Serializable { 

    private String address; 

    //Setter 
    public void setAddress(String address) { 
     this.address = address; 
    } 

    //Getter 
    public String getAddress() { return this.address; } 
} 

public class UFForm implements Serializable { 

    private Company company; 

    public void setCompany(Company company) { 
     this.company = company; 
    } 

    public void getCompany() { 
     if (this.company == null) { 
      setCompany(new Company()); 
     } 

     return this.company; 
    } 
} 

Ce que je l'ai fait ci-dessus <html:text /> équivaut à

UFForm ufForm = ....; 
String property = ufForm.getCompany().getAddress(); 
+0

Je peux assigner le paramètre 'property' deux fois dans un tag' '? –

+0

@Bernhard V, oui, si votre classe parent getter renvoie un objet (pas primitif). Vous pouvez également dire 'user.address.postCode' dans un champ de propriété pour n'importe quel' 'dans Struts. (pour un haricot appelé 'User'). –

+0

@Bernhard V, désolé ... la propriété ne peut être déclarée deux fois .... J'ai modifié ma solution. Merci de l'avoir repéré. :-) –

0

Votre haricot doit avoir des méthodes setter et getter correspondantes.

Html forme

<html:text property="name" size="10" maxlength="10"> 

haricot correspondant.

public class AddressForm 
{ 
    private String name=null; 

    public void setName(String name){ 
    this.name=name; 
    } 

    public String getName(){ 
    return this.name; 
    } 
} 
+0

j'oublié de mentionner qu'il a déjà obtenu ces méthodes. –

+0

Avez-vous le getter/setter pour l'entreprise? À partir de votre code, il semble qu'il y ait un bean à l'intérieur de votre entreprise nommée Entreprise dont vous essayez d'imprimer l'adresse. –

+0

Si c'est le cas, Getter et setter sont essentiels pour les deux haricots. –

0

Lorsque vous obtenez la valeur de la zone de texte avec:

<html:text property="company.address" /> 

Vous êtes en fait dire à Struts à faire:

formObject.getCompany().getAddress(); 

vous devez donc avoir un getter pour la société (qui ne doit pas retourner de null ou l'opération suivante échouera) et un setter pour l'adresse sur l'objet de la société. Les setters/getters doivent être publics. Cela doit déjà être le cas puisque vous pouvez faire ce qui suit sans erreur:

<c:out value="${UFForm.company.address}" /> 

Maintenant, la chose qui me dérange est cette partie: ${UFForm.. Lorsque vous utilisez JSTL, vous accédez explicitement au formulaire. Avec le <html:text> vous accédez implicitement à une propriété sur le formulaire. Cette forme implicite est fournie par la balise <html:form> englobante. Avez-vous le <html:text> à l'intérieur d'un <html:form>?

Le bean de formulaire est localisé/créé/exposé en fonction de la spécification du bean formulaire pour le ActionMapping associé, vérifiez également votre mappage.

+0

Struts fait actuellement 'getCompany(). GetAddress()' et non 'setAddress()'. –

+0

@The Elite Gentleman: Vous avez raison! Quelque part, j'ai associé le à la définition de la valeur et utilisé inconsciemment un setter. Le formulaire formObject.getCompany(). GetAddress() est utilisé pour obtenir la valeur et formObject.getCompany(). SetAddress (...) pour le définir. J'ai corrigé ma réponse. Merci d'avoir fait remarquer cela. –