<?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 Wicket and Spring-OSGi</title>
    <link>http://blog.extremepattern.com/articles/2006/11/30/hello-wicket-and-spring-osgi</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>enjoy</description>
    <item>
      <title>Hello Wicket and Spring-OSGi</title>
      <description>&lt;h3&gt;源起&lt;/h3&gt;


	&lt;p&gt;想要嘗試 wicket 開發網頁的方式，並套到 Spring-OSGi 的環境中。&lt;/p&gt;


	&lt;h3&gt;hello wicket&lt;/h3&gt;


	&lt;p&gt;在 web.xml 中可以看出整合的關係，上半部是 Spring 的部份喚起 ContextLoaderListener 並
採用 OsgiWebApplicationContext 當 ContextClass。&lt;/p&gt;


&lt;pre&gt;
&amp;lt;context-param&amp;gt;
  &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;
  &amp;lt;param-value&amp;gt;/WEB-INF/applicationContext.xml&amp;lt;/param-value&amp;gt;
&amp;lt;/context-param&amp;gt;
&amp;lt;context-param&amp;gt;
  &amp;lt;param-name&amp;gt;contextClass&amp;lt;/param-name&amp;gt;
  &amp;lt;param-value&amp;gt;
  org.springframework.osgi.context.support.OsgiWebApplicationContext
  &amp;lt;/param-value&amp;gt;
&amp;lt;/context-param&amp;gt;
&amp;lt;listener&amp;gt;
  &amp;lt;listener-class&amp;gt;
  org.springframework.web.context.ContextLoaderListener
  &amp;lt;/listener-class&amp;gt;
&amp;lt;/listener&amp;gt;
&lt;/pre&gt;

	&lt;p&gt;下半部就是宣告 wicket 的使用，並用 SpringWebApplicationFactory 來注入 bean。&lt;/p&gt;


&lt;pre&gt;
&amp;lt;servlet&amp;gt;
&amp;lt;servlet-name&amp;gt;HelloWorldApplication&amp;lt;/servlet-name&amp;gt;
&amp;lt;servlet-class&amp;gt;
  wicket.protocol.http.WicketServlet
&amp;lt;/servlet-class&amp;gt;
&amp;lt;init-param&amp;gt;
  &amp;lt;param-name&amp;gt;applicationFactoryClassName&amp;lt;/param-name&amp;gt;
  &amp;lt;param-value&amp;gt;
    wicket.spring.SpringWebApplicationFactory
  &amp;lt;/param-value&amp;gt;
&amp;lt;/init-param&amp;gt;
&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;
&amp;lt;/servlet&amp;gt;

&amp;lt;servlet-mapping&amp;gt;
  &amp;lt;servlet-name&amp;gt;HelloWorldApplication&amp;lt;/servlet-name&amp;gt;
  &amp;lt;url-pattern&amp;gt;/hello/*&amp;lt;/url-pattern&amp;gt;
&amp;lt;/servlet-mapping&amp;gt;
&lt;/pre&gt;

	&lt;p&gt;applicationContext.xml 中 BundleViewer 是一個 BundleContextAware
介面的實做，利用 BundleContext 可以得到 Bundles 的資料。
HelloWorldApplication 則是 wicket.protocol.http.WebApplication 的實做。
實際上 BundleViewer 這個 bean 會被注到某些 Page 去，但是在這個 xml 檔案中
無法看到這些關聯，注入行為由 HelloWorldApplication 負責。&lt;/p&gt;


&lt;pre&gt;
&amp;lt;bean id="bundleViewer" 
  class="haha.osgi.webconsole.wicket.BundleViewer"/&amp;gt;

&amp;lt;bean id="wicketApplication" 
  class="haha.osgi.webconsole.wicket.HelloWorldApplication" /&amp;gt;
&lt;/pre&gt;

	&lt;p&gt;HelloWorldApplication 需要加個 init 來注入需要的 bean。&lt;/p&gt;


&lt;pre&gt;
public class HelloWorldApplication extends WebApplication {

@Override
protected void init() {
  // THIS LINE IS IMPORTANT - IT INSTALLS THE COMPONENT INJECTOR THAT WILL
  // INJECT NEWLY CREATED COMPONENTS WITH THEIR SPRING DEPENDENCIES
  addComponentInstantiationListener(new SpringComponentInjector(this));
}

@Override
public Class getHomePage() {
  return HelloWorldPage.class;
}
&lt;/pre&gt;

	&lt;p&gt;HelloWorldPage 只要加一行，不能初始化，也不需要 setter。&lt;/p&gt;


&lt;pre&gt;
@SpringBean
private BundleViewer bundleViewer;
&lt;/pre&gt;

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


	&lt;ol&gt;
	&lt;li&gt;wicket 跟 Spring 的整合有許多方式，這是利用其中 wicket-spring-annot 提供的支援
來做的。&lt;/li&gt;
		&lt;li&gt;wicket 還需要多練習。&lt;/li&gt;
	&lt;/ol&gt;</description>
      <pubDate>Thu, 30 Nov 2006 02:30:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:028abbe7-13e9-49e4-bb0b-cbb2761c38ed</guid>
      <author>LIN</author>
      <link>http://blog.extremepattern.com/articles/2006/11/30/hello-wicket-and-spring-osgi</link>
      <category>java</category>
    </item>
  </channel>
</rss>

