`
snoopy7713
  • 浏览: 1140930 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

让OSGi支持JSF Web开发

    博客分类:
  • OSGi
阅读更多

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"错误了。

分享到:
评论

相关推荐

    tutorial-osgi-jsf:包含来自 OSGi-JSF 教程的代码的存储库

    2. 集成JSF库:由于JSF本身并不直接支持OSGi,所以需要找到适合OSGi环境的JSF实现,例如Apache MyFaces或PrimeFaces的OSGi版本。 3. 编写JSF组件和应用:根据JSF的MVC模式,编写视图组件、控制器和业务逻辑。在OSGi...

    基于OSGi和Spring开发Web应用.doc

    "基于OSGi和Spring开发Web应用" OSGi(Open Service Gateway Initiative)是一种基于Java的服务_gateway_initiative,提供了一种动态模块部署的能力,使得企业级应用可以轻松地升级和维护。Spring是一个著名的轻量...

    Eclipse核心编程:插件、界面与Web开发

    Web开发是Eclipse支持的一个重要领域,Eclipse中有多个插件和工具来支持Web应用的构建,如Eclipse Web Tools Platform(WTP)。WTP提供了开发J2EE应用所需的各种工具和服务,包括对Servlet、JSP、JSF、Web Services...

    tk.eclipse.plugin.jsf_2.0.4.zip

    今天我们将深入探讨一款名为"tk.eclipse.plugin.jsf_2.0.4"的Eclipse插件,它专为JavaServer Faces(JSF)开发提供支持。 首先,我们要明确JSF是什么。JavaServer Faces(JSF)是Java平台上的一个标准的用户界面...

    java网络服务器wab app,个人网站服务器

    Eclipse中的Java EE版本包含了Web项目创建向导、内置服务器支持、自动代码完成、以及对JSP、Servlet、JSF等技术的集成,极大地简化了开发流程。 四、创建和运行WAB App 1. **新建项目**:在Eclipse中,选择"File" ...

    神兵利器——Eclipse开发技术详解(电子版)

    1. Web开发:通过WTP(Web Tools Platform)插件,Eclipse可以支持Servlet、JSP、JSF等Web开发。 2. Android开发:ADT(Android Developer Tools)插件使Eclipse成为Android应用开发的首选IDE。 3. Spring框架:...

    IDEA教程中文版。

    - **GWT**: 支持 GWT(Google Web Toolkit)的应用开发,包括代码提示、编译和组件开发等功能。 - **Hibernate**: 提供 Hibernate 框架的支持,包括代码提示和逆向工程等功能。 - **Java EE:Java Server Faces (JSF)...

    Eclipse精要与高级开发技术

    - **Web应用开发**:使用Eclipse进行Java EE项目开发,包括动态Web项目、EJB、JSF等。 - **服务器集成**:配置和管理各种应用服务器,如Tomcat、Jetty、WebLogic等。 9. **插件开发** - **OSGi基础**:Eclipse...

    WAS 8.5 Liberty学习笔记.pdf

    - WAS是完整的Java EE服务器,支持整个J2EE规范,而Liberty只支持Web、OSGi和Mobile应用开发。 - Liberty采用动态加载特性包的方式来提供Java EE支持,允许开发者根据需求动态地加载和卸载特定功能。 - Liberty与...

    myfaces-extcdi-jpa1-module-impl-1.0.6.zip

    【标题】"myfaces-extcdi-jpa1-module-impl-1.0.6.zip" 涉及的是一款开源项目中的模块实现,主要关注MyFaces扩展CDI(Contexts and...这两个开源项目可以为开发者提供在Java Web开发和OSGi环境下的便利工具和解决方案。

    Maven 的41种骨架功能介绍

    ### Maven的41种骨架功能介绍 Maven作为一款强大的构建工具,...无论是Web开发、插件开发还是特定技术栈的应用开发,Maven都能提供相应的支持。这对于提高开发效率、确保代码质量和项目的一致性都有着不可估量的价值。

    Spring 2.5 jar 所有开发包及完整文档及项目开发实例

     这个jar文件包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。 (12) spring-webmvc.jar  这个...

    Eclipse自学文档(PDF)

    最后,Eclipse还支持Web应用程序的开发,通过WTP(Web Tools Platform)项目,你可以使用Eclipse进行Java EE项目的开发,包括Servlet、JSP、JSF等技术。WTP提供了服务器配置、项目结构管理、部署工具等功能,是Web...

    javaEE6.zip

    将这些jar包导入到项目或放置到`lib`文件夹后,开发者可以利用Java EE 6提供的强大功能,如CDI、JSF、JPA等,高效地开发出可扩展、模块化的企业级Web应用。需要注意的是,为了确保项目正常运行,还需要配置合适的...

    各种在线api

    在IT行业,尤其是Web开发领域,API的应用极为广泛,它们能够帮助开发者高效地构建功能丰富且具有高度互操作性的应用。 ### Java Platform Enterprise Edition (Java EE) Java EE,也称为Jakarta EE,是Sun ...

    WebSphere_Application_Server_V6技术文档

    V6.1作为主要的升级版本,进一步加强了特性,例如支持J2EE 1.2、1.3、1.4规范,采用了JDK 1.4,基于J2EE 1.4标准的Web服务,增加了对JSF(JavaServer Faces)的支持,以及WS-Security和基本配置的支持。此外,还引入...

    eclipse(插件集成版)

    - **Web和企业开发插件**:如Web Tools Project (WTP) 支持Java EE应用的开发,包括Servlet、JSP、JSF等。 - **Git版本控制**:通常集成有EGit插件,方便开发者进行版本管理和协作。 4. **项目管理** - **项目...

Global site tag (gtag.js) - Google Analytics