Struts 2 s:选择标签动态ID

Roh*_*mar 5 javascript java jsp struts2 ognl

我在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>
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

And*_*ios 8

Scriptlets为做事的老办法,你应该避免写Java在代码JSP的所有 ;
Struts2可以帮助您使用其标签实现相同的目标OGNL.

<input />部分正在工作,因为您正在注入scriptletHTML标记内部,这是允许的.

<s:select />部分无法正常工作,因为您正在注入一个scriptletStruts2内部标记,这是不允许的.

为了使它工作,你应该使用#attr语法OGNL来访问在Java声明Scriptlets和推送的变量,像这样(完全未经测试):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']}" />
<%    
    }
%>
Run Code Online (Sandbox Code Playgroud)

但是,即使技术上可行,也不鼓励它.您应该使用纯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>
Run Code Online (Sandbox Code Playgroud)

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