1

私は、組織全体で使用するためのファセットテンプレートがパックされたいくつかのjarファイルを作成しているところです。

JSF 1.2で立ち往生しているこの機能は、箱から出してすぐには出てきません。スタック:

  • Jboss EAP 5.1
  • シーム2.2
  • Richfaces 3.3.3

私には主に2つのリソースが必要なようです。

  1. Facletsリソースを見つけるリソースリゾルバー
  2. jarからcssおよびjsリソースを提供するもの

リソースリゾルバーは簡単な部分のようです:http: //ocpsoft.org/opensource/create-common-facelets-jar/

css / jsをストリーミングするものは少し複雑です: JSF:瓶からリソースを提供する http://cagataycivici.wordpress.com/2006/05/09/jsf_serving_resources_from_a/

  • フェーズリスナー
  • フィルター
  • サーブレット
  • ウェブレット

この問題を解決するための専用プロジェクトのようですので、Webletsを使用したいと思います。さらに、私が購入したこのクールなJSFの本、「ProJSFとAjaxBuildingRichInternetComponents」で推奨されています。

問題は、どの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「クラスパスリソースジェネレータ」セクションを参照してください。

ご意見をお聞かせください :)

4

1 に答える 1

3

こんにちは私はあなたが次を使用できる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からファクレットをロードする場合は、カスタム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などをjarファイルにパックして動作させました。

于 2012-06-05T22:28:35.203 に答える