支柱 2 s:选择标签动态 ID

Struts 2 s:select tag dynamic id

本文关键字:标签 动态 ID 选择 支柱      更新时间:2023-09-26

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

由于我不知道存在多少字段和什么类型的字段,因此我正在为它们提供动态id。我在我的 JSP 中使用了 Struts 2 标签。

问题出在<s:select>标签上:当我在 id 属性中给出 scriplet 时,它会显示以下错误:

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;
Scriptlet

旧的做事方式,你应该完全避免在JSP中编写Java代码;
Struts2 仅使用其标签和OGNL帮助您实现相同的目标。

<input />部分正在工作,因为您将scriptlet注入 HTML 标记,这是允许的。

<s:select />部分不起作用,因为您在 Struts2 标签中注入了scriptlet,这是不允许的。

要使其工作,您应该在 OGNL 中使用#attr语法来访问在 Scriptlets 中声明并由您在Page Context中推送的Java变量,如下所示(完全未经测试):

<%
    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>

PS:支柱标签没有任何styleClass属性; 您可以使用cssClass和/或cssStyle;
而且,如果controlType是字符串,则应使用 .equals 而不是 ==<s:if test="%{#masterColDO.controlType.equals('dropdown')}">

你应该使用 Struts2 表达式语法,如下所示:

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

Struts2 使用值堆栈,所以这个计数应该以 ognl 的方式获取,尝试这样的事情:

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