`
huihua
  • 浏览: 62633 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

基于插件开发模式的WEB开发

阅读更多
1、通过ServletBridge把OSGI框架部署到Tomcat容器中去。
程序文件整体结构图如下:
2、通过一个runtime插件把相关需要启动的插件启动起来。
3、在config.ini文件中配置runtime插件在OSGI启动时即启动。
4、利用WebServiceExporter类来注册WebService服务
5、CXFNonSpringServlet类是用来提供Servlet监听
6、Spring通过插件形式集成到框架中来。
分享到:
评论
19 楼 neora 2009-05-04  
有想法。但实用性还没想到阿....
18 楼 cucumber 2009-05-04  
一起关注界面的问题
17 楼 whaosoft 2009-05-04  
呃 我都没听说过呢
是你自己写的??
16 楼 yimlin 2009-05-04  
我想知道你的ui层如何组件化的。
osgi固然不错,不过在传统web开发,涉及到界面层。
比如部署A组件,将在b组件的界面上多一个连接,按钮以及内容;
在复杂些还涉及到权限相关,不同权限用户访问同一界面,所看到结果是不同的;

过往处理这些内容,无非是学osgi手段,搞些个扩展点。
15 楼 daquan198163 2009-05-04  
huihua 写道
youmargin 写道
请问是否有过实际的项目应用,性能如何?

已经在实际的项目中应用,性能不错。 最重要的是解耦性特别好。

解了什么耦? 得到了哪些具体的好处?
对于像IDE这样的东西采用OSGI是很自然的——只加载需要的模块以提高启动速度,
但是企业应用并不在乎应用的启动速度,这个好处变得无关紧要了。
14 楼 pior 2009-05-04  
合着是把WebServices又封装了一层`
13 楼 phoenixup 2009-05-04  
关注,如果楼主能搞一个简单的Demo,效果更好一些~~~~
12 楼 tutu1982 2009-05-04  

希望能提供更多信息
11 楼 plavip 2009-05-04  
能不能提供一下demo
10 楼 huihua 2009-05-04  
youmargin 写道
请问是否有过实际的项目应用,性能如何?

已经在实际的项目中应用,性能不错。 最重要的是解耦性特别好。
9 楼 youmargin 2009-05-04  
请问是否有过实际的项目应用,性能如何?
8 楼 huihua 2009-05-04  
说明一下:
1、由于不能上传附件(主要是因为公司信息安全限制),所以demo无法传,对于新手很抱歉,但是希望对于那些正在研究如何进行插件开发的人有点帮助。
2、带有***的插件都是我自己写的插件包。
3、我们的项目服务端没有UI,所以没有太多考虑服务端UI的事情,但是我细想了一下,应该可以集成到这里面的,大家可以补充一下,共同学习。
4、我们的项目服务端暂时只提供SOAP服务。所有的界面都在客户端,客户端是RCP
7 楼 huihua 2009-05-04  
Spring配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:osgi="http://www.springframework.org/schema/osgi"
	xsi:schemaLocation="
  http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/osgi
  http://www.springframework.org/schema/osgi/spring-osgi.xsd">

	 
	<!-- define service bean -->
	<bean id="IProjMgrServiceClient" class="com.***.***.server.pm.service.impl.ProjMgrServiceClientImpl" />
	<bean class="com.***.***.server.cxfbundle.server.WebServiceExporter">
		<property name="address" value="projmgr" />
		<property name="serviceImplBean" ref="IProjMgrServiceClient" />
		<property name="serviceInterface"
			value="com.***.***.server.pm.service.IProjMgrServiceClient" />
	</bean>
	
	
	<bean id="ILoginOnline" class="com.***.***.server.security.login.impls.LoginOnlineImpl" />
	<bean class="com.***.***.server.cxfbundle.server.WebServiceExporter">
		<property name="address" value="login" />
		<property name="serviceImplBean" ref="ILoginOnline" />
		<property name="serviceInterface"
			value="com.***.***.server.security.login.interfaces.ILoginOnline" />
	</bean>
</beans>
6 楼 huihua 2009-05-04  
CXFWrapperServlet.java内容

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;

import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.transport.servlet.CXFNonSpringServlet;

public class CXFWrapperServlet extends CXFNonSpringServlet
{
    private static final long serialVersionUID = -6994879522066465447L;

    private static Map<String, Bus> busMap = new HashMap<String, Bus>();

    public void init(ServletConfig servletConfig) throws ServletException
    {
        super.init(servletConfig);
        busMap.put("servletBus", getBus());
        Bus bus = CXFWrapperServlet.getMyBus("servletBus");
        BusFactory.setDefaultBus(bus);
    }

    @Override
    public void loadBus(ServletConfig servletConfig) throws ServletException
    {
        this.bus = BusFactory.getDefaultBus(true);
        super.loadBus(servletConfig);
    }

    public static Bus getMyBus(String key)
    {
        return busMap.get(key);
    }
}
5 楼 huihua 2009-05-04  
WebServiceExporter.java内容:
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.springframework.beans.factory.InitializingBean;

public class WebServiceExporter implements InitializingBean
{
    // URL访问地址
    private String address = null;

    // Service接口的实现类对象
    private Object serviceImplBean = null;

    // Service接口
    private Class< ? > serviceInterface = null;

    public void afterPropertiesSet() throws Exception
    {
        /**
         * 检查参数的合法性
         */
        checkServiceInterface();

        ServerFactoryBean factory = new ServerFactoryBean();
        factory.setServiceClass(serviceInterface);
        factory.setServiceBean(serviceImplBean);
        factory.setAddress(address);
        factory.getServiceFactory().setDataBinding(new JAXBDataBinding());
        // System.out.println("Address : " + address);
        factory.create();
    }

    /**
     * Check whether a service reference has been set, and whether it matches
     * the specified service.
     * @see #setServiceInterface
     * @see #setService
     * @throws IllegalArgumentException
     *             IllegalArgumentException
     */
    private void checkServiceInterface() throws Exception
    {
        if (serviceInterface == null)
        {
            throw new Exception("Property 'serviceInterface' is required");
        }
        if (serviceImplBean instanceof String)
        {
            throw new Exception(
                    "Service ["
                            + serviceImplBean
                            + "] is a String "
                            + "rather than an actual service reference: Have you accidentally specified "
                            + "the service bean name as value instead of as reference?");
        }
        if (!serviceInterface.isInstance(serviceImplBean))
        {
            throw new Exception("Service interface ["
                    + serviceInterface.getName()
                    + "] needs to be implemented by service ["
                    + serviceImplBean + "] of class ["
                    + serviceImplBean.getClass().getName() + "]");
        }
    }

    public void setAddress(String address)
    {
        if (address.startsWith("/"))
        {
            this.address = address;
        }
        else
        {
            this.address = "/" + address;
        }
    }

    public void setServiceInterface(Class< ? > serviceInterface)
    {
        this.serviceInterface = serviceInterface;
    }

    public void setServiceImplBean(Object serviceImplBean)
    {
        this.serviceImplBean = serviceImplBean;
    }
}
4 楼 huihua 2009-05-04  
runtime插件(该插件也就只有一个java程序)的Activator.java内容:


import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

    private static final String SPRING_CONFIG_PATH = "/META-INF/spring";
    private static final String BUNDLE_ACTIVATOR = "Bundle-Activator";

//    private static Log log = LogFactory.getLog(Activator.class);
    
	/*
	 * (non-Javadoc)
	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
	 */
	public void start(BundleContext context) throws Exception {
        // get this bundle
        Bundle thisBundle = context.getBundle();
        
        // get all bundles
        Bundle[] bundles = context.getBundles();

        // for each bundle except this bundle
        for (Bundle bundle : bundles)
        {
            // if bundle can be start
            if (thisBundle != bundle && canBeStart(bundle))
            {
                startBundle(bundle);
            }
        }
	}

    private void startBundle(Bundle bundle)
    {
        // start the bundle
        try
        {
            bundle.start();
        }
        catch (Exception e)
        {
//            log.error("start bundle " + bundle.getSymbolicName() + " failed", e);
        	System.out.println("start bundle " + bundle.getSymbolicName() + " failed.");
        	System.out.println(e.toString());
        }
    }

    private boolean canBeStart(Bundle bundle)
    {
        // if bundle is ready to start
        if (bundle.getState() == Bundle.RESOLVED
                || bundle.getState() == Bundle.STARTING
                || bundle.getState() == Bundle.INSTALLED)
        {
            // start bundle if bundle activator is set
            if (bundle.getHeaders().get(BUNDLE_ACTIVATOR) != null)
            {
                return true;
            }
            // start bundle if it is spring powered
            else if (bundle.getEntry(SPRING_CONFIG_PATH) != null)
            {
                return true;
            }
        }

        return false;
    }
    
	/*
	 * (non-Javadoc)
	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
	 */
	public void stop(BundleContext context) throws Exception {
	}

}
3 楼 huihua 2009-05-04  
config.ini内容:
#
# initial bundles
#
osgi.bundles=\
org.eclipse.equinox.common@2:start, \
org.eclipse.update.configurator@3:start, \
com.xxx.xxx.server.runtime@start

#
# start level
#
osgi.bundles.defaultStartLevel=4

--------------------

launch.in内容
# Eclipse Runtime Configuration Overrides
# These properties are loaded prior to starting the framework and can also be used to override System Properties
# @null is a special value used to override and clear the framework's copy of a System Property prior to starting the framework
# "*" can be used together with @null to clear System Properties that match a prefix name.

osgi.*=@null
org.osgi.*=@null
eclipse.*=@null

osgi.parentClassloader=ext
osgi.contextClassLoaderParent=ext


2 楼 huihua 2009-05-04  
web.xml内容
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<servlet>
		<servlet-name>equinoxbridgeservlet</servlet-name>
		<servlet-class>org.eclipse.equinox.servletbridge.BridgeServlet</servlet-class>
		<init-param>
			<param-name>enableFrameworkControls</param-name>
			<param-value>false</param-value>
		</init-param>
		<init-param>
			<param-name>commandline</param-name>
			<param-value>-console</param-value>
		</init-param>
		<init-param>
			<param-name>extendedFrameworkExports</param-name>
			<param-value></param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>equinoxbridgeservlet</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
</web-app>
1 楼 huihua 2009-05-04  
程序结构图:
Application.war
|-index.jsp
|-WEB-INF
    |-classes
    |-eclipse
    |   |-configuration
    |   |   |-config.ini
    |   |-plugins
    |   |   |-com.**.***.***_1.0.0.jar
    |   |   |-com.***.***.server.cxfbundle_1.0.0.jar
    |   |   |-com.***.***.server.runtime_1.0.0.jar
    |   |   |-com.springsource.net.sf.cglib-2.1.3.jar
    |   |   |-com.springsource.org.aopalliance-1.0.0.jar
    |   |   |-com.springsource.slf4j.api-1.5.0.jar
    |   |   |-com.springsource.slf4j.log4j-1.5.0.jar
    |   |   |-com.springsource.slf4j.org.apache.commons.logging-1.5.0.jar
    |   |   |-log4j.osgi-1.2.15-SNAPSHOT.jar
    |   |   |-org.eclipse.equinox.common_3.4.0.v20080421-2006.jar
    |   |   |-org.eclipse.equinox.http.registry_1.0.100.v20080427-0830.jar
    |   |   |-org.eclipse.equinox.http.servlet_1.0.100.v20080427-0830.jar
    |   |   |-org.eclipse.equinox.http.servletbridge_1.0.0.v20080427-0830.jar
    |   |   |-org.eclipse.equinox.registry_3.4.0.v20080516-0950.jar
    |   |   |-org.eclipse.osgi_3.4.2.R34x_v20080826-1230.jar
    |   |   |-org.eclipse.update.configurator_3.2.201.R34x_v20080819.jar
    |   |   |-spring-aop-2.5.6.jar
    |   |   |-spring-beans-2.5.6.jar
    |   |   |-spring-context-2.5.6.jar
    |   |   |-spring-context-support-2.5.6.jar
    |   |   |-spring-core-2.5.6.jar
    |   |   |-spring-osgi-core-1.2.0-m2.jar
    |   |   |-spring-osgi-extender-1.2.0-m2.jar
    |   |   |-spring-osgi-io-1.2.0-m2.jar
    |   |-launch.ini
    |-lib
    |  |-servletbridge.jar
    |-web.xml

相关推荐

    海康威视摄像头WEB无插件开发包 V3.2(官方版本)

    "海康威视摄像头WEB无插件开发包 V3.2(官方版本)"是海康威视为开发者提供的一种高效、便捷的在线视频流处理工具,旨在帮助开发者在网页端实现对海康威视摄像头的实时监控功能,而无需依赖任何浏览器插件。...

    大华摄像头web3.0二次开发webplugin

    WebPlugin是基于浏览器的插件技术,用于在网页中嵌入特定的功能模块。在大华摄像头的场景下,WebPlugin提供了一个桥梁,将客户端的JavaScript代码与摄像头设备的底层功能对接,使开发者可以利用Web3.0的相关技术,如...

    百度地图插件,方便web开发

    在Web开发中,地图插件的应用非常广泛,用于展示地理位置信息、导航、定位等功能。这里我们关注的是一个基于百度地图API开发的插件,适用于快速集成地图功能到您的项目中。"百度地图插件,方便web开发"这个标题表明...

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

    本资源"《Eclipse核心编程:插件、界面与Web开发》"显然是针对那些希望深入理解Eclipse平台、创建自定义插件、设计用户界面以及进行Web开发的开发者准备的。 1. **Eclipse插件开发**: Eclipse的核心是其插件模型...

    阿里开发规范插件

    P3C插件基于Checkstyle工具,通过定义一系列规则来检查Java代码,包括但不限于命名规范、注释规范、设计模式、异常处理、空指针检查等多个方面。以下是一些重要的知识点: 1. **命名规范**:阿里的命名规范强调清晰...

    Python-FlaskPluginKit基于Flask的插件式开发工具

    Flask是一个轻量级的Python Web开发框架,以其简洁和灵活的设计理念深受开发者喜爱。然而,随着项目规模的扩大,代码组织和模块化变得至关重要。为了解决这个问题,`FlaskPluginKit`应运而生,它是一个用于构建基于...

    基于C++开发的WEB服务器,支持C/C++、Python、Java等多语言混合开发WEB应用

    "web开发框架":Web开发框架是预定义的代码库和工具,为开发者提供了一种结构化的开发方式,用于简化Web应用的构建。这里暗示了这个基于C++的Web服务器可能包含一个框架,用于帮助开发者更高效地组织和管理代码,...

    海康威视web控件开发包

    该开发包的核心部分是用于在Web页面上展示海康威视摄像头视频流的插件。这个插件基于ActiveX或NPAPI技术,能在主流的浏览器(如Internet Explorer、Firefox等)中运行,使得用户无需安装额外的客户端软件就能通过...

    路由器技术开发 插件开发

    路由器技术开发插件开发 路由器技术开发插件开发是指在路由器产品中集成插件开发技术,以实现路由器的插件化和模块化。路由器插件开发技术可以使路由器产品具有更高的灵活性和可扩展性,使其能够满足不同用户的需求...

    大华摄像头WEB无插件开发包

    1、WEB无插件开发包是基于标准HTML5技术开发,在不使用插件的情况下,为大华各类网络摄像机、球机、NVR等产品提供音视频播放二次开发服务。 2、该方案使用Websocket+RTSP/RTP推流,WASM解码方式进行音视频的解码...

    基于java web开发的购物商城项目源码

    "基于Java Web开发的购物商城项目源码"是指一个使用Java Web技术栈构建的在线购物平台的完整源代码。这个项目可能是为了帮助学生或开发者进行毕业设计或者作为小型项目的参考实例。 【描述解读】 描述中提到,这个...

    eclipse的AXIS插件(开发WebServices的)第二个

    Eclipse的AXIS插件是开发Web服务的重要工具,它为开发者提供了在Eclipse集成开发环境中创建、测试和部署Web服务的便利。本文将详细解析这个插件的使用及其核心功能,以及与AXIS相关的开发知识。 首先,AXIS是一个...

    Chrome基于REST的Web服务客户端插件.zip

    Chrome web标签表明该插件与Chrome浏览器的Web开发和扩展有关。在Web开发过程中,开发者经常需要与服务器进行交互,验证API的功能和性能,而这款插件正是为此目的而设计的。它简化了这个过程,使得开发者无需离开...

    Chrome插件开发完整教程

    4. 相比Firefox插件,Chrome插件开发更为简单,且可以跨平台运行,不仅在Chrome浏览器上,还能在基于WebKit内核的其他国产浏览器上运行。 开发Chrome插件并不需要特定的项目结构或IDE,只需保证根目录下有一个`...

    WEB开发模式:Mode I与Mode II

    在IT行业中,Web开发是构建基于互联网应用程序的关键领域。这里我们关注的是两种主要的Web开发模式:Mode I和Mode II。这两种模式对于理解和优化Java Web应用程序的开发流程至关重要。 首先,让我们深入理解“Web...

    magento模块组件或插件开发教程

    Magento采用的是MVC(Model-View-Controller)架构,这种设计模式在Web开发中广泛使用,它将业务逻辑、数据处理和用户界面分离,提高了代码的可维护性和复用性。此外,Magento还基于Zend Framework构建,利用其强大...

    基于Vue.js框架的Web前端开发工具的设计与实现

    伴随Web开发技术的不断发展,前后端分离开发逐渐成为主流的开发模式,前端开发在整个开发流程中越来越重要,前端开发工作早已不是编写几个简单的静态页面就可以完成的,前端除了需要展示美观的页面,还需要实现...

    Web3.0_控件开发包编程指南_20201102162751.pdf

    该开发包基于ActiveX和NPAPI技术开发,提供了封装于javascript脚本中的接口,使得开发者能够在网页上实现视频预览、回放、云台控制等功能。 **运行环境要求** 该控件开发包支持的操作系统包括Windows XP、Windows 7...

Global site tag (gtag.js) - Google Analytics