`
qq38450529
  • 浏览: 27951 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Virgo与Maven整合开发环境搭建(四)

    博客分类:
  • OSGI
阅读更多

               4.web

                     接下来是这次demo的另一个bundle.而且是个拥有spring-mvc能力的web-bundle(WAB).先来看一下结构

                       首先来看一下web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns="http://java.sun.com/xml/ns/javaee"
		xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
		xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
		version="2.5">

	<display-name>Search Web Module</display-name>

	<servlet>
		<servlet-name>search</servlet-name>
    	<servlet-class>org.phantom.web.virgo.servlet.DispatcherServlet</servlet-class>
    	<init-param>
    		<param-name>contextClass</param-name>
    		<param-value>org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext</param-value>
    	</init-param>
	</servlet>

	<servlet-mapping>
		<servlet-name>search</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
</web-app>

                      在这个demo中,我们使用的是Spring-MVC,所以,这里加入Spring-MVC支持.这里用到了一个自定义扩展类org.phantom.web.virgo.servlet.DispatcherServlet。说明一下这个类的作用。在OSGI中,每个bundle都是独立的,它拥有独立的ClassLoad,独立的Spring ApplicationContext.但是我们要通过spring从一个bundle中获取另一个bundle的服务,即我们需要这些applicationContext互相认识.怎么做到呢?virgo对这事做了支持.它提供了一个类org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext.这个类就相当于一个OSGI全局的applicationContext.我们这里就是要将这个类注入到Spring-MVC的DispatcherServlet中.这里通过扩展默认的DispatcherServlet来达到目的

public class DispatcherServlet extends org.springframework.web.servlet.DispatcherServlet{
	@Override
	public void init(ServletConfig config) throws ServletException {
		String contextClass = config.getInitParameter("contextClass");
		if (contextClass != null) {
			try {
				setContextClass(Class.forName(contextClass));
			} catch (ClassNotFoundException e) {
				throw new ServletException(String.format("Context class %s not found", contextClass), e);
			}
		}
		super.init(config);
	}
}
                    然后来看一下OSGI描述.
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: search web module
Bundle-SymbolicName: org.phantom.demo.web
Bundle-Version: 1.0.0.SNAPSHOT
Import-Template: org.springframework.*;version="[3.0.5,4)"
Import-Package: org.springframework.context.config;version="[3.0.5,4)",
 org.springframework.web.servlet.config;version="[3.0.5,4)"
Excluded-Imports: org.phantom.demo.web
Snap-Host: org.phantom.demo.host;version="1.0.0.SNAPSHOT"
Snap-ContextPath: /search
                    这里要介绍Snap-ContextPath:/search.前文已经介绍过Host-Snap,这一句配置就是配置当前bundle的请求路径,即第二级路径.还有一句Snap-Host:org.org.phantom.demo.host.这句配置将当前snap挂载到了某个host上.于是,根据前文的介绍,当进入到/demo后,SnapHostFilter开始工作,拿到请求的第二级/search,分发到当前bundle.     
                    接下来的配置就是Spring-MVC的配置了.在WEB-INF/创建与DispatcherServlet同名的search-servlet.xml即可
<?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:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:util="http://www.springframework.org/schema/utils"
	xmlns:osgi="http://www.springframework.org/schema/osgi"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd">

	<context:component-scan base-package="org.phantom.demo.web" />
	<mvc:annotation-driven/>
	
	<mvc:resources location="/" mapping="*.html"/>
	<mvc:resources location="/resources/" mapping="/resources/**" />

	<osgi:reference id="pictureSearch" interface="org.phantom.demo.api.SearchHandler" bean-name="pictureSearch"/>
 </beans> 
 
                     一句句解释一下.第一句,打开包扫描,将Controller加入到Spring管理中
<context:component-scan base-package="org.phantom.demo.web" />

                     接下来打开mvc的支持.将一些Spring-MVC默认的View、Convertor加入进来。

<mvc:annotation-driven/>

                     后面两句,是对一些静态资源放行的配置,因为我们servlet的拦截模式是/*,所以,静态资源直接放行

	<mvc:resources location="/" mapping="*.html"/>
	<mvc:resources location="/resources/" mapping="/resources/**" />

                      这句就是通过Spring-DM获取一个OSGI服务的配置.这里我们只获取图片搜索的实现,MP3的我们留在后续章节,用来说明OSGI的动态性如何体现.

<osgi:reference id="pictureSearch" interface="org.phantom.demo.api.SearchHandler" bean-name="pictureSearch"/>

                       同样,我们与普通OSGI进行一下对比.在普通OSGI中,想要或者一个服务如何编写

		try {
			SearchHandler handler = null;
			ServiceReference<SearchHandler>[] srs = (ServiceReference<SearchHandler>[]) bundleContext.getServiceReferences(SearchHandler.class.getName(),"(bean-name='picutreSearch')");
			if(srs!=null && srs.length>0)
				handler = bundleContext.getService(srs[0]);
			
		} catch (InvalidSyntaxException e) {
			e.printStackTrace();
		}

                     最后来看一下Controller如何编写

package org.phantom.demo.web;

import java.util.List;

import javax.annotation.Resource;

import org.phantom.demo.api.SearchBean;
import org.phantom.demo.api.SearchHandler;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/_s")
public class SearchController {

	@Resource
	private SearchHandler handler = null;

	@RequestMapping(method = RequestMethod.GET)
	public ResponseEntity<List<? extends SearchBean>> doSearch(String key) {
		List<? extends SearchBean> list = handler.doSearch(key);
		return new ResponseEntity<List<? extends SearchBean>>(list, HttpStatus.OK);
	}
}

                     在Controller中,将获取到的服务注入进来.

       @Resource
	private SearchHandler handler = null;

                      ok,然后编写一个很简单的页面.点击按钮发送请求页面上发送一个get请求到Controller,Controller调用service完成整个流程.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="../resources/jquery-1.6.min.js"></script>
<script type="text/javascript">
$(function(){
$(":button").click(function(){
	$.ajax({
		url:'_s',
		type:'get',
		data:{key:$(":text").val()},
		success:function(result){
			alert(result);
		}
	});
});
});
</script>
</head>
<body>
<input/><input type="button" value="search"/>
</body>
</html>

                     所有bundle开发完后,按照依赖关系,依次执行mvn install安装到本地maven仓库.之前已经配置了maven仓库与virgo关联.所以这种开发流程基本是:开发完—install—启动virgo.

                     然后到${virgo_home}/pickup/新建一个plan,即一次部署计划.

<?xml version="1.0" encoding="UTF-8"?>
<plan name="com.faben.demo.plan" version="1.0.0.SNAPSHOT" scoped="false" atomic="false"
        xmlns="http://www.eclipse.org/virgo/schema/plan"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="
                        http://www.eclipse.org/virgo/schema/plan 
                        http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">

        <artifact type="bundle" name="org.phantom.demo.host" version="1.0.0.SNAPSHOT"/>
        <artifact type="bundle" name="org.phantom.demo.web" version="1.0.0.SNAPSHOT"/>
        <artifact type="bundle" name="org.phantom.demo.search.picture" version="1.0.0.SNAPSHOT"/>
</plan>

                      部署计划中只需要写实现包和web包,被依赖的包比如api不用写,Virgo会根据MANIFEST.MF中的依赖定义,在maven库中找到api并加载.

                     做完这些后,启动virgo,访问http://localhost:8080/demo/search/index.html.

                  点击按钮,通过firebug查看请求和返回的数据

 
 

  • 大小: 71.9 KB
  • 大小: 33.6 KB
  • 大小: 118.9 KB
分享到:
评论
13 楼 qq38450529 2015-11-13  
https://git.oschina.net/agilest/phantom.git
12 楼 pandge 2014-07-30  
楼主,我在配置的时候遇到了不少的问题,其中一项在配置父项pom.xml文件的时候,提示:
Plugin execution not covered by lifecycle configuration: org.eclipse.virgo.bundlor:org.eclipse.virgo.bundlor.maven:1.1.2.RELEASE:bundlor (execution: bundlor,
phase: compile)错误,因为现在1.1.1的版本在maven的远程库没有了,就换成1.1.2了,所以不知道这个execution的配置在1.1.2中是不是取消了,另外麻烦兄弟能不能把你的源码发给我一份参考学习下,谢谢!我的邮箱pandge_aostar@126.com
11 楼 baiweiyll 2014-06-09  
楼主,能否发我一份,目前也正在学习。
baiweiyll@gmail.com
10 楼 Likeaboy_fire 2014-05-16  
楼主,能否share一下源码参考一下,我的邮箱jrocky.wang@gmail.com,谢谢啦~
9 楼 gadbee5 2014-04-29  
楼主,最近也在看osgi,能提供下源码给我参考下吗,邮箱:yiying5@163.com。谢谢了
8 楼 longxiaoyan 2014-02-26  
楼主,给我一份源码参考一下。邮箱:385871586@qq.com  谢谢。
7 楼 bravin 2014-01-22  
邮箱是 langzibravin@gmail.com
6 楼 bravin 2014-01-22  
楼主,能发给这个示例的代码学习膜拜下不?
5 楼 qq38450529 2014-01-09  
d3005522hill 写道
兄弟能把提供个代码下载不?

留个邮箱,我发给你
4 楼 qq38450529 2014-01-09  
lelessz 写道
自定义的 DispatcherServlet 在template.mf里不需要配置么?

我这里运行 报错 说找不到 org.phantom.web.virgo.servlet.DispatcherServlet 这个类~

不需要配置到template.mf中,"org.phantom.web.virgo.servlet"这个包会被bundlor扫描到,自动加入到最后生成的MANIFEST.MF中

哪个类你写了没?
3 楼 d3005522hill 2013-12-23  
兄弟能把提供个代码下载不?
2 楼 qq38450529 2013-09-27  
lelessz 写道
自定义的 DispatcherServlet 在template.mf里不需要配置么?

我这里运行 报错 说找不到 org.phantom.web.virgo.servlet.DispatcherServlet 这个类~

这个我自己封装的.代码贴出来了,你可以自己封装一下.只是需要重写默认的init方法
1 楼 lelessz 2013-09-18  
自定义的 DispatcherServlet 在template.mf里不需要配置么?

我这里运行 报错 说找不到 org.phantom.web.virgo.servlet.DispatcherServlet 这个类~

相关推荐

    基于virgo环境的OSGI+Maven的web开发代码下载(spring+hibernate+GWT)

    标题中的“基于virgo环境的OSGI+Maven的web开发代码下载”表明这是一个使用OSGi(模块化Java系统)和Maven构建的Web应用程序项目,运行在Virgo服务器上。Virgo是SpringSource推出的一个OSGi应用服务器,它支持Spring...

    学位论文-—基于virgoserver进行springosgiweb开发.doc

    基于VirgoServer进行Spring Osgi Web开发需要配置VirgoServer开发环境,使用Maven和Eclipse Virgo Tools,创建Bundle Project,并配置Spring配置文件。同时,需要实现Servlet类,用于处理请求,并配置classpath和...

    virgo server

    在Virgo Server中,开发者可以利用Maven的生命周期和插件机制来构建、部署和管理OSGi模块,这大大简化了在Virgo环境中开发和部署应用的工作流程。 在"virgo-tomcat-server-3.5.0.RELEASE"这个压缩包中,包含了Virgo...

    基于VirgoServer进行Spring Osgi Web开发

    首先,我们需要确保拥有正确的开发环境和工具,包括Spring Tool Suite (STS),Maven插件,以及Eclipse Virgo Tools插件。 **一、开发工具** 1. **Spring Tool Suite (STS)**: 这是一个基于Eclipse的集成开发环境,...

    virgo编程手册.pdf

    - **集成开发环境(IDE)集成**:Virgo与Eclipse等主流IDE的深度集成,使得开发者可以轻松地进行调试、测试和部署。手册提供了详细的步骤指导,帮助用户快速上手。 - **库和库供应**:Virgo支持通过各种渠道自动...

    最新virgo开发文档

    通过阅读"最新Virgo开发文档",开发者可以全面掌握Virgo的使用方法,提升在OSGi环境中构建和管理服务的能力。这份文档会详细阐述上述各个知识点,并提供实例和指导,帮助开发者快速上手并熟练运用Virgo进行开发工作...

    virgo-plan-maven-plugin

    Maven 插件,它根据项目直接依赖(忽略瞬态依赖)生成 Virgo 计划 XML。 示例配置: 使用“计划”项目打包 &lt;groupId&gt;group &lt;artifactId&gt;artifact &lt;version&gt;0.0.1-SNAPSHOT &lt;packaging&gt;plan &lt;groupId&gt;...

    最新virgo-tomcat-server

    这个版本包含了Virgo服务器的核心组件,可能包括了配置文件、管理工具、OSGi运行时环境以及与Tomcat的集成模块。用户可以通过解压这个文件,然后按照官方文档的指引在本地环境中安装和配置Virgo服务器,以便在Apache...

    virgo中添加hibernate需要的库

    Virgo,全称为OSGi Enterprise Platform,是SpringSource推出的一款基于OSGi规范的应用服务器,旨在为开发和部署企业级应用程序提供一个模块化、可扩展的平台。而Hibernate,则是一款流行的Java ORM(对象关系映射)...

    最新virgo-jetty-server

    【最新virgo-jetty-server】是一款专为Jetty设计的Virgo服务器,它提供了一种高效、可扩展的运行环境,使得基于Java技术的应用能够快速部署和管理。Virgo服务器是SpringSource公司(现已被VMware收购)开发的一款轻...

    virgo-bin包

    "Virgo-Bin" 包,正如其名,是一个与Virgo相关的二进制软件包。Virgo项目,源自SpringSource,是...在实际工作中,熟悉Virgo服务器的工作原理和配置,以及如何与之交互,对于提升开发效率和系统稳定性具有重要意义。

    virgo-web-server

    "Virgo Web Server" 是一个基于Java平台的轻量级应用服务器,主要由SpringSource团队开发,后来成为VMware(现为Dell Technologies的一部分)的一部分。这个服务器是为运行Spring框架的应用程序而设计的,特别关注高...

    virgo分屏.zip

    总的来说,Virgo分屏软件以其实用性和易用性,成为了办公环境中的一款神器。通过合理利用这款工具,用户可以更好地组织和优化工作流程,提高生产力。无论是在日常办公还是专业项目中,Virgo都能提供强大的支持,让多...

    virgo programmer guide

    以下将对Virgo的核心概念、功能、开发与部署流程进行深入解析。 1. Virgo概述: Virgo是由SpringSource公司开发的轻量级应用服务器,它基于OSGi(开放服务网关规范)框架,提供了一个模块化的运行环境,允许开发者...

    基于VirgoServer进行Spring Osgi Web开发(示例代码)

    在IT行业中,Spring OSGi(Open Service Gateway Initiative)是一种模块化开发的框架,它将Spring框架与OSGi服务架构相结合,为Web应用程序提供了一种更灵活、可扩展的开发方式。VirgoServer是Pivotal公司推出的一...

Global site tag (gtag.js) - Google Analytics