Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsp Struts2将对象内的贴图绑定到动作属性_Jsp_Struts2_Ognl - Fatal编程技术网

Jsp Struts2将对象内的贴图绑定到动作属性

Jsp Struts2将对象内的贴图绑定到动作属性,jsp,struts2,ognl,Jsp,Struts2,Ognl,第1部分: 有一个对象(ObjectA)具有另一个对象(ObjectB)。对象B中有一个Hashmap。这个Hashmap有一个字符串作为键,另一个对象“ObjectC”作为值。这个hashmap已经使用s:iterator和s:textfield显示在jsp上,并且显示正确。i、 e.s:text字段中的“值”正确,但“名称”不正确。 现在,修改textfield时会出现问题。我们如何在action类中捕获ObjectC中修改的值 公共类ObjectA实现可序列化{ 私有整数attr1; 私人

第1部分: 有一个对象(ObjectA)具有另一个对象(ObjectB)。对象B中有一个Hashmap。这个Hashmap有一个字符串作为键,另一个对象“ObjectC”作为值。这个hashmap已经使用s:iterator和s:textfield显示在jsp上,并且显示正确。i、 e.s:text字段中的“值”正确,但“名称”不正确。 现在,修改textfield时会出现问题。我们如何在action类中捕获ObjectC中修改的值

公共类ObjectA实现可序列化{
私有整数attr1;
私人名单;
//…能手和二传手。。。。
public类ObjectB实现可序列化{
私有整数11;
私人地图myMap;
//…能手和二传手。。。。
public类ObjectC实现可序列化{
私有整数111;
公共字符串属性112;
//…能手和二传手。。。。

jsp代码:

<s:iterator value="#objB.myMap" var="fieldMap" status="fieldStatus">

<li><label><s:property value="#fieldMap.key"/></label><span>
<s:textfield name="<NOT SURE>" value="%{#fieldMap.value.attr12}"  /></span></li>



</s:iterator> 


  • 在您的例子中,objB是一个
    列表
    包含一个
    哈希映射
    ,然后是一个
    哈希映射
    ,用于
    列表
    的每个元素

    objA
      |--- objB[0]
        |-- objC[A]
        |-- objC[B]
        |-- objC[C]
      |--- objB[1]
        |-- objC[X]
        |-- objC[Y]
        |-- objC[Z]
      |--- objB[n]
        |-- objC[N1]
        |-- objC[N2]
        |-- objC[N3]
    
    然后,您需要两个迭代器和以下
    OGNL
    符号来引用具有
    name
    属性的单个元素:

    <s:iterator value="objA.objB" var="listRow" status="listStatus">
    <!-- Iterating the List -->
        <s:iterator value="#listRow.myMap" var="mapRow" >
        <!-- Iterating the Map -->
            <li>
                <label>
                    <s:property value="#mapRow.key"/>
                </label>
                <span>
                    <s:textfield value="%{#mapRow.value.attr12}"  
                      name="objA.objB[#listStatus.index].myMap[#mapRow.key].attr112"
                    />
                </span>
            </li>
        </s:iterator> 
    </s:iterator> 
    
    
    

  • 通过提交表单?还不确定问题是什么——你是说你在表单中使用了正确的表示法,但它不起作用吗?@Dave jsp代码已添加到问题中。正确显示值,但在“名称”中使用了相同的表达式属性,当提交表单时,该值不会出现在操作中。名称是名称;您需要在对象图之后对其命名:OGNL所做的只是将表达式转换为调用。它无法知道
    fieldMap
    实际上不是名为
    fieldMap
    的属性。那么名称应该是objA.objB.myM吗ap(“%{fieldMap.key}”).attr112?Dave,谢谢你调查此事。Andrea,抱歉…IDE对象结构和控制台输出已附加到原始问题中。起初我认为,一个映射就足够了,但看起来它必须是来自guava的树型表,这使得它更加复杂。你能看一下吗?虽然是树型的edTable是地图中的一个地图,请告诉我您是否希望我就此提出另一个问题。我尝试过使用mymap[#outerkey][#innerkey].attr112,但它不起作用。嗯,很好:D我从未使用过这种东西,但如果您看看如何在Java中访问对象,那么它是完全相同的(具有不同的语法,但语义相同)在OGNL中,我可以建议您从根级别的单个TreeBasedTable对象开始(objA的同级),只是为了测试您是否可以使用OGNL从JSP获取并正确返回其值;一旦实现了这一点,就开始深入研究具有所有复杂性的双/三重迭代。希望对我的地图问题有所帮助,您的解决方案会起到作用。我已经为番石榴表打开了另一个讨论。感谢您抽出时间来研究它s、 [连结]