<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Extreme Pattern: Hello Spring MVC and OSGi</title>
    <link>http://blog.extremepattern.com/articles/2006/11/08/hello-spring-mvc-and-osgi</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>enjoy</description>
    <item>
      <title>Hello Spring MVC and OSGi</title>
      <description>&lt;h3&gt;源起&lt;/h3&gt;


	&lt;p&gt;之前已經可以將物件利用 spring+hibernet 存放道資料庫，現要整合到一個網頁服務上，
所以需要練習一下 Spring &lt;span class="caps"&gt;MVC&lt;/span&gt; 的架構，並把 &lt;span class="caps"&gt;MVC&lt;/span&gt; 納入 haha.remix.spring 中。&lt;/p&gt;


	&lt;p&gt;預計將之前的 jpa 練習的 userdao 拿來注到 controller 之中，然後在網頁中簡單列出來。&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.springframework.org/osgi/specification"&gt;Spring OSGi Specification (v0.7) 2.5 Web application support&lt;/a&gt;&lt;/p&gt;


	&lt;h3&gt;結果&lt;/h3&gt;


	&lt;p&gt;瀏覽器開到 http://127.0.0.1/foo/index.html 可以看到資料庫輸出。&lt;/p&gt;


&lt;pre&gt;
osgi&amp;gt; ss

Framework is launched.

id    State       Bundle
0    ACTIVE      system.bundle_3.3.0.v20061101
5    ACTIVE      javax.servlet_2.4.0.200609281713
6    ACTIVE      javax.servlet.jsp_2.0.0.200610251427
7    ACTIVE      log4j_1.2.13
9    ACTIVE      org.apache.commons.logging_1.0.4
10    ACTIVE      org.eclipse.equinox.ds_1.0.0.v20060828
12    ACTIVE      org.eclipse.equinox.log_1.0.100.v20060717
13    ACTIVE      org.eclipse.osgi.services_3.1.100.v20060918
75    ACTIVE      org.apache.commons.el_1.0.0
76    ACTIVE      org.apache.jasper_5.5.17.200610251427
77    ACTIVE      org.eclipse.equinox.http.jetty_1.0.0.v20061012
78    ACTIVE      org.eclipse.equinox.http.servlet_1.0.0.v20061023
79    ACTIVE      org.eclipse.equinox.jsp.jasper_1.0.0.200610251427
80    ACTIVE      org.eclipse.equinox.jsp.jstl_1.0.0
81    ACTIVE      org.mortbay.jetty_5.1.11.200609281713
85    ACTIVE      haha.hello.jpa.userdao_1.0.0
87    ACTIVE      haha.remix.derby_1.0.0
88    ACTIVE      haha.remix.hibernate_1.0.0
94    ACTIVE      haha.hello.mvc.userdao_1.0.0
95    ACTIVE      haha.remix.spring_1.0.0
&lt;/pre&gt;

	&lt;h3&gt;haha.hello.mvc.userdao&lt;/h3&gt;


	&lt;p&gt;首先要先找到 HttpService 來用。&lt;/p&gt;


	&lt;p&gt;&lt;span class="caps"&gt;META&lt;/span&gt;-INF/spring/bean.xml&lt;/p&gt;


&lt;pre&gt;
&amp;lt;osgi:reference id="httpService" interface="org.osgi.service.http.HttpService"/&amp;gt;
&amp;lt;bean name="servletRegister" class="haha.hello.mvc.userdao.ServletRegister" init-method="init"&amp;gt;
   &amp;lt;property name="httpService" ref="httpService"/&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/pre&gt;

	&lt;p&gt;haha.hello.mvc.userdao.ServletRegister.java&lt;/p&gt;


&lt;pre&gt;
DispatcherServlet servlet = new DispatcherServlet();
servlet.setNamespace("foo-servlet");
OsgiWebApplicationContext owac = new OsgiWebApplicationContext();
servlet.setContextClass(owac.getClass());
httpService.registerServlet("/foo", servlet, null ,null);
&lt;/pre&gt;

	&lt;p&gt;&lt;span class="caps"&gt;WEB&lt;/span&gt;-INF/foo-servlet.xml&lt;/p&gt;


&lt;pre&gt;
&amp;lt;osgi:reference id="userDao" interface="haha.hello.jpa.userdao.UserDao"/&amp;gt;
&amp;lt;bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&amp;gt;
        &amp;lt;property name="mappings"&amp;gt;
            &amp;lt;value&amp;gt;
                /*.html=fooController
            &amp;lt;/value&amp;gt;
        &amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;
&amp;lt;bean id="fooController" 
      class="haha.hello.mvc.userdao.FooController"&amp;gt;
     &amp;lt;property name="userDao" ref="userDao"/&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/pre&gt; 

	&lt;p&gt;haha.hello.mvc.userdao.FooController.java&lt;/p&gt;


&lt;pre&gt;
PrintWriter out = res.getWriter();
Collection users = userDao.loadUsers();
int count = 0;
for (Iterator iter = users.iterator(); iter.hasNext();) {
 User user = (User) iter.next();            
 out.println("Hello, " + user.getName() + "&amp;lt;BR/&amp;gt;");
}
&lt;/pre&gt;

	&lt;p&gt;&lt;span class="caps"&gt;META&lt;/span&gt;-INF/MANIFEST.MF&lt;/p&gt;


&lt;pre&gt;
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: haha.hello.mvc.userdao
Bundle-SymbolicName: haha.hello.mvc.userdao
Bundle-Version: 1.0.0
Bundle-Activator: haha.hello.mvc.userdao.Activator
Bundle-Localization: plugin
Import-Package: haha.hello.jpa.userdao,
 javax.servlet;version="2.4.0",
 javax.servlet.http;version="2.4.0",
 org.osgi.framework;version="1.3.0",
 org.osgi.service.http;version="1.2.0",
 org.springframework.osgi.context.support,
 org.springframework.web.servlet,
 org.springframework.web.servlet.mvc
&lt;/pre&gt;

	&lt;h3&gt;觀察&lt;/h3&gt;


	&lt;ol&gt;
	&lt;li&gt;註冊的動作之前都是用 OSGi DS 做法注入，這次用 Spring 的 osgi:reference 注入，同時也將 userdao 服務注入 controller 之中練習。&lt;/li&gt;
		&lt;li&gt;OsgiWebApplicationContext 提供支援將 context 注入，不然 osgi:reference 無法使用。&lt;/li&gt;
	&lt;/ol&gt;</description>
      <pubDate>Wed, 08 Nov 2006 00:32:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:3de2364f-4625-4f1d-85aa-b228354479ee</guid>
      <author>LIN</author>
      <link>http://blog.extremepattern.com/articles/2006/11/08/hello-spring-mvc-and-osgi</link>
      <category>eclipse</category>
      <category>java</category>
    </item>
  </channel>
</rss>

