1

私は現在、スクリプトレットの代わりとして JSTL のテストを開始しており、(ドイツ語の) サンプル ページから次のコードをコピーしました。

<?xml version="1.0" encoding="utf-8" ?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fmt="http://java.sun.com/jsp/jstl/fmt" version="2.0" xmlns:a4j="http://richfaces.org/a4j">
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
        <head>
          <title>JSTL 1.1</title>
        </head>
        <body>
            <h1>Iteration</h1>

            <ul>
              <c:forEach var="num" begin="1" end="10">
                <li>Nummer <c:out value="${num}"/></li>
              </c:forEach>
            </ul>

            <h1>Formatierung</h1>

            <p>
              Währung: <fmt:formatNumber value="10000" type="currency" currencyCode="EUR" />
            </p>
        </body>
    </html>
</jsp:root>

私のアプリケーション コンテナーは Tomcat 7.0 で、JSTL ライブラリはプロジェクトにリンクされています (そうでない場合は別のエラー メッセージが表示されます)。リストされた JSP をローカル インストールのブラウザーから呼び出すと、次のエラー メッセージがスローされます。

Jul 03, 2013 2:56:58 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [/webapp01] threw exception [org.apache.jasper.JasperException: /test.jsp (line: 3, column: 3) Der Content von Elementen muss aus ordnungsgemäß formatierten Zeichendaten oder Markups bestehen.] with root cause
org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 3; Der Content von Elementen muss aus ordnungsgemäß formatierten Zeichendaten oder Markups bestehen.
  at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
  at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
  at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441)
  at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
  at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1388)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.startOfMarkup(XMLDocumentFragmentScannerImpl.java:2567)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2665)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
  at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489)
  at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
  at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
  at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
  at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
  at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
  at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:302)
  at org.apache.jasper.compiler.JspDocumentParser.parse(JspDocumentParser.java:172)
  at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:226)
  at org.apache.jasper.compiler.ParserController.parseDirectives(ParserController.java:119)
  at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:193)
  at org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
  at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
  at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
  at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
  at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
  at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
  at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
  at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
  at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
  at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
  at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
  at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  at java.lang.Thread.run(Thread.java:722)

確かに について不平を言っているようですが<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>、JSTL 2.0 の名前空間定義を実際にロードする必要がありますね。

編集 1: taglib の手動 (および形式が間違っている) インポートを削除すると、手動インポートで修正しようとしていたエラー メッセージが表示されます。

This page contains the following errors:

error on line 1 at column 110: Namespace prefix c on forEach is not defined
error on line 2 at column 56: Namespace prefix fmt on formatNumber is not defined

JSTLが見つからなかったことが原因であることがどこかでわかりました。ただし、プロジェクトに追加しましjstl-1.2.jarた。また、この問題は適切な Tomcat のバージョンがないことが原因である可能性があることを読みました。ただし、Tomcat 7 を実行していると確信しています。

4

1 に答える 1

2

整形式の XML である必要がある JSPX ドキュメントで、標準の JSP 構文で JSTL タグ ライブラリを宣言しようとしています (それぞれに開始タグと終了タグが<element> 必要です)。

これは正しくないです。JSTL コア タグ ライブラリのドキュメントを読む:

標準構文:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

XML 構文:

    <anyxmlelement xmlns:c="http://java.sun.com/jsp/jstl/core" />

には、適切な XML 構文が既にあります<jsp:root><@ taglib %>ラインを完全に取り除くだけです。

スクリプトレット<jsp:scriptlet>を使用することは、JSPX (考慮されていない要素) では既に不可能であることに注意してください。ここで何を置き換えようとしているのか疑問に思っています。


更新: 実行時にこれらの未解決の XML 名前空間は、webapp の実行時のクラスパスに問題があることを示しています。実際の JSTL 1.1/1.2 impl がランタイム クラスパスに存在しないか、(別の名前空間を使用する) JSTL 1.0 implランタイム クラスパスに存在し、クラスローディングで優先されます。それを検証/確認するに/WEB-INF/libは、エクスポート/デプロイされた WAR ファイルのフォルダーを調べます (プロジェクトを手動で WAR としてエクスポートするには、右クリックしてエクスポートします)。

JSTL 1.2 をインストールするには、ドロップjstl-1.2.jarインするだけ/WEB-INF/libです。それで全部です。プロジェクトのBuild Pathプロパティをいじらないでください。

以下も参照してください。

于 2013-07-03T13:14:43.973 に答える