【问题标题】:Struts 2 s:select tag dynamic idStruts 2 s:select tag 动态id
【发布时间】:2013-01-16 09:18:08
【问题描述】:

我在一个 JSP 页面和一个按钮中有多个不同类型的字段。 这些字段是根据从我创建的元数据表中获取的信息生成的。

由于我不知道有多少和什么类型的字段存在,我给他们动态的id's。我在我的 JSP 中使用 Struts 2 标签。

问题出在<s:select> 标记上:当我在id 属性中提供脚本时,它会显示以下错误:

org.apache.jasper.JasperException: /success.jsp(83,12) 需要引用符号

<s:if test="%{#masterColDO.controlType=='dropdown'}">
    <s:select styleClass="login-textbox" 
                   style="width:130px"  
                    list="#masterColDO.validation"     
                    name="chngdColumnValues" 
                      id=<%="columnId" + count%> />
</s:if> 
<s:else>
    <input type=<s:property value="#masterColDO.controlType" /> 
          class="login-textbox " 
           name="chngdColumnValues" 
             id=<%="columnId" + count%> />
</s:else>

Javascript如下:

var addUpdateBtnId = document.getElementById('addUpdateBtnId');
addUpdateBtnId.value='Update';
addUpdateBtnId.onclick = function() {
    onClickUpdateBtn(rowIndex);
};
var selectedUpdateRow = xmlhttp.responseText.split(",");
for(var i = 0; i < selectedUpdateRow.length; i++){
    var columnElementId = "columnId"+i;
    document.getElementById(columnElementId).value = selectedUpdateRow[i];
}
document.getElementById("columnId"+(primaryKeyPos-1)).readOnly = true;

【问题讨论】:

    标签: java javascript jsp struts2 ognl


    【解决方案1】:

    您应该使用类似这样的 Struts2 表达式语法:

    id="%{'columnId' + count}"
    

    【讨论】:

    • 在我的代码中计数是一个 JAVA 变量。我用它作为计数器。我已将其实例化为 。我试过上面的代码,它不起作用
    • 这个 class="login-textbox " name="chngdColumnValues" id= /> 作品
    • 将脚本与 JSP 标签混合是一种不好的做法,您应该尝试使用 或将 count 定义为操作的属性struts.apache.org/2.x/docs/iterator.html
    【解决方案2】:

    Struts2使用valuestacks,所以这个count应该以ognl方式获取, 试试这样的:

    id="%{'columnId'+count}"
    

    【讨论】:

    • 在我的代码中计数是一个 JAVA 变量。我用它作为计数器。我已将其实例化为 。我试过上面的代码,它不起作用。这 class="login-textbox " name="chngdColumnValues" id= /> 有效
    【解决方案3】:

    Scriptlets 是旧的做事方式,you should avoid writing Java code in JSP's at all
    Struts2 仅使用其标签和OGNL 帮助您实现相同的目标。

    &lt;input /&gt; 部分正在工作,因为您在 HTML 标记内注入了 scriptlet,这是允许的。

    &lt;s:select /&gt; 部分不起作用,因为您在 Struts2 标记内注入了 scriptlet,这是不允许的。

    为了让它工作,你应该在OGNL 中使用#attr 语法来访问在Scriptlets 中声明的Java 变量并在Page Context 中推送由你,就像这样(完全未经测试):

    <%
        for (int counter=0;counter<myList.size();counter++) {
           // pushing it into the pageContext
           pageContext.setAttribute("counter",counter);
    %>
            <s:select cssClass="login-textbox" 
                      cssStyle="width:130px" 
                          list="#masterColDO.validation" 
                          name="chngdColumnValues"      
                            id="%{'columnId' + #attr['counter']}" />
    <%    
        }
    %>
    

    但是,即使技术上可行,也不鼓励这样做。为此,您应该使用纯 Struts2 方式,如下所示:

    <s:iterator value="myList" status="ctr">
        <s:select cssClass="login-textbox" 
                  cssStyle="width:130px" 
                      list="#masterColDO.validation" 
                      name="chngdColumnValues" 
                        id="%{'columnId' + #ctr.index}" />
    </s:iterator>
    

    P.S: Struts 标签没有任何styleClass 属性;您可以使用cssClass 和/或cssStyle
    而且,如果controlType 是一个字符串,你应该使用.equals 而不是==&lt;s:if test="%{#masterColDO.controlType.equals('dropdown')}"&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2013-09-15
      相关资源
      最近更新 更多