Struts 2 s:选择标签动态ID

时间:2013-02-01 04:46:09

标签: java javascript 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>

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;

3 个答案:

答案 0 :(得分:8)

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

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

<s:select />部分无效,因为您在Struts2标记内注入scriptlet,这是不允许的。

要使其有效,您应该使用#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']}" />
<%    
    }
%>

然而,即使技术上可行,也不鼓励。你应该使用纯粹的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代替==<s:if test="%{#masterColDO.controlType.equals('dropdown')}">

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

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