天天看点

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

关于本文

本文记录了将Spring Web Application应用到OSGI环境中,也就是OSGI Web应用。

[请点击这里下载本文的Eclipse工程]

org.phrancol.osgi.demo.launcher工程中启动应用。

一、准备工作

1,JDK 1.5

2,Eclipse 3.3-jee (MyEclipse)

3,Spring-framework-2.1-m3

4,Spring-osgi-1.0-m2

二、搭建环境

1,首先当然需要一个Http Server,那就用Eclipse自带的Jetty吧。

2,将Jetty和它的依赖包作为 Plugin 工程导入Eclipse,  Import -> Plug-ins and fragments -> Next

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

 3,创建一个普通工程做为Eclipse Launch的存放目录 org.phrancol.osgi.demo.launcher

 4,Open Run Dialog ... -> OSGI Framework -> New Configuration ,名字改为org.phrancol.osgi.demo.web.launcher,在

Common面板Save as 里面的 Shared file指定目录到 org.phrancol.osgi.demo.launcher

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

5,Apply,  Run ,可以看到一个Launch已经生成,通过Console可以看到Jetty也成功启动

6,在OSGI输入exit退出,(注:如果不退出,那么它将驻留内存,大概会消耗20K的内存)

三、Equinox/Spring-osgi环境

导入Spring-osgi和它的依赖包(注:导入Spring包的时候,plug-in Location 要指定Spring-osgi的lib目录),导入完毕后,形成的project结构如下图

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

四、jpetstore

使用Spring自带的jpetstore,代码和配置文件都是现成的,能省去一些不必要的开发。

五、首页

jpetstore默认是springmvc,向HttpService注册Servlet或是Resource,jpetstore里面需要注册的servlet就是ContextLoaderServlet和DispatcherServlet,resource则是view层的jsp等。

1,创建个plug-in project ,OSGI Framework选择Equinox,创建Activator,org.phrancol.osgi.jpetstore.springmvc

2,创建一个web目录,这个目录就是web应用的目录,将jpetstore里面的WEB-INF/jsp目录拷贝进去

3,在 META-INF 目录中创建 dispatcher 目录,将petstore-servlet.xml拷贝进去,修改成如下代码

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

<? xml version="1.0" encoding="UTF-8"  ?>

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" >

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

<!--

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

  - DispatcherServlet application context for the Spring web MVC

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

  - implementation of JPetStore's web tier.

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

   -->

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

< beans >

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

     <!--  ========================= VIEW DEFINITIONS =========================  -->

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

     < bean  id ="viewResolver"  class ="org.springframework.web.servlet.view.InternalResourceViewResolver" >

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

         < property  name ="viewClass"  value ="org.springframework.web.servlet.view.JstlView" />

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

         < property  name ="prefix"  value ="/web/jsp/spring/" />

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

         < property  name ="suffix"  value =".jsp" />

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

     </ bean >

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

     <!--  ========================= DEFINITIONS OF PUBLIC CONTROLLERS =========================  -->

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

     < bean  id ="defaultHandlerMapping"  class ="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

     < bean  name ="/shop/index.do"  class ="org.springframework.web.servlet.mvc.ParameterizableViewController" >

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

         < property  name ="viewName"  value ="index" />

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

     </ bean >

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

</ beans >

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

4,在Activator的start(BundleContext context)里面注册servlet和resource,代码如下

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

public   void  start(BundleContext context)  throws  Exception 

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

{

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

        ServiceReference sr = context.getServiceReference(HttpService.class

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

                .getName());

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

        HttpService httpService = (HttpService) context.getService(sr);

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

        httpService.registerResources("/", "/web", null);

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

        httpService.registerServlet("/*.jsp", new JspServlet(context

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

                .getBundle(), "/web/jsp"), null, null);

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

        Dictionary<String, String> initparams = new Hashtable<String, String>();

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

        initparams.put("load-on-startup", "1");

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

        DispatcherServlet dispatcherServlet = new DispatcherServlet();

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

        dispatcherServlet

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

                .setContextConfigLocation("META-INF/dispatcher/petstore-servlet.xml");

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

        initparams = new Hashtable<String, String>();

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

        initparams.put("servlet-name", "petstore");

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

        initparams.put("load-on-startup", "2");

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

        httpService.registerServlet("/*.do", dispatcherServlet, initparams,

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

                null);

Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1

    }

注意依赖包关系

启动后,在访问http://localhost/shop/index.do页面,报错,看来要解决一下标签库问题,在web目录中建立一个WEB-INF目录,将c.tld, fmt.tld拷贝进去,然后在osgi控制台refresh springmvc,再访问这个页面,发现没有图片,把jpetstore/images目录拷贝到web目录下,再refresh一下,OK,首页出来了。

六、结束语

 这部分简单记录了如何使用springmvc,下部分将记录如何将jpetstore的各个层通过spring-osgi应用起来

继续阅读