- 浏览: 344115 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (97)
- 搜索引擎 (9)
- JAVA基础知识 (7)
- Struts (13)
- Spring (1)
- Hibernate (0)
- iBATIS (2)
- ExtJs (10)
- AJAX (0)
- Oracle (1)
- MSSQLSERVER (1)
- MySQL (0)
- Prototype (0)
- DWR (0)
- EJB (0)
- J2EE综合 (0)
- 算法 (1)
- WebServices (0)
- JMS (0)
- JavaMail (0)
- JMX (0)
- UML (0)
- Dojo (0)
- Acegi (2)
- 其他Html-XML等 (3)
- CSS (1)
- 其他开源项目 (0)
- 英语 (0)
- Web3D (24)
- FCKeditor (1)
- javascript 特效 (2)
最新评论
-
荷戟者:
如何实现的,是否可以想象一点
extjs实现左侧tab -
coconut_zhang:
怎么没人评论,吼吼。。
HTMLParser使用详解(4)- 通过Visitor访问内容 -
Sorry':
JDBC中处理存储过程的结果集的通用流程 -
Sorry':
计划将客户
JDBC中处理存储过程的结果集的通用流程 -
renhongchao:
very good!在csdn也看到相同的文章,莫非是同一人? ...
HTMLParser使用详解(3)- 通过Filter访问内容
IoC(Inversion of Control,以下译为控制反转)随着Java社区中轻量级容器(Lightweight Contianer)的推广而越来越为大家耳熟能详。在此,我不想再多费唇舌来解释“什么是控制反转”和“为什么需要控制反转”。因为互联网上已经有非常多的文章对诸如此类的问题作了精彩而准确的回答。大家可以去读一下Rod Johnson和Juergen Hoeller合著的《Expert one-on-one J2EE Development without EJB》或Martin Fowler所写的《Inversion of Control Containers and the Dependency Injection pattern》。
言归正传,本文的目的主要是介绍在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所示:
图1 所依赖的Spring的jar包
本文使用的是Spring 2.0,Spring强烈建议大家在使用其jar包时,只引用需要的包,原因是Spring是一个功能非常强大的框架,其中有些功能是您不需要的;而且Spring提倡的是“按需所取”,而不是EJB的“爱我就要爱我的一切”。当然,如果你怕麻烦或者是不清楚每个包的作用,引用一个Spring的总包也未尝不可。
接下来,就要修改WEB-INF\web.xml文件了,内容为:
< 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 >
大家一看便知道,主要是加入Spring的ContextLoaderListener监听器,方便Spring与Web容器交互。
紧接着,修改Struts.properties文件,告知Struts 2运行时使用Spring来创建对象(如Action等),内容如下:
再下来,遵循Spring的原则——面向接口编程,创建接口ChatService,代码如下:
import java.util.Set;
public interface ChatService {
Set < String > getUserNames();
}
然后,再创建一个默认实现ChatServiceImpl,代码如下:
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;
}
}
接下来,就该新建Action了。tutorial.ChatAction.java的代码如下:
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;
}
}
ChatAction类使用属性(Getter/Setter)注入法取得ChatService对象。
然后,配置Spring的applicationContext.xml(位于WEB-INF下)文件,内容如下:
< 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 >
上述代码有二点值得大家注意的:
- Struts 2会为每一个请求创建一个Action对象,所以在定义chatAction时,使用scope="prototype"。这样Spring就会每次都返回一个新的ChatAction对象了;
- 因为ChatServiceImpl被配置为默认的scope(也即是singleton,唯一的),所以在实现时应保证其线程安全(关于编写线程安全的代码的讨论已经超出本文的范围,更超出了本人的能力范围,大家可以参考Addison Wesley Professional出版的《Java Concurrency in Practice》)。
接下来,在classes/struts.xml中配置Action,内容如下:
"-//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 >
这里的Action和平常不同的就是class属性,它对应于Spring所定义的bean的id,而不是它的类全名。
最后,让我们看看/UserList.jsp,内容如下:
<% @ 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 >
大功告成,分布运行应用程序,在浏览器中键入http://localhost:8080/Struts2_IoC/Chat.action,出现如图2所示页面:
图2 /ListUser.jsp
总结
通过Spring在Struts 2上实现控制反转是强烈推荐的做法,当然您也可以组合其它的实现(如Pico等)。
发表评论
-
详解struts2中struts.properties
2007-10-25 00:17 2723Stru ... -
struts2的struts.properties配置文件详解
2007-10-24 23:55 2198struts.action.extension ... -
Struts 2 间接实现零配置
2007-10-19 11:41 1768所谓间接实现零配置,是指只要做些初始化的配置之后,在以后的开发 ... -
Parameters in configuration results
2007-10-10 17:12 1218Parameters in configura ... -
How do we upload files
2007-10-10 16:47 1485xml 代码 How do we upload ... -
display dynamic or static images
2007-10-10 16:38 1630How can we display dynamic or s ... -
Struts2 验证器
2007-10-08 22:30 4365<validators> ... -
初涉Struts 2.0
2007-10-06 09:43 1198初涉Struts 2.0... -
Apache Struts 2 Plugin Registry
2007-10-03 17:25 2144Apache Struts 2 Plugin Registry ... -
Struts 2 官方
2007-10-03 17:22 11406Struts 2 官方: http://struts.apac ... -
struts2与spring2集成
2007-10-03 17:12 1234在Eclipse下建立一个Dynamic Web Applic ... -
struts2的struts.properties配置文件详解
2007-10-03 17:02 1166struts.action.extension ... -
Struts 2与AJAX(第三部分)
2007-10-03 16:53 1507Struts 2与AJAX(第三部分 ... -
Struts 2与AJAX(第二部分)
2007-10-03 16:52 1645在上一篇文章《Struts 2与AJAX(第一部分)》,我已经 ... -
Struts 2与AJAX(第一部分)
2007-10-03 16:51 1667Struts 2与AJAX(第一部分) 在当今——Web 2 ... -
struts2表单标签
2007-10-03 16:48 1630Form Tags ... -
Struts2 with logon
2007-10-03 16:45 1163关于此工程中的所有设置是承接前一篇文章Struts2介绍之使用 ... -
Struts2介绍之使用链接标签
2007-10-03 16:42 1868Web应用区别于普通的站点之处在于Web应用可以创建一个动态的 ... -
Strus 2的新表单标志的使用
2007-10-03 16:35 1163Struts 2为大家提供了不少常用的很酷的表单标志,简化了我 ... -
在Struts 2中实现文件上传
2007-10-03 16:33 1234实现原理 Struts 2是通过Commons FileUpl ...
相关推荐
01 为Struts 2.0做好准备 02 常用的Struts 2.0的标志(Tag) ...08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 trus 2的新表单标志的使用 13 Struts 2与AJAX
01 为Struts 2.0做好准备 02 常用的Struts 2.0的标志(Tag) ...08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 Struts 2的新表单标志的使用 13 Struts 2与AJAX
Struts 2.0系列(MAX),pdf格式,全方位介绍struts2: 常用的Struts 2.0的标志...在Struts 2中实现IoC 在Struts 2中实现文件上传 在Struts 2中实现CRUD Struts 2中的OGNL Strus 2的新表单标志的使用 Struts 2与AJAX
08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 trus 2的新表单标志的使用 13 Struts 2与AJAX Struts2中用Spring实现IoC.doc Struts2中的零配置与CoC...
struts2中实现IOC struts2中实现文件上传 struts2中实现CRUD struts2中的OGNL struts2的新表单标志的使用 struts2与AJAX一 struts2与AJAX二 struts2与AJAX三 struts2中用Spring实现IOC struts2中的零配置与IOC ...
很好的struts2入门教程,网上搜集整理的!... ·Struts 2中实现IoC ·Struts 2中实现文件上传 ·Struts 2中的OGNL ·Strus 2的新表单标签的使用 ·Struts 2与AJAX ·Struts2分页 ·完全Struts's Tiles入门
这篇博客“在Struts2中整合Spring的IoC”将深入探讨这一集成过程。 首先,理解IoC(Inversion of Control,控制反转)是Spring的核心理念。它使得应用程序不再直接创建对象,而是通过配置文件或注解来定义对象及其...
Struts 2的基石——拦截器(Interceptor);在Struts 2_0中国际化(i18n)您的应用程序;在Struts 2_0中实现表单数据校验(Validation);Struts 2与AJAX;在Struts 2中实现IoC......
在Struts2+Spring整合中,Spring负责业务层对象的管理,提供IOC(Inversion of Control)容器来管理和控制对象的生命周期。同时,Spring的AOP模块可以用于实现如日志记录、权限控制等通用功能。 **MyBatis框架** ...
在这个"Struts2SpringHibernate实现简单的添加,分页显示功能例子"中,开发者通过整合这三大框架,实现了基本的数据添加功能以及数据的分页显示。以下是对这个例子中的关键知识点的详细解释: 1. **Struts2**:作为...
在Struts2中,IOC(Inversion of Control,控制反转)容器是核心组件之一,它负责管理应用中的对象及其依赖关系。这篇博文将深入探讨Struts2的IOCContainer,以及它如何在实际开发中发挥关键作用。 首先,理解IOC的...
Struts2是一个流行的MVC框架,通过集成IOC框架,如Spring,可以方便地管理Struts2中的动作类(Action)和业务服务层(Service)。 在学习和应用IOC框架,尤其是通过动态代理实现时,我们需要了解以下知识点: 1. ...
在Struts2中,IOC通常通过Spring框架来实现,以管理Action和其他组件的生命周期和依赖注入。 #### 6. Struts2标签 Struts2提供了丰富的标签库,如`<s:textfield>`, `<s:submit>`, `<s:iterator>`等,这些标签用于...
2. **IO包**:在Struts2中,`struts2-core`库中包含了处理输入和输出的工具,如流处理、文件上传和下载等功能。`org.apache.struts2.util`包下的`FileItem`和`FileUpload`类是实现文件上传的关键,它们帮助开发者...
这个"Struts2例子8"着重展示了如何在Struts2中实现控制反转(Inversion of Control, IoC)。IoC是面向对象设计中的一个原则,它允许外部组件来管理对象的创建和配置,而不是由对象自身来负责。在Struts2中,IoC通常...
6.Struts2中的零配置与CoC(Convention over Configration).doc 7.Struts2介绍之使用链接标签.doc 8.Struts2入门.doc 9.Struts2学习进阶(基础篇1-7) 10.Struts2学习进阶(实例篇1)——struts2-blank-2.0.8实例...