Spring和Webwork結合的方式

          Posted on 2005-11-23 13:52 李嵐 閱讀(921) 評論(0)  編輯  收藏 所屬分類: Java

          前兩種方式webwork的wiki里有,就不多說了,點這里可以查看
          而以下的給出的思路是webwork mail list的討論的一種方案,應該是最好的一種方案。

          代碼1:

          public class SpringContainer implements Container {
              
          private
           ApplicationContext applicationContext;

              
          public SpringContainer(ServletContext servletContext) 
          {
                  
          this.applicationContext =
           WebApplicationContextUtils.getWebApplicationContext(servletContext);
              }


              
          public SpringContainer(ApplicationContext applicationContext) {
                  
          this.applicationContext =
           applicationContext;
              }


              
          /**
               * 
          @param key
               *            component class type or component name
               * 
          @return @throws

               *         ComponentNotFoundException
               
          */

              
          public Object getComponent(Object key) throws ComponentNotFoundException {
                  
          if (applicationContext == null
          )
                      
          throw new IllegalStateException("Spring Application context has not been set"
          );
                  
          if (key == null
          )
                      
          throw new ComponentNotFoundException("The component key can not be null"
          );
                  
          if (key instanceof Class) 
          {
                      Map beans 
          =
           applicationContext.getBeansOfType((Class) key);
                      
          if (beans == null
          )
                          
          throw new ComponentNotFoundException("The container is unable to resolve single instance of " +
           ((Class) key).getName()
                                  
          + ", none instances found"
          );
                      
          if (beans.size() == 0 || beans.size() > 1
          )
                          
          throw new ComponentNotFoundException("The container is unable to resolve single instance of " +
           ((Class) key).getName()
                                  
          + ", number of instances found was: " +
           beans.size());
                      key 
          =
           beans.keySet().iterator().next();
                  }

                  
          return applicationContext.getBean(key.toString());
              }


              
          public void reload() {
                  close();
                  ((AbstractApplicationContext) applicationContext).refresh();
              }


              
          public void autowireComponent(Object bean) {
                  ((AbstractApplicationContext) applicationContext).getBeanFactory().autowireBeanProperties(bean, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, 
          false
          );
              }


              
          public void close() {
                  ((AbstractApplicationContext) applicationContext).close();
              }


          }

          代碼2:
          public class ComponentAutowireInterceptor implements Interceptor {


              
          public void destroy() 
          {
                  
          // TODO Auto-generated method stub

              }


              
          public void init() {
                  
          // TODO Auto-generated method stub

              }


              
          public String intercept(ActionInvocation invocation) throws Exception {
                  Application.getInstance().getContainer().autowireComponent(invocation.getAction());
                  
          return
           invocation.invoke();
              }


          }


          這幾段代碼,你不需要在spring里配置action,也不需要在xwork.xml里面配置external-ref。只要保證action引用的東東和spring里面同名就能夠auto wire by name了。

          原理:攔截器會在每個action之前調用autowireComponent(invocation.getAction())。這樣spring就會去自動組裝這個傳進來的action對象,而action對象里的屬性和spring里的bean id同名。所以spring就會自動將application.xml里對應的bean注射到action的屬性里去,從而達到把action按用戶希望的方式組裝起來的目的。

          如:
          appliaction.xml
              <bean id="myService">
                  
          <property name="target">
                      
          <bean class="myServiceDefaultImpl" autowire="byName">
                    
          </property>
              
          </bean>

          xwork.xml
                  <action name="myAction" class="myAction">
                      
          <result name="success">/success.ftl</result>
                  
          </action>

          Action:
          public class myAction extends ActionSupport {
              protected myService;
                   .......

              }

          最后記得要在web.xml配上listener-class

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          posts - 7, comments - 23, trackbacks - 0, articles - 0

          Copyright © 李嵐

          主站蜘蛛池模板: 银川市| 康保县| 井研县| 开原市| 陇南市| 通渭县| 丹寨县| 齐齐哈尔市| 荥阳市| 囊谦县| 张家港市| 扶风县| 宁陵县| 新竹市| 明水县| 谷城县| 衡东县| 柞水县| 巴彦淖尔市| 湖州市| 扶沟县| 樟树市| 巩义市| 四平市| 辽中县| 正宁县| 林芝县| 灵宝市| 阿城市| 北京市| 镇雄县| 政和县| 华亭县| 大邑县| 灌南县| 中方县| 和田市| 通州区| 明溪县| 双牌县| 惠来县|