JSF:从 Jar 中提供资源

2023-12-05

我正在创建几个装有 Facelets 模板的罐子,供整个组织使用。

在 JSF 1.2 中,此功能并不是开箱即用的。 堆:

  • Jboss EAP 5.1
  • Seam 2.2
  • 富脸3.3.3

在我看来,我主要需要两个资源:

  1. 查找 Faclets 资源的资源解析器
  2. 一个从 jar 中提供 css 和 js 资源的东西

资源解析器似乎是简单的部分:http://ocpsoft.org/opensource/create-common-facelets-jar/

传输 css / js 的事情稍微复杂一些:JSF:从 Jar 中提供资源 http://cagataycivici.wordpress.com/2006/05/09/jsf_serving_resources_from_a/

  • 相位监听器
  • Filter
  • Servlet
  • Weblets

我非常想使用 Weblets,因为它似乎是专门解决这个问题的项目。此外,我买的这本很酷的 JSF 书中推荐:“Pro JSF 和 Ajax 构建丰富的互联网组件”

问题是我在任何 Maven 存储库中都找不到稳定版本,也没有文档。在示例中,没有使用任何 faclets:

https://github.com/werpu/weblets

在上面的文章中,过滤器被强调为一个很好的解决方案。http://myfaces.apache.org/tomahawk-project/tomahawk/apidocs/org/apache/myfaces/webapp/filter/ExtensionsFilter.html

遗憾的是,连接到这个解决方案并不是一件简单的任务。我只是没有时间(或目前的知识):(

可能我可以使用这个项目:http://jawr.java.net/introduction.htmlJawr 旨在捆绑 js 和 css 文件。

项目维基表明这是可能的:http://jawr.java.net/docs/generators.html请参阅“类路径资源生成器”部分。

请指教 :)


你好,我想从 jar 中加载 css、js 等,你可以使用以下命令。

package se.lu.ldc.core.servlet;


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import javax.faces.webapp.FacesServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;


/**
 * Servlet för att hämta diverse filer från jar om de finns i jaren
 *  jpg, png, gif, css, xcss,xml,js
 * @author ldc-jha
 *
 */
@WebServlet(name="ldcServlet",loadOnStartup=1,urlPatterns={"*.jpg","*.png","*.gif","*.css","*.xcss","*.js"})
public class LDCFrameWorkServlet extends HttpServlet
{  

    //where the files are in the jar.
    public final String BASE_PATH = "xhtml/framework";

    private Logger log = Logger.getLogger(getClass().getName());

    @Override
    public void init(ServletConfig config) throws ServletException
    {
        System.out.println("INIT()");
        super.init(config);
    }
    @Override
    public void doGet(HttpServletRequest request, 
            HttpServletResponse response) throws ServletException, IOException {


        /* if this servlet is not mapped to a path, use the request URI */
        String path = request.getPathInfo();
        if (path == null) {
            path = request.getRequestURI().substring(
                    request.getContextPath().length());
        }

        URL resource = Thread.currentThread().getContextClassLoader().
        getResource(BASE_PATH+"/"+path.substring(1));

        if (resource == null) {
            ServletContext sc = getServletContext();

            String filename = sc.getRealPath(path);
            log.info("During Load:"+resource+":"+path+":"+filename);
            try{
                resource = sc.getResource(path);
            }catch(Exception e){}
            if(resource == null)
            {
                response.sendError(404, path + " denied");

            }

        }
        /* failure conditions */
        if (path.endsWith(".seam")) {
            javax.faces.webapp.FacesServlet facesServlet = new FacesServlet();
            facesServlet.service(request, response);

            return;
        }
        if (path.endsWith(".class")) {
            response.sendError(403, path + " denied");
            return;
        }

        /* find the resource */
        log.info("Looking for " + path + " on the classpath");

        //response.sendError(404, path + " not found on classpath");

        log.info("found " + path + " on the classpath:"+resource.toString());

        /* check modification date */
        URLConnection connection = resource.openConnection();
        long lastModified = connection.getLastModified();
        long ifModifiedSince = request.getDateHeader("If-Modified-Since");
        if (ifModifiedSince != -1 && lastModified <= ifModifiedSince) {
            response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
            return;
        }

        /* write to response */
        response.setContentType(getServletContext().getMimeType(path));
        OutputStream out = new BufferedOutputStream(
                response.getOutputStream(), 512);
        InputStream in = new BufferedInputStream(
                resource.openStream(), 512);
        try {
            int len;
            byte[] data = new byte[512];
            while ((len = in.read(data)) != -1) {
                out.write(data, 0, len);
            }
        } finally {
            out.close();
            in.close();
            if (connection.getInputStream() != null) {
                connection.getInputStream().close();
            }
        }

    } /* doGet() */


    @Override
    public void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
        doGet(request, response);
    }

}

如果你想从 jar 加载 faclets,你可以使用 Custom DefaultResourceResolver

/**
 * Används för hämta hämta xhtml filer från jar filen
 * @author ldc-jha
 *
 */
public class ClassletsResourceResolver extends DefaultResourceResolver implements ResourceResolver{

    public ClassletsResourceResolver() {
        super();
    }

    private static final String PREFIX = "/framework/";
    private static final String LAYOUT = "/layout/";

    public String getPrefix() {
        return PREFIX;
    }

    public URL resolveUrl(String path) {
        final String prefix = getPrefix();
        System.out.println("resolveUrl()"+path);
        URL url = null;
        if (path != null && path.startsWith(PREFIX)) {
            final String resource = path.substring(PREFIX.length());
            url = getClass().getClassLoader().getResource("xhtml/framework/"+resource);
        }

        if (path != null && path.startsWith(LAYOUT)) {
            System.out.println("LAYOUT:"+path);
            url = getClass().getClassLoader().getResource("xhtml/framework"+path);
            System.out.println(url);
        }

        if(url != null){
            return url;
        }
        else
        {
            return super.resolveUrl(path);
        }
    }
} 

如果你想加载resourceResolver而不编辑你的xhtml,你可以这样做。

@WebListener
public class SimpleServletContextListener implements ServletContextListener{

    private static final LogProvider log = Logging.getLogProvider(SimpleServletContextListener.class);


    public void contextInitialized(ServletContextEvent event){


                      event.getServletContext().setAttribute("facelets.RESOURCE_RESOLVER","se.lu.ldc.core.reslover.ClassletsResourceResolver");

}

}

您可能还必须让 Seam 了解 Faclets,如果有任何问题请告诉我。我有同样的想法,并将所有 css、xhtml 等打包在一个 jar 中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSF:从 Jar 中提供资源 的相关文章

随机推荐

  • shein笔试第一道编程题,通过率33%,有人知道哪里错了吗

    题解 链表的奇偶重排 struct ListNode int val struct ListNode next ListNode int x 题解 牛牛的新数组求和 include
  • Python mmap:使用内存映射执行文件 I/O(概述)

    这Python之禅有很多智慧可以提供 一个特别有用的想法是 应该有一种 最好只有一种 明显的方法来做到这一点 然而 在 Python 中完成大多数事情有多种方法 而且通常都有充分的理由 例如 有Python 读取文件的多种方法 包括很少使用
  • URL 链接:app_name、路径名和参数

    在本课中 您将了解链接模板一起 命名空间在姜戈中 路径名 并通过URL 中的参数 你还会遇到一个新错误 NoReverseMatch
  • 如何了解更多 VS Code

    在我们的专门课程中了解有关 Visual Studio Code 的更多信息 Visual Studio Code 中的 Python 开发 设置指南
  • Python 的“in”和“not in”运算符:检查成员资格

    目录 Getting Started With Membership Tests in Python Python 的 in 运算符 Python 不在 Operator 中 Using in and not in With Differe
  • 使用 Tkinter 进行 Python GUI 编程

    目录 Building Your First Python GUI Application With Tkinter 添加小部件 检查你的理解情况 Working With Widgets 使用标签小部件显示文本和图像 使用按钮小部件显示可
  • 如何了解更多信息

    在我们的专门课程中了解有关 Thonny 的更多信息 Thonny 适合初学者的 Python 编辑器
  • 回顾你所学的内容

    通过回顾您在课程或教程中学到的内容 您将更深入地处理信息 这有助于长期保留 重要链接 互动测验 书签教程
  • 在 Python 中使用 len() 函数

    目录 Getting Started With Python s len 将 len 与内置序列一起使用 将 len 与内置集合一起使用 探索 len 与其他内置数据类型 Exploring len Further With Some Ex
  • 动画片

    通过使用 r和 b转义序列来控制光标的位置 您可以使用文本创建翻页书样式的动画 以下是如何制作一个旋转器来指示忙碌状态 usr bin env python from time import sleep Show the spinning
  • 使用 Beautiful Soup 和 Python 进行网页抓取(概述)

    互联网上数量惊人的数据对于任何研究领域或个人兴趣来说都是丰富的资源 为了有效地收集这些数据 您需要熟练掌握网页抓取 Python 库requests和 Beautiful Soup 是完成这项工作的强大工具 如果您喜欢通过实践示例进行学习并
  • 在 Ubuntu Linux 16.04 上安装 Python

    了解如何使用 deadsnakes PPA 在 Ubuntu 16 04 中安装 Python 3 7 deadsnakes PPA 是一个包含旧版 Ubuntu 安装的现代 Python 版本的存储库
  • While 循环和列表

    在本课中 您将学习如何使用while 环形 该代码是在视频的实时会话中调试的 一个简单的例子可能如下所示 a fizz baz buzz while a print a pop 1
  • Python 的 map() 函数入门

    以下是有关 lambda 的资源和附加文档 如何使用 Python Lambda 函数 真正的 Python 文章 如何使用 Python Lambda 函数 真正的 Python 视频课程 Lambda 表达式 Python 文档
  • 选择优质包第 2 部分

    资源和链接 如何为 GitHub 项目编写出色的自述文件 dbader org 开源许可证解释 choosealicense com
  • Python 的 map() 函数:转换 Iterables(摘要)

    在本课程中 您学习了如何map 工作原理以及如何使用它来处理可迭代对象 你还了解了一些Pythonic您可以用来替换的工具map 在你的代码中 您现在知道如何 使用Pythonmap 使用map 到过程和转换不使用显式循环的迭代 结合map
  • Python 3.9 中很酷的新功能(概述)

    Python 3 9 来了 在过去的一年里 来自世界各地的志愿者一直致力于 Python 的改进 虽然 Beta 版本已经发布了一段时间 但 Python 3 9 的第一个正式版本已于2020 年 10 月 5 日 Python 的每个版本
  • 使用需求文件

    A 需求文件是项目所有依赖项的列表 这包括依赖项所需的依赖项 它还包含每个依赖项的特定版本 用双等号指定 pip freeze将列出当前项目的依赖关系stdout 此 shell 命令会将其导出为名为的文件requirements txt
  • 多处理模块

    在本课程中 您将了解为什么要采用这种方法 因为你的代码写在函数式编程风格 你可以相当容易地并行化它 有一个平行的map构建您可以使用的 这样 您就可以并行运行处理步骤 您将导入multiprocessing模块 因为它具有并行运行此操作所需
  • JSF:从 Jar 中提供资源

    我正在创建几个装有 Facelets 模板的罐子 供整个组织使用 在 JSF 1 2 中 此功能并不是开箱即用的 堆 Jboss EAP 5 1 Seam 2 2 富脸3 3 3 在我看来 我主要需要两个资源 查找 Faclets 资源的资