Struts2:更新“对象列表”的值。里面的地图 [英] Struts2: Updating the values of a "List Of Objects" inside a Map

查看:172
本文介绍了Struts2:更新“对象列表”的值。里面的地图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有一个对象 ObjectA ,它有一个 ObjectB 的列表。在 ObjectB 内有一个 TreeMap 。此 TreeMap 有一个 String 作为键和列表另一个对象 ObjectC 作为值。此 TreeMap 列表已显示在 jsp 使用 s:iterator s:textfield ,它正在正确显示。即s:textfield中的values是正确的。现在,当文本字段被修改时出现问题。我们如何捕获ActionClass中ObjectC中修改的值?使用此处给出的代码,键(Key1)在操作中,但值为null。

There is an object ObjectA which has a list of ObjectB. There is a TreeMap inside the ObjectB. This TreeMap has a String as key and a List of another object ObjectC as value. This TreeMap and the list inside has been displayed on the jsp using the s:iterator and s:textfield and it is being displayed correctly. i.e. the "values" inside the s:textfield are correct. Now, the problem arises when the textfield is modified. How do we capture the modified values inside ObjectC in the action class? With the code given here, the key ("Key1") comes in the action but the value is null.

Java代码 >

Java Code

public class ObjectA implements Serializable {
private Integer attr1;
private List<ObjectB> objB;
//...getters and setters....
public class ObjectB implements Serializable {
private Integer attr11;
private TreeMap<String,List<ObjectC>> allPlainFields;
// ...getters and setters....
public class ObjectC implements Serializable {
private Integer attr111;
public String attr112;
// ...getters and setters....

JSP代码

<s:iterator value="objA.objB" var="currentObjB" status="currentGroupStatus">

  <s:iterator value="#currentObjB.allPlainFields" var="parentMap" status="headerStatus">
     <s:iterator value="#parentMap.value" var="fieldList" status="fieldStatus">

       <s:textfield  name="objA.objB[%{#currentGroupStatus.index}].allPlainFields['%{#parentMap.key}'][%{#fieldStatus.index}].attr112"/>


</s:iterator>                       

 </s:iterator> 


< input type =textid =review-act1_objA_objB_0__allPlainFields_'Key1'__ 6__attr112value =Correct Valuename =objA.objB [0] .allPlainFields ['Key1'] [0] .attr112>

VAriables视图中的对象结构

objA    Object A  (id=955)  
objB    ArrayList<E>  (id=966)  
    elementData Object[10]  (id=967)    
        [0] ObjectB  (id=968)   
            allPlainFields  TreeMap<K,V>  (id=972)  
                comparator  null    
                descendingMap   null    
                entrySet    TreeMap$EntrySet  (id=979)  
                keySet  null    
                modCount    1   
                navigableKeySet null    
                root    TreeMap$Entry<K,V>  (id=980)    
                size    1   
                values  null    

        [1] ObjectB  (id=969)   
        [2] ObjectB  (id=970)   
        [3] ObjectB  (id=971)   
        [4] null    
        [5] null    
        [6] null    
        [7] null    
        [8] null    
        [9] null    
    modCount    4   
    size    4   

***在EclipseVariables视图中,allPlainFields的值为**:** {Key1 =}

****In the Eclipse "Variables" view, the value for allPlainFields is**:** {Key1=}

试过了,但没有工作。这些值出现在jsp上,但是在提交时,它们不起作用:

Tried this but didn't work. The values appear on jsp but when submitted, they don't come in action:

Action class: / p>

In Action class:

private TreeMap<String,ObjectCList> testTreeMap = new TreeMap<String,ObjectCList>();
//get,set and setting two keys in map "mykey1" and "mykey2"

ObjectCList class:

private ArrayList<ObjectC> paramMdlList;
 //default constructor, get, set

/ code>:

<s:form id="test-map" method="post">
<s:iterator value="testTreeMap" var="pMap" status="hStatus">
     <li><label><s:property value="%{#pMap.key}" /></label> 
        <s:iterator value="%{#pMap.value.paramMdlList}" var="pList" status="innerStatus">
            <s:textfield name="testTreeMap['%{#pMap.key}'].paramMdlList[%{#innerStatus.index}].attr111"/>
            <s:textfield name="testTreeMap['%{#pMap.key}'].paramMdlList[%{#innerStatus.index}].attr112"/> 

        </s:iterator>


    </li>

</s:iterator>
<s:submit value=" " type='button' id="btnh1" action="saveTreeMap">
            <span>Save TreeMap</span>
</s:submit>
</s:form>

提交表单时, updateTreeMap 方法的动作被调用。将按照此处所述打印地图:

When the form is submitted, updateTreeMap method of the action is called. The map is printed as mentioned here :

public String updateTreeMap(){

    for (Map.Entry<String, ObjectCList> entry : testTreeMap.entrySet())
    {
        System.out.println(entry.getKey() + "/" + entry.getValue());
    }

    return SUCCESS;

}


mykey1 /
mykey2 /
空值

进入jsp

推荐答案

根据您的最新更新。如果您使用 TreeMap Struts2无法正确确定其中的元素类型。将 testTreeMap 的变更声明从 TreeMap 更改为映射 p>

According to your latest update. If you are using TreeMap Struts2 cannot correctly determine type of elements inside it. Change declaration of testTreeMap from TreeMap to Map.

private Map<String,ObjectCList> testTreeMap = new TreeMap<String,ObjectCList>();

或注释 testTreeMap c> com.opensymphony.xwork2.util.Element 注释告诉Struts2 map中的元素是什么类型。

Or annotate testTreeMap with com.opensymphony.xwork2.util.Element annotation to tell Struts2 what type are elements inside map.

@Element(value = ObjectCList.class)
private TreeMap<String,ObjectCList> testTreeMap = new TreeMap<String,ObjectCList>();

这篇关于Struts2:更新“对象列表”的值。里面的地图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆