内部非法文字" c:选择"标签:"'

时间:2014-05-21 16:21:52

标签: java javascript jsp jstl

$("#medicine").append('<tr class="hide1 newRow"   id="row'+medCurrentIndex+'">'
                +'<td>'+medtype[medCurrentIndex]+'</td>'
                +'<td>'+medicineName[medCurrentIndex]+'</td>'
                +'<td>'+frequency[medCurrentIndex]+'</td>'
                +'<td>'+dose[medCurrentIndex]+'</td>'
                +'<td>'+quantity[medCurrentIndex]+'</td>'
                +'<td>'+numberofDays[medCurrentIndex]+'</td>'
                +'<c:choose>'
                +'<c:when test="${role eq 'doctor' }">'
                +'<td><button class="btn" type="button" name="edit" value="Edit" onclick="editMedRow('+medCurrentIndex+');">Edit</button></td>'
                +'<td><button class="btn"  type="button" name="delete" value="Delete" onclick="deleteMedRow('+medCurrentIndex+');">Delete</button></td>'
                +'</c:when>'
                +'<c:otherwise>'
                +'<td><input type="text" id="cost" /></td>'
                +'</c:otherwise>'
                +'</c:choose>'
                +'</tr>');

这段代码在 JSP 的javaScript中编写是否合法? 因为它给了我以下错误:

  

org.apache.jasper.JasperException:

来自TagLibraryValidator的c / in /EEB-INF/views/prescriptionTemporary.jsp的验证错误消息

79:“c中的非法文本:选择“tag:”'

2 个答案:

答案 0 :(得分:2)

JSP中的任何Java代码都将在渲染时进行评估。这意味着,服务器将读取JSP代码,并将开始替换必要的Java代码的任何scriptlet或自定义标记(如JSTL)。这个例子很容易解释:

<script type="text/javascript">
    var x = '${x}';
</script>

或以JSTL形式:

<script type="text/javascript">
    var x = '<c:out value="${x}" />';
</script>

假设x是一个值为&#34; Hello World&#34;的请求属性,这将在HTML中生成此输出:

<script type="text/javascript">
    var x = 'Hello World';
</script>

在您的情况下,它会尝试将这部分代码转换为JSTL格式:

<c:choose>'
    <!--  ^ this character is invalid. There must be a <c:when> right after <c:choose>
            v this character is also invalid. There must be a <c:when> right after <c:choose> -->
            +'<c:when test="${role eq 'doctor' }">'

简而言之,您不应尝试从JavaScript附加任何类型的Java代码(scriptlet,表达式语言,JSTL等自定义标记)。

答案 1 :(得分:0)

在javascript中编写jstl标签不起作用。解析jstl标签很久之后,JQuery的.append(...)方法将在客户端启动。

如果您的目标是通过jstl选择要追加的内容,则需要进行重大改写。


编辑:

试试这个:

$("#medicine").append('<tr class="hide1 newRow"   id="row'+medCurrentIndex+'">'
   +'<td>'+medtype[medCurrentIndex]+'</td>'
   +'<td>'+medicineName[medCurrentIndex]+'</td>'
   +'<td>'+frequency[medCurrentIndex]+'</td>'
   +'<td>'+dose[medCurrentIndex]+'</td>'
   +'<td>'+quantity[medCurrentIndex]+'</td>'
   +'<td>'+numberofDays[medCurrentIndex]+'</td>'
       <c:choose>
       <c:when test="${role eq 'doctor' }">
           +'<td><button class="btn" type="button" name="edit" value="Edit" onclick="editMedRow('+medCurrentIndex+');">Edit</button></td>'
           +'<td><button class="btn"  type="button" name="delete" value="Delete" onclick="deleteMedRow('+medCurrentIndex+');">Delete</button></td>'
       </c:when>
       <c:otherwise>
           +'<td><input type="text" id="cost" /></td>'
       </c:otherwise>
       </c:choose>
   +'</tr>');

我想强调的是,虽然上面的代码段可能有用,但我不推荐。更好的解决方案是将${role}转储到全局变量或隐藏输入中,并从JS端做出决策。或者在jstl中设置整个追加字符串。混合这两者使得阅读更加困难。