【问题标题】:Jasper in Equinox - does not resolve jstl core uriEquinox 中的 Jasper - 无法解析 jstl 核心 uri
【发布时间】:2009-04-03 09:54:55
【问题描述】:

我目前正在研究使用 Spring 的 OSGi,并研究了来自 Pro Spring Dynamic Modules for OSGi 的几个示例。

我的示例网络应用程序有一个控制器,例如:

@Controller
public class HelloWorldController {
    private HelloWorldService helloWorldService;

    @RequestMapping(method = RequestMethod.GET)
    @ModelAttribute("helloworld")
    public HelloWorld home() {
        return this.helloWorldService.find();
    }

    // injected in - spring looks up the service from OSGi
    public void setHelloWorldService(HelloWorldService helloWorldService) {
        this.helloWorldService = helloWorldService;
    }
}

视图解析器配置为:

<bean id="viewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" 
    value="org.springframework.web.servlet.view.JstlView"/>
  <property name="prefix" value="/jsp/" />
  <property name="suffix" value=".jsp" />
</bean>

调用 url 'http://localhost:8080/helloworld-web/spring/home' 应该会导致视图 jsp/home.jsp 被渲染,helloworld 包含单个 bean:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Spring DM HelloWorld</title>
</head>
<body>
<p>Results from accessing Spring-DM service bundle:</p>
<p>Message <c:out value="${helloworld.message}" /></p>
<p>Current Time: <c:out value="${helloworld.currentTime}" /></p>
<p>Model Version: <c:out value="${helloworld.modelVersion}" /></p>
</body>
</html>

但是,我看到以下堆栈跟踪:

org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
    org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:51)
    org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:409)
    org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:116)
    org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:317)
    org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:148)
    org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:424)
    org.apache.jasper.compiler.Parser.parseDirective(Parser.java:493)
    org.apache.jasper.compiler.Parser.parseElements(Parser.java:1557)
    org.apache.jasper.compiler.Parser.parse(Parser.java:127)
    org.apache.jasper.compiler.ParserController.doParse(ParserController.java:212)
    org.apache.jasper.compiler.ParserController.parse(ParserController.java:101)
    org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:156)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:296)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:277)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:265)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:299)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:236)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:257)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1183)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:902)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

因为这是一个部署为 OSGi 包的 WAR,所以它的WEB-INF/lib 目录是完全空的。

我的理解是,OSGi 版本的 jasper 会在单个 Web 应用程序之外寻找 taglib 描述符和 JAR?

还有其他人看过吗?

【问题讨论】:

    标签: spring jstl osgi equinox


    【解决方案1】:

    一定是一些微妙的捆绑版本问题。我为这本书下载了example code,它使用了略有不同的jasper等版本,现在可以使用了。

    Spring-DM reference 声明:

    Spring-DM 扩展了 JSP 约定,通过检测捆绑类路径中定义的任何标签库(导入的包或所需的捆绑包)将标签库打包为 WEB-INF/lib 下的 jar 或解压到 WEB-INF/classes 下)。

    我做了什么...

    【讨论】:

      【解决方案2】:

      什么包含您的 MANIFEST.MF(在 Import-package 和/或 Required bundle 中?)

      Bundle-ManifestVersion: 2
      Bundle-Classpath: .,
       WEB-INF/classes
      Bundle-Version: 0.0.1.SNAPSHOT
      Bundle-Name: iki-admin
      Import-Package: javax.servlet,
       javax.servlet.http,
       javax.servlet.resources,
       [..]
       net.sf.navigator.taglib.el,
       [..]
       org.ikiproject.lib.exception,
       [..]
       org.springframework.web.servlet.tags,
       uk.ltd.getahead.dwr
      Bundle-SymbolicName: org.ikiproject.admin
      Web-ContextPath: iki-admin
      Application-TraceLevels: *=info,org.ikiproject.*=verbose
      Bundle-RequiredExecutionEnvironment: JavaSE-1.6
      Require-Bundle: com.springsource.javax.servlet.jsp.jstl,
       com.springsource.org.apache.taglibs.standard,
       org.springframework.security.taglibs
      

      你也可能在使用 OSGi 的 jasper 和 apache-tomcat 版本之后遇到一些问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        • 2019-04-02
        • 1970-01-01
        • 2020-04-21
        • 2015-09-11
        • 1970-01-01
        • 2017-04-12
        相关资源
        最近更新 更多