有一个对象ObjectA其中有一个列表 ObjectB .有一个 TreeMapObjectB里面.这TreeMap有一个 String作为键和一个 List另一个对象 ObjectC作为值(value)。这TreeMaplist里面已经显示在了jsp上使用 s:iterators:textfield并且显示正确。即 s:textfield 中的“值”是正确的。现在,问题出现在修改文本字段时。我们如何在 Action 类中捕获 ObjectC 内部的修改值?使用此处给出的代码,键(“Key1”)出现在操作中,但值为空。

Java 代码

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>  

呈现的 HTML: <input type="text" id="review-act1_objA_objB_0__allPlainFields_'Key1'__6__attr112" value="Correct Value" name="objA.objB[0].allPlainFields['Key1'][0].attr112">

eclipse的“VAriables” View 中的对象结构显示:

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    

****在 Eclipse“变量” View 中,allPlainFields 的值为**:** {Key1=}

编辑(2013 年 2 月 27 日):

试过了,但没有用。这些值出现在 jsp 上,但在提交时,它们没有生效:

Action类:

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

ObjectCList类:

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

JSP :

<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 action 的方法叫做。 map 打印如前所述here :

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

什么是“打印”: 我的 key 1/ 我的 key 2/ 即空值

下面的屏幕显示了来自 jsp 的值

请您参考如下方法:

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

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

或者用com.opensymphony.xwork2.util.Element注解来注解testTreeMap来告诉Struts2 map 中的元素是什么类型。

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


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!