【问题标题】:JSP XML syntax error: JasperException when replacing <% %> with <jsp:scriptlet> </jsp:scriptlet>JSP XML 语法错误:用 <jsp:scriptlet> </jsp:scriptlet> 替换 <% %> 时出现 JasperException
【发布时间】:2013-08-22 04:36:07
【问题描述】:

jsp 文件中的以下代码显示使用 Apache Tomcat 没有问题的网页:

<!DOCTYPE HTML>
<%@page import='java.util.*' %>
<%@page contentType='text/html' pageEncoding='UTF-8' %>
<html>
    <body>
        <%
            ArrayList<String> stringList = new ArrayList<String>();
            stringList.add("string A");
            stringList.add("string B");
            for (int i = 0; i < stringList.size(); i++){
            out.println("<p>"+stringList.get(i)+"</p>");
            }
        %>
    </body>
</html>

但是这段使用 XML 语法的代码会抛出 JasperException,尽管它和上面的一样,只是将 JSP 标签替换为 JSP XML 标签:

<!DOCTYPE HTML>
<jsp:directive.page import='java.util.*' />
<jsp:directive.page contentType='text/html' pageEncoding='UTF-8' />
<html>
    <body>
        <jsp:scriptlet>
            ArrayList<String> stringList = new ArrayList<String>();
            stringList.add("string A");
            stringList.add("string B");
            for (int i = 0; i < stringList.size(); i++){
                out.println("<p>"+stringList.get(i)+"</p>");
            }
        </jsp:scriptlet>
    </body>
</html>

抛出此错误:

Aug 22, 2013 2:27:42 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [] threw exception [/cftp2Error.jsp (line: 6, column: 17) Unterminated &lt;jsp:scriptlet&gt; tag] with root cause
org.apache.jasper.JasperException: /cftp2Error.jsp (line: 6, column: 17) Unterminated &lt;jsp:scriptlet&gt; tag
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42)
    at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:408)
    at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:133)
...

谁能告诉我我的 XML JSP 代码哪里出错了?我正在使用 Tomcat 7.0.34 运行 JDK1.7。 谢谢, 基思

【问题讨论】:

    标签: java jsp tomcat servlets


    【解决方案1】:

    您需要将文件内容包含在&lt;jsp:root&gt;&lt;/jsp:root&gt; 中,并转义 字符,例如:

    <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
    

            ArrayList&lt;String&gt; stringList = new ArrayList&lt;String&gt;();
            stringList.add("string A");
            stringList.add("string B");
            for (int i = 0; i &lt; stringList.size(); i++){
                out.println("<p>"+stringList.get(i)+"</p>");
            }
    
        </jsp:scriptlet>
    </body>
    

    【讨论】:

    • 感谢您指出正确的方向,我不知道 jsp:root 标签。我搜索了那个词,发现 JSP XML 语法不是为手工编码而设计的(来源:coderanch.com/t/475967/JSP/java/…),很遗憾。即使使用 jsp:root 标记我也无法使页面正常工作,但至少我现在知道这种编写 jsp 页面的 XML 风格会充满问题。
    • 我认为关键是要转义 字符。您现在可以尝试相同的方法吗,因为我可以使用 tomcat 实例启动页面
    • 感谢您一直以来的帮助。是的,我用那些转义字符试过了,没有任何区别。我什至尝试使用数组而不是 ArrayList,并从字符串中删除了

      元素,但仍然没有任何区别。

    【解决方案2】:

    试试这个代码。 (注意:并使用迭代器迭代一个数组列表。)

    <!DOCTYPE HTML>
    <jsp:directive.page import='java.util.*' />
    <jsp:directive.page contentType='text/html' pageEncoding='UTF-8' />
    <html>
        <body>
            <jsp:declaration>
                ArrayList<String> stringList = new ArrayList<String>();
                stringList.add("string A");
                stringList.add("string B");
                for (int i = 0; i < stringList.size(); i++){
                    out.println("<p>"+stringList.get(i)+"</p>");
                }
            </jsp:declaration>
        </body>
    </html>
    

    【讨论】:

    • 是否抛出同样的异常?
    【解决方案3】:

    原来是 JSP XML 语法的标记不应该用于手动编码(与 标记不同,正如我在此页面上发现的那样: http://www.coderanch.com/t/475967/JSP/java/Strange-JSP-error-Invalid-Standard

    要使代码正常工作需要付出大量努力才能将所有实体字符(、& 等)转换为其转义版本,并且需要大量额外的 XML 标记才能使其成为可接受的 jsp XML 标记。 干杯, 基思

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 2016-08-09
      • 2014-06-21
      • 1970-01-01
      相关资源
      最近更新 更多