【问题标题】:How to programmatic render JSP files?如何以编程方式呈现 JSP 文件?
【发布时间】:2011-03-14 06:00:35
【问题描述】:

目前,我使用 Velocity 而不是 JSP,因为它具有灵活性。由于某些原因,我需要在jar 存档中分发我的网络模块,而不是war 存档`。

不过,我已经阅读了 servlet 规范,但我没有找到以编程方式调用 jasper 引擎的方法。

我的想法是,将 Web 应用程序拆分为几个模块:

  • 一个顶级 war 模块,其中包含 web.xml 和所有 3rd-party jar 依赖项。
  • 其他jar 模块包含http servlet(jsp 是一种特殊形式的servlet)。

在类资源中嵌入 Velocity 模板非常容易,所以我想知道是否可以使用 JSP 完成同样的工作?

编辑

Velocity 的问题是,我们必须使用一些 taglibs、JSF 等来创建丰富的 Web UI,而这是 Velocity 模板无法做到的。

【问题讨论】:

    标签: jsp web-applications modularization


    【解决方案1】:

    我们必须使用一些标记库、JSF 等来创建丰富的 Web UI,这是 Velocity 模板无法做到的。

    使用Facelets 代替JSP。它不仅提供了比 JSP 更好的模板可能性,而且还可以直接从类路径提供 Facelet 文件。假设您仍在使用 JSF 1.x(因为 JSF 2.x 使用 默认情况下 Facelets 而不是 JSP,并且确实没有理由更喜欢 JSP 而不是 Facelets),那么您可以启用服务 Facelets从 JAR 如下:

    import com.sun.facelets.impl.DefaultResourceResolver;
    
    public class CustomResourceResolver extends DefaultResourceResolver {
    
        @Override
        public URL resolveUrl(String resource) {
            URL url = super.resolveUrl(resource);
    
            if (url == null) {
                if (resource.startsWith("/")) {
                    resource = resource.substring(1);
                }
    
                url = Thread.currentThread().getContextClassLoader().getResource(resource);
            }
    
            return url;
        }
    
    }
    

    你在web.xml注册如下:

    <context-param>
        <param-name>facelets.RESOURCE_RESOLVER</param-name>
        <param-value>com.example.CustomResourceResolver</param-value>
    </context-param>
    

    要了解有关 Facelets 的更多信息,请从这个出色的 developer documentation 开始。

    【讨论】:

    • 但是,CustomResourceResolver 不能按预期工作。在 Myfaces-impl 中,它只解析根资源('/'),然后缓存根 URL,然后将其他资源与缓存的 URL 连接起来。即,如果资源在不同的罐子里,事情就会坏掉。
    • 幸运的是,我已经对 myfaces-impl 进行了修补,尽管这使得我们的程序与 myfaces-impl 紧密结合。
    猜你喜欢
    • 2010-12-15
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多