2012-06-05 4 views
1

조직을 통해 사용하기 위해 facelets 템플릿으로 포장 된 몇 개의 병을 만드는 과정에 있습니다.JSF : 항아리에서 리소스 검색

JSF 1.2에 멈추었으므로이 기능은 기본적으로 제공되지 않습니다. 스택 :

  • 제이 보스 EAP 5.1
  • 심 2.2
  • Richfaces 내가 주로 두 가지 자원을 필요가 날 것으로 보인다 3.3.3

:

  1. 자원의 해결을 그 Faclets 리소스를 찾습니다.
  2. CSS를 지원하는 것 JSF : http://ocpsoft.org/opensource/create-common-facelets-jar/

    CSS/JS 스트림 것은 약간 더 복잡하다 : 항아리에서 D JS 자원

자원의 해결은 쉬운 부분이 될 것으로 보인다 봉사 자원 항아리에서 http://cagataycivici.wordpress.com/2006/05/09/jsf_serving_resources_from_a/

  • Phaselistener
  • 필터
  • 서블릿
  • Weblets는

난 아주 많이이 프로젝트는이 문제를 해결하기 위해 최선을 다하고있는 것 같다으로 Weblets을 사용하고 싶습니다. 더 나아가이 내가 구입 시원한 JSF 책에서 권장 : "프로 JSF와 Ajax 건물 리치 인터넷 구성 요소"

문제는 내가 어떤 메이븐의 repo없이 문서의 안정 버전을 찾을 수 있다는 것입니다. 예에서 더 faclets는 사용되지되지 않습니다 필터 위의 기사에서

https://github.com/werpu/weblets

좋은 솔루션으로 강조 표시됩니다.

슬프게도이 솔루션에 연결하는 것은 간단한 작업이 아닙니다. 나는 단순히 (순간이나 지식) 시간 :(

이 가능한

나는이 프로젝트에 사용할 수 없습니다 :. http://jawr.java.net/introduction.html Jawr는 JS와 CSS 파일을 번들로 목표를

프로젝트 위키가 될 수 있음을 나타냅니다 수 : http://jawr.java.net/docs/generators.html는 "클래스 패스 자원 발전기"절을 참조하십시오

하십시오 조언 :

답변

3

안녕하세요 난 당신이 다음을 사용할 수있는 항아리에서 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); 
    } 

} 

당신이 항아리에서 faclets를로드하려는 경우이 작업을 수행 할 수 있습니다 XHTML을 편집 wihtout resourceResolver를로드하려는 경우 사용자 정의 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); 
     } 
    } 
} 

를 사용할 수 있습니다.

@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 등을 포장하는 작업을했습니다.

+0

JSF 2.0을 사용할 때이 모든 것이 불필요하다는 점에 유의하십시오. 또한 http://stackoverflow.com/questions/8320486/structure-for-multiple-jsf-projects-with-shared-code를 참조하십시오. Servlet 3.0 환경에서 JSF 1.x를 사용한다는 것은 이상한 일입니다. 왜 JSF 2.x로 즉시 업그레이드하지 않습니까? – BalusC

+0

내가 말했듯이 : "JSF 1.2에서 멈췄다.이 기능은 박스에서 나오지 않는다." –

+0

스택은 jboss (jboss eap)에서 지원되는 경계입니다. 함께 협조하면 지원 계약이 중단됩니다. 그래서 Im은 어떻게 든 이야기했다. –

관련 문제