【问题标题】:Not able to set Mapped Properties in Struts2无法在 Struts2 中设置映射属性
【发布时间】:2014-09-01 06:09:58
【问题描述】:

我有一个迭代器,它需要使用映射属性或索引属性,但我的 getter-setter 没有获得这些值。

例如: (这只是一个例子。最终的想法是我是否可以在 struts 2 中使用映射属性。如果可以,那么如何。)

index.jsp:

<s:form action="hello" namespace="foo">    
    <s:textfield name="arp(0)" /> <br/>
    <s:textfield name="prp(0)" /> <br/>
    <s:textfield name="arp(1)" /> <br/>
    <s:textfield name="prp(1)" /> <br/>
    <s:submit   value="Say Hello" /> 
</s:form>

helloWorld.action:

class PRLists {
    String arp;
    String prp;

    public String getArp() {
        return Arp;
    }

    public void setArp(String aRP) {
        arp = aRP;
    }

    public String getPrp() {
        return prp;
    }

    public void setPrp(String pRP) {
        prp = pRP;
    }

}

public class HelloWorldAction {
    ArrayList<PRLists> prlist = new ArrayList<PRLists>();

    public String execute() throws Exception {
        System.out.println("ruuning execute");
        return "success";
    }

    public ArrayList<PRLists> getPrlist() {
        return prlist;
    }

    public void setPrlist(ArrayList<PRLists> prlist) {
        this.prlist = prlist;
    }

    public String getArp(String key) {
        int index = Integer.parseInt(key);
        return prlist[index].arp;
    }

    public void setArp(String key, Object value) {
        System.out.println("set ARP: index:" + index + ", value" + value);
        int index = Integer.parseInt(key);
        prlist[index].arp = value.toString();
    }

    public String getPrp(String key) {
        int index = Integer.parseInt(key);
        return prlist[index].prp;
    }

    public void setPrp(String key, Object value) {
        System.out.println("set PRP, Key:" + key + ", value:" + value);
        int index = Integer.parseInt(key);
        prlist[index].prp = value.toString();
    }
}

之前我在 struts 1 中有这种工作函数,但现在我正试图将它移到 struts 2。现在我在 HelloWorldAction.java 中用于 arp 和 prp 的 setter 函数在表单提交时不会被调用。

public void setArp(String key, Object value);
public void setPrp(String key, Object value);  

&lt;s:textfield name="prlist[0].arp" /&gt; 可以工作,但我们有一些依赖代码需要使用名称为 &lt;s:textfield name="arp(0)" /&gt; 的字段。 我不知道 struts 2 是否支持映射属性。如果支持,那我该如何使用呢。

我还发现了一个相关问题:https://issues.liferay.com/browse/LPS-14128

注意:我对问题描述做了一些修改

提前致谢。

【问题讨论】:

    标签: java struts2 struts


    【解决方案1】:

    你在这里违反了很多“规则”,除了避免几乎所有框架提供的机制。永远不要将逻辑放在访问器/修改器(getter / setter)中,永远不要使用大写的变量名,避免使用以大写字母开头的变量,阅读struts Type Conversion,尽可能使用Struts标签(例如&lt;s:textfield/&gt;而不是&lt;input type="text" /&gt;) ,并将您的代码简化为:

    public class HelloWorldAction{
        private String name;
        private List<PRLists> arnList = new ArrayList<PRLists>();
    
        public String execute() throws Exception {
           System.out.println("running execute");
           return "success";
        }
    
        public List<PRLists> getArnList(){
           return arnList;
        }
        public void setArnList(List<PRLists> arnList){
           this.arnList = arnList;
        }
    
        public String getName() {
           return name;
        }
        public void setName(String name) {
            System.out.println("set name: "+name);
            this.name = name;
        } 
    }
    
    <s:form action="hello" namespace="foo">    
        <s:textfield name="name" label="name" />
        <s:textfield name="arnList[0].arp" /> <br/>
        <s:textfield name="arnList[0].prp" /> <br/>
        <s:textfield name="arnList[1].arp" /> <br/>
        <s:textfield name="arnList[1].prp" /> <br/>
        <s:submit   value="Say Hello" /> 
    </s:form>
    

    在迭代器中,如您所说(未显示),例如

    <s:form action="hello" namespace="foo">
        <s:textfield name="name" label="name" />
        <s:iterator value="arnList" status="rowStatus">
            <s:textfield name="arnList[%{#rowStatus.index}].arp" /> <br/>
            <s:textfield name="arnList[%{#rowStatus.index}].prp" /> <br/>
        </s:iterator>
        <s:submit value="Say Hello" />
    </s:form>
    

    【讨论】:

    • 我不想使用 。我可以按照我使用它的方式使用映射的属性吗? 。因为这适用于 struts1。我已修改问题以更正一些错误,请回复。
    • 可以工作,但我们有一些依赖代码需要使用名称为 。这称为映射属性,我不知道这是否适用于 struts2。
    • 你在说about this 吗?如果是,请阅读this answer。但请考虑将您的依赖代码升级为标准、简单且兼容 Struts2 的代码。 Struts1 是另一双鞋……不重写几个标签的好处很容易被一堆复杂黑客的破坏所超越。
    • Struts1 的典型:把简单的事情搞砸只是为了让它们变得复杂。顺便说一句,即使在 Struts1 上,这也不是“功能”,而是 hack。如果它在 S2 上不起作用,则可能意味着您需要在此基础上再进行一次 hack。您可能可以破解发送参数的方式以以符合 S2 的方式匹配您的设置器,但是您正在绕过 OGNL 和框架机制,我仍然不明白为什么这比重写标签更便宜或更干净。您仍然必须编写代码才能使其正常工作,甚至更多。写动作代码比写 JSP 代码便宜吗?
    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 2012-08-10
    • 1970-01-01
    • 2020-07-17
    • 2016-04-12
    • 1970-01-01
    相关资源
    最近更新 更多