1. 按照以下代碼改寫你自己的Activator (或者將代碼中的"/pages"改成你的jsf網頁路徑):
          注意加粗的那段代碼(使用當前的class loader來加載jsf的FacesServlet)

          package net.andyluo.singlife.jsf.demo;

          import java.io.IOException;
          import java.util.Dictionary;
          import java.util.Hashtable;

          import javax.faces.webapp.FacesServlet;
          import javax.servlet.Servlet;
          import javax.servlet.ServletConfig;
          import javax.servlet.ServletContextEvent;
          import javax.servlet.ServletContextListener;
          import javax.servlet.ServletException;
          import javax.servlet.ServletRequest;
          import javax.servlet.ServletResponse;

          import org.eclipse.equinox.http.helper.BundleEntryHttpContext;
          import org.eclipse.equinox.http.helper.ContextPathServletAdaptor;
          import org.eclipse.equinox.jsp.jasper.JspServlet;
          import org.osgi.framework.BundleActivator;
          import org.osgi.framework.BundleContext;
          import org.osgi.framework.ServiceReference;
          import org.osgi.service.http.HttpContext;
          import org.osgi.service.http.HttpService;
          import org.osgi.util.tracker.ServiceTracker;

          import com.sun.faces.config.ConfigureListener;

          public class Activator implements BundleActivator 
          {

              
          private ServiceTracker httpServiceTracker;

              
          public void start(BundleContext context) throws Exception 
              
          {
                  httpServiceTracker 
          = new HttpServiceTracker(context);
                  httpServiceTracker.open();
              }


              
          public void stop(BundleContext context) throws Exception 
              
          {
                  httpServiceTracker.close();
              }


              
          private class HttpServiceTracker extends ServiceTracker 
              
          {

                  
          private static final String PATH = "/jsf";

                  
          public HttpServiceTracker(BundleContext context) 
                  
          {
                      
          super(context, HttpService.class.getName(), null);
                  }


                  
          public Object addingService(ServiceReference reference) 
                  
          {
                      
          final HttpService httpService = (HttpService) context
                              .getService(reference);
                      
          try 
                      
          {
                          HttpContext commonContext 
          = new BundleEntryHttpContext(context
                                  .getBundle(), 
          "/pages");
                          httpService.registerResources(PATH, 
          "/", commonContext);

                          JspServlet jspServlet 
          = new JspServlet(context.getBundle(),
                                  
          "/pages");
                          Servlet adaptedJspServlet 
          = new ContextPathServletAdaptor(
                                  jspServlet, PATH);
                          httpService.registerServlet(PATH 
          + "/*.jsp", adaptedJspServlet,
                                  
          null, commonContext);

                          Dictionary initparams 
          = new Hashtable();
                          initparams.put(
          "servlet-name""Faces Servlet");
                          Servlet adaptedFacesServlet 
          = new ServletContextListenerServletAdaptor(
                                  
          new ConfigureListener(), new
           FacesServlet(), jspServlet
                                          .getJspLoader());

                          adaptedFacesServlet 
          = new ContextPathServletAdaptor(
                                  adaptedFacesServlet, PATH);
                          httpService.registerServlet(PATH 
          + "/*.jsf",
                                  adaptedFacesServlet, initparams, commonContext);

                      }
           catch (Exception e) 
                      
          {
                          e.printStackTrace();
                      }

                      
          return httpService;
                  }


                  
          public void removedService(ServiceReference reference, Object service) 
                  
          {
                      
          final HttpService httpService = (HttpService) service;
                      httpService.unregister(PATH); 
          //$NON-NLS-1$
                      httpService.unregister(PATH + "/*.jsp"); //$NON-NLS-1$
                      httpService.unregister(PATH + "/*.jsf"); //$NON-NLS-1$            
                      super.removedService(reference, service);
                  }

              }


              
          public class ServletContextListenerServletAdaptor implements Servlet 
              
          {
                  
          private ServletConfig config;

                  
          private ServletContextListener listener;

                  
          private Servlet delegate;

                  
          private ClassLoader jspLoader;

                  
          public ServletContextListenerServletAdaptor(
                          ServletContextListener listener, Servlet delegate,
                          ClassLoader jspLoader) 
                  
          {
                      
          this.listener = listener;
                      
          this.delegate = delegate;
                      
          this.jspLoader = jspLoader;
                  }


                  
          public void init(ServletConfig config) throws ServletException 
                  
          {
                      
          this.config = config;
                      ClassLoader original 
          = Thread.currentThread()
                              .getContextClassLoader();
                      
          try 
                      
          {
                          Thread.currentThread().setContextClassLoader(jspLoader);
                          listener.contextInitialized(
          new ServletContextEvent(config
                                  .getServletContext()));
                          delegate.init(config);
                      }
           finally 
                      
          {
                          Thread.currentThread().setContextClassLoader(original);
                      }

                  }


                  
          public void service(ServletRequest req, ServletResponse resp)
                          
          throws ServletException, IOException 
                  
          {
                      ClassLoader original 
          = Thread.currentThread()
                              .getContextClassLoader();
                      
          try 
                      
          {
                          Thread.currentThread().setContextClassLoader(jspLoader);
                          delegate.service(req, resp);
                      }
           finally 
                      
          {
                          Thread.currentThread().setContextClassLoader(original);
                      }

                  }


                  
          public void destroy() 
                  
          {
                      ClassLoader original 
          = Thread.currentThread()
                              .getContextClassLoader();
                      
          try 
                      
          {
                          Thread.currentThread().setContextClassLoader(jspLoader);
                          delegate.destroy();
                          listener.contextDestroyed(
          new ServletContextEvent(config
                                  .getServletContext()));
                          config 
          = null;
                      }
           finally 
                      
          {
                          Thread.currentThread().setContextClassLoader(original);
                      }

                  }


                  
          public ServletConfig getServletConfig() 
                  
          {
                      
          return config;
                  }


                  
          public String getServletInfo() 
                  
          {
                      
          return "";
                  }

              }


          }


          2. 因為JspServlet中沒有返回class loader的方法,所以我們要更改一下JspServlet的實現代碼(hack一下):更改equinox的org.eclipse.equinox.jsp.jasper_*.jar中的org.eclipse.equinox.jsp.jasper.JspServlet類:(可以下載JspServlet的源代碼,在本地更改編譯成功后將class文件覆蓋到org.eclipse.equinox.jsp.jasper_*.jar中)

          添加以下方法:
              public ClassLoader getJspLoader()
              {
                  return this.jspLoader;
              }

          如此即可^_^, 其實就是讓FacesServlet使用JspServlet的ClassLoader,這樣就不會出現"Can't find FacesContext"錯誤了。

          參考: [news.eclipse.technology.equinox] JSF, Equinox & FactoryFinder



          版權所有 羅明
          posted on 2007-10-08 15:05 羅明 閱讀(4066) 評論(25)  編輯  收藏 所屬分類: JavaOSGiJSF
          Comments
          • # re: 讓OSGi支持JSF Web開發
            Yu Liu
            Posted @ 2008-01-24 01:30
            請問,我就是按照您這個帖子所說的做的,為什么jsf的組件沒有顯示出來呢,問題有可能在哪里呢? 我沒有用facese config的配置,問題應該不是這里吧  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            羅明
            Posted @ 2008-01-24 09:25
            你加上faces-config.xml再試試,應該要這個配置文件的  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            Yu Liu
            Posted @ 2008-01-24 18:01
            謝謝答復! 請問你手頭有沒有可以運行的jsf和osgi的小例子,有能夠發給我一份嗎? 這是我的信箱 dogwood.liu@gmail.com  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            Yu Liu
            Posted @ 2008-01-24 21:01
            我定義了配置文件,頁面能被osgi正確找到,可是組建還是顯示不出來,就是一個空白的頁,非jsf的組建能夠顯示出來,jsf的不行。另外配置文件應該放在哪個目錄呢,我房子和jsf文件的同一個目錄沒用啊  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            羅明
            Posted @ 2008-01-24 22:43
            把demo發給你了,你看看里面的目錄結構  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            Yu Liu
            Posted @ 2008-01-25 09:33
            謝謝啊! 我看了你那個demo的文件結構了,好像不能夠直接運行。我自己按照你那樣的目錄結構弄了一個,但是運行的時候找不到 faceservlet 或者 configlistener. 很是奇怪,我編譯的時候沒事,但是運行的時候不行,我已經把我自己弄得那個plugin發給你了,不知道你有沒有時間看看,我哪里配置的不對  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            Yu Liu
            Posted @ 2008-01-25 11:30
            請問你用不用 qq msn 或者 googletalk 什么的,有些問題想在線請教一下  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            羅明
            Posted @ 2008-01-25 15:04
            都用,頁面上有三個的聯系方式  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            lmr
            Posted @ 2008-03-03 10:43
            能否發給我一份
            lialiks@163.com
            謝謝  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            gembin
            Posted @ 2008-05-25 18:20
            給我發1份Demo,急需阿,十分感謝!!gembin@gmail.com
            請問如何讓JBoss的Ajax4JSF,RichFaces運行在OSGi 環境下  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            傳奇世界私服
            Posted @ 2008-05-31 10:44
            4968  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            傳世私服
            Posted @ 2008-05-31 10:44
            6125  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            魔獸世界私服
            Posted @ 2008-05-31 10:44
            1315  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            魔獸世界私服
            Posted @ 2008-05-31 10:44
            9608  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            魔獸世界私服
            Posted @ 2008-05-31 10:47
            7313  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            魔獸世界私服
            Posted @ 2008-05-31 10:47
            7655  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            魔獸世界私服
            Posted @ 2008-05-31 10:48
            3423  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            魔獸世界私服
            Posted @ 2008-05-31 10:48
            6475  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            魔獸世界私服
            Posted @ 2008-05-31 10:48
            7937  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            魔獸世界私服
            Posted @ 2008-05-31 10:48
            0480  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            魔獸世界私服
            Posted @ 2008-05-31 10:48
            9379  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            魔獸世界私服
            Posted @ 2008-05-31 10:48
            2937  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            魔獸世界私服
            Posted @ 2008-05-31 10:49
            0665  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            魔獸世界私服
            Posted @ 2008-05-31 10:49
            3271  回復  更多評論   
          • # re: 讓OSGi支持JSF Web開發
            魔獸世界私服
            Posted @ 2008-05-31 10:49
            1268  回復  更多評論   
           
          主站蜘蛛池模板: 扶风县| 灵石县| 万宁市| 高雄市| 万源市| 苏州市| 永胜县| 江都市| 四子王旗| 杭锦后旗| 安徽省| 天镇县| 高淳县| 准格尔旗| 多伦县| 边坝县| 花垣县| 浠水县| 葫芦岛市| 常州市| 石嘴山市| 眉山市| 抚远县| 贡觉县| 吉林省| 大渡口区| 靖安县| 大姚县| 天台县| 商水县| 五家渠市| 汪清县| 青阳县| 嘉禾县| 礼泉县| 左贡县| 兴仁县| 克什克腾旗| 仁布县| 昌图县| 普陀区|