【问题标题】:Writing a string property of an object with <html:text />使用 <html:text /> 编写对象的字符串属性
【发布时间】:2011-04-13 02:04:46
【问题描述】:

我的表单中有一个对象,其中包含各种字符串属性。

当我想在我的 JSP 表单中打印它时,我可以这样做

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

效果很好。

现在我想创建一个 HTML 输入字段。但是当我写的时候

&lt;html:text property="company.address" /&gt;

我收到一个错误提示

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

您知道如何使用我的公司地址创建 HTML 输入字段吗?

我的 bean 有必要的相应 getter 和 setter。

【问题讨论】:

    标签: java struts struts-1 html-input struts-html


    【解决方案1】:

    当您获取文本框的值时:

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

    你实际上是在告诉 Struts 去做:

    formObject.getCompany().getAddress();
    

    因此,您必须有一个用于公司的 getter(不得返回 null 否则下一个操作将失败)和一个用于公司对象地址的 setter。 setter/getter 必须是公开的。这一定已经是这种情况,因为您可以毫无错误地执行以下操作:

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

    现在,让我烦恼的是这部分:${UFForm.。当您使用 JSTL 时,您正在显式访问表单。使用&lt;html:text&gt;,您可以隐式访问表单上的属性。这种隐式形式由封闭的&lt;html:form&gt; 标记提供。 &lt;html:form&gt; 中有 &lt;html:text&gt; 吗?

    根据关联 ActionMapping 的表单 bean 规范定位/创建/公开表单 bean,因此还要检查您的映射。

    【讨论】:

    • Struts 实际上是在做getCompany().getAddress() 而不是setAddress()
    • @精英绅士:你说得对!不知何故,我将
    【解决方案2】:

    正确的翻译方式:

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

    对于 Struts 来说,

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

    这意味着有一个名称为 UFForm 的请求带有一个包含方法 getCompany() 的 bean(我假设它返回一个 Company 对象),而它又具有一个 getAddress() getter(如果你明白我的意思)。简而言之,来自请求/会话UFForm的bean,TagLib正在访问getCompany().getAddress()

    PS希望getAddress()不返回null否则&lt;html:text /&gt;会抛出异常。


    编辑解释我上面做了什么:

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

    我在&lt;html:text /&gt;上面所做的相当于

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

    【讨论】:

    • 我可以在&lt;html:text /&gt; 标签中分配两次property 参数吗?
    • @Bernhard V,是的,如果您的父类 getter 返回一个对象(不是原始对象)。您也可以在 Struts 中的任何 &lt;html:xxxx /&gt; 的属性字段内说 user.address.postCode。 (对于名为 User 的 bean)。
    • @Bernhard V,对不起...属性不能被声明两次....我已经编辑了我的解决方案。感谢您发现它。 :-)
    【解决方案3】:

    你的 bean 应该有相应的 setter 和 getter 方法。

    HTML 格式

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

    对应的bean。

    public class AddressForm 
    {
      private String name=null;
    
      public void setName(String name){
        this.name=name;
      }
    
      public String getName(){
        return this.name;
      }
    }
    

    【讨论】:

    • 你有公司的getter/setter吗?从您的代码中,您的表单中似乎有一个名为 company 的 bean,您尝试打印的地址是。
    • 如果是这样,Getter 和 setter 对于这两个 bean 来说都是必不可少的。
    • 两者我都有。如果我没有它们,那么我猜&lt;c:out value="${UFForm.company.address}" /&gt; 也不会工作。
    猜你喜欢
    • 1970-01-01
    • 2020-07-04
    • 2019-06-26
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多