【问题标题】:JSF: Serving Resources From a JarJSF:从 jar 中提供资源
【发布时间】:2012-06-05 12:58:59
【问题描述】:

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

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

  • Jboss EAP 5.1
  • 接缝 2.2
  • Richfaces 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/

  • 相位监听器
  • 过滤器
  • 小服务程序
  • Weblets

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

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

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.html Jawr 旨在捆绑 js 和 css 文件。

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

请指教:)

【问题讨论】:

    标签: jsf facelets


    【解决方案1】:

    您好,我想从 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,你可以使用自定义 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);
            }
        }
    } 
    

    如果您想在不编辑 xhtml 的情况下加载 resourceResolver,您可以这样做。

    @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 等打包在一个罐子里。

    【讨论】:

    • 请注意,当您使用 JSF 2.0 时,这一切都是不必要的。另请参阅stackoverflow.com/questions/8320486/… 顺便说一句,您在 Servlet 3.0 环境中使用 JSF 1.x 很奇怪。为什么不立即升级到 JSF 2.x?
    • 正如我所说:“卡在 JSF 1.2 中,这个功能并不是开箱即用的。”
    • 堆栈是 jboss (jboss eap) 支持的边界。摆弄会破坏支持协议。所以我还是告诉了。
    • jsf 2 在 2.3 版之前与 seam 2 不兼容。
    • 请记住,您必须添加 pages.xml 和 page.xml。如果你愿意,我也可以添加。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2018-02-01
    • 2015-11-21
    • 2016-10-09
    • 2016-07-08
    • 1970-01-01
    • 2016-11-04
    相关资源
    最近更新 更多