免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 858 | 回复: 0
打印 上一主题 下一主题

用Struts2实现IoC [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-30 12:05 |只看该作者 |倒序浏览

简介:IoC (Inversion of Control,控制反转) 随着Java社区中轻量级容器(Lightweight Contianer)的推广而越来越为大家耳熟能详。本文的目的主要是介绍在Struts 2中实现控制反转
   IoC (Inversion of Control,控制反转) 随着Java社区中轻量级容器(Lightweight Contianer)的推广而越来越为大家耳熟能详。本文的目的主要是介绍在Struts 2中实现控制反转。
历史背景
    众所周知,Struts 2是以Webwork 2作为基础发展出来。而在Webwork 2.2之前的Webwork版本,其自身有一套控制反转的实现,Webwork 2.2在
Spring 框架
的如火如荼发展的背景下,决定放弃控制反转功能的开发,转由Spring实现。值得一提的是,Spring确实是一个值得学习的框架,因为有越来越多的开源组件(如
iBATIS
等)都放弃与Spring重叠的功能的开发。因此,Struts 2推荐大家通过Spring实现控制反转。
具体实现
首先,在开发环境中配置好Struts 2的工程。对这部分仍然有问题的朋友,请参考我的早前的文章。
然后,将所需的Spring的jar包加入到工程的构建环境(Build Path)中,如下图1所示:
           

[/url]
        图1 所依赖的Spring的jar包
    本文使用的是Spring 2.0,Spring强烈建议大家在使用其jar包时,只引用需要的包,原因是Spring是一个功能非常强大的框架,其中有些功能是您不需要的;而且Spring提倡的是“按需所取”,而不是EJB的“爱我就要爱我的一切”。当然,如果你怕麻烦或者是不清楚每个包的作用,引用一个Spring的总包也未尝不可。
接下来,就要修改WEB-INF\web.xml文件了,内容为:
xml version="1.0" encoding="UTF-8" ?>
web-app version ="2.4" xmlns ="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
     display-name > Struts 2 IoC Demo  display-name >
     filter >
         filter-name > struts-cleanup  filter-name >
         filter-class >
            org.apache.struts2.dispatcher.ActionContextCleanUp
         filter-class >
     filter >
     filter >
         filter-name > struts2  filter-name >
         filter-class >
            org.apache.struts2.dispatcher.FilterDispatcher
         filter-class >
     filter >
     filter-mapping >
         filter-name > struts-cleanup  filter-name >
         url-pattern > /*  url-pattern >
     filter-mapping >
     filter-mapping >
         filter-name > struts2  filter-name >
         url-pattern > /*  url-pattern >
     filter-mapping >
     listener >
         listener-class >
            org.springframework.web.context.ContextLoaderListener
         listener-class >
     listener >
     welcome-file-list >
         welcome-file > index.html  welcome-file >
     welcome-file-list >
web-app >
清单1 WEB-INF\web.xml
大家一看便知道,主要是加入Spring的ContextLoaderListener监听器,方便Spring与Web容器交互。
紧接着,修改Struts.properties文件,告知Struts 2运行时使用Spring来创建对象(如Action等),内容如下:
struts.objectFactory = spring
清单2 classes\struts.properties
再下来,遵循Spring的原则——面向接口编程,创建接口ChatService,代码如下:

package tutorial;


import java.util.Set;



public interface ChatService

{

    Set  String > getUserNames();

}
清单3 tutorial.ChatService.java
然后,再创建一个默认实现ChatServiceImpl,代码如下:

package tutorial;


import java.util.HashSet;

import java.util.Set;



public class ChatServiceImpl implements ChatService

{



     public Set  String > getUserNames()

{

        Set  String > users = new HashSet  String > ();

        users.add( " Max " );

        users.add( " Scott " );

        users.add( " Bob " );

         return users;

    }



}
清单4 tutorial.ChatServiceImpl.java
接下来,就该新建Action了。tutorial.ChatAction.java的代码如下:

package tutorial;


import java.util.Set;


import com.opensymphony.xwork2.ActionSupport;



public class ChatAction extends ActionSupport

{

     private static final long serialVersionUID = 8445871212065L ;

   

     private ChatService chatService;

     private Set  String > userNames;



     public void setChatService(ChatService chatService)

{

         this .chatService = chatService;

    }

   


     public Set  String > getUserNames()

{

         return userNames;

    }

   

    @Override


     public String execute()

{

        userNames = chatService.getUserNames();

         return SUCCESS;

    }

   

}
清单5 tutorial.ChatAction.java
ChatAction类使用属性(Getter/Setter)注入法取得ChatService对象。
然后,配置Spring的applicationContext.xml(位于WEB-INF下)文件,内容如下:
xml version="1.0" encoding="UTF-8" ?>
beans xmlns ="http://www.springframework.org/schema/beans"
    xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" >
     bean id ="chatService" class ="tutorial.ChatServiceImpl" />
     bean id ="chatAction" class ="tutorial.ChatAction" scope ="prototype" >
         property name ="chatService" >
             ref local ="chatService" />
         property >
     bean >
beans >
清单6 WEB-INF\applicationContext.xml
上述代码有二点值得大家注意的:
  • Struts 2会为每一个请求创建一个Action对象,所以在定义chatAction时,使用scope="prototype"。这样Spring就会每次都返回一个新的ChatAction对象了;
  • 因为ChatServiceImpl被配置为默认的scope(也即是singleton,唯一的),所以在实现时应保证其线程安全(关于编写线程安全的代码的讨论已经超出本文的范围,更超出了本人的能力范围,大家可以参考Addison Wesley Professional出版的《
    [url=http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601]Java Concurrency in Practice

    》)。
    接下来,在classes/struts.xml中配置Action,内容如下:
    DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
            "http://struts.apache.org/dtds/struts-2.0.dtd" >
    struts >
         include file ="struts-default.xml" />   
       
         package name ="Struts2_IoC" extends ="struts-default" >
             action name ="Chat" class ="chatAction" >
                 result > /UserList.jsp  result >
             action >
         package >   
    struts >
    清单7 classes\struts.xml
    这里的Action和平常不同的就是class属性,它对应于Spring所定义的bean的id,而不是它的类全名。
    最后,让我们看看/UserList.jsp,内容如下:
    @ page contentType = " text/html; charset=UTF-8 " %>
      taglib prefix = " s " uri = " /struts-tags " %>
    html >
    head >
         title > User List  title >
    head >
    body >
         h2 > User List  h2 >
         ol >
         s:iterator value ="userNames" >
             li > s:property /> li >
         s:iterator >
         ol >
    body >
    html >
    清单8 /UserList.jsp
    大功告成,分布运行应用程序,在浏览器中键入
    http://localhost:8080/Struts2_IoC/Chat.action
    ,出现如图2所示页面:
               

    [/url]
            图2 /ListUser.jsp
    总结
    通过Spring在Struts 2上实现控制反转是强烈推荐的做法,当然您也可以组合其它的实现(如Pico等)。


    本文来自ChinaUnix博客,如果查看原文请点:[url]http://blog.chinaunix.net/u2/63740/showart_511842.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP