- 浏览: 1721274 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (337)
- javaScript校验 (11)
- java (31)
- java连接数据库 (1)
- js应用 (41)
- JQuery (15)
- linux操作命令 (12)
- loadrunner测试 (5)
- tomcat (18)
- 数据库 (12)
- eclipse (7)
- 触发器 (7)
- 表单 (3)
- ibatis (6)
- oracle (4)
- xml (1)
- Exception (6)
- spring (16)
- struts (4)
- struts 标签 (2)
- sql (8)
- sql server (6)
- 其它 (18)
- Apache (2)
- 电脑故障 (4)
- java 线程 (1)
- dwr (8)
- jackey (18)
- 总结 (34)
- gcc linux (2)
- extjs 学习 (5)
- 网站建设 (4)
- 健康 (2)
- 房地产知识 (1)
- hibernate (3)
- mysql (7)
- linux (13)
- svn (1)
最新评论
-
阳光泛滥的日子:
很好用谢谢
java.net.URISyntaxException的解决办法 -
linjianqing:
现在有更好的处理方式吗?我正也为这发愁
applet访问打印机出现的问题 -
ruyi574812039:
非常感谢您的总结!想问几个问题!假设三个项目分别以静态部署的三 ...
在Tomcat中部署Web程序的几种方式 -
yangguo:
太j8麻烦了
Spring3.1中使用缓存注解及Shiro的缓存联合 -
bellawang:
很好用谢谢
java.net.URISyntaxException的解决办法
Spring整合第三方MVC框架的通用配置
如果需要使用第三方MVC框架,则不能在web.xml文件中配置ApplicationContext的启动。但是, ApplicationContext是Spring的容器,负责管理所有的组件,从业务逻辑层组件,到持久层组件,都必须运行在Spring容器中。因 此,必须在Web应用启动时,创建Spring的ApplicationContext实例。事实上,Spring ApplictionContext作为IoC容器,总应该优先加载。
不管采用怎样的方法,Spring容器都应该在应用启动时,自动加载。为了让Spring容器能自动加载,通常有两个做法:
1.让MVC框架负责创建ApplicationContext实例,MVC框架加载时自动创建Spring容器。Struts就是采用这种机制与Spring整合。
2.采用load-on-startup Servlet实现。
根据Servlet2.3标准,所有的ServletContextListener都会比Servlet优先加载——即使是load-on- startup Servlet。ApplicationContext实例是Spring容器,负责管理应用中所有的组件,包括业务逻辑层组件和持久层组件。因此,应该 尽可能早的创建Spring容器。
为此,应该优先采用listener创建ApplicationContext。只是,ServletContextListener是从Servlet 2.3才出现的规范。如果使用了不支持Servlet2.3以上的Web服务器,则只能放弃ServletContextListener,采用load -on-startup Servlet策略。
Spring管理的组件相当多,如果将所有的组件部署在同一个配置文件里。不仅会降低配置文件的可读性,增大修改配置文件时引入错误的可能性,也不符合软 件工程“分而治之”的规则。通常推荐服务层对象,业务逻辑对象,DAO对象都存在于互不相同的Context中,而表现层对象如Spring MVC控制器,则被配置在表现层Context中。甚至将某个特定模块的组件部署在单独的Context中。
实际的应用中,Spring的配置文件通常不只一个,而是按功能被分成多个。好在,所有负责加载Spring容器的工具都可同时加载多个配置文件。
一. 采用ContextLoaderListener创建ApplicationContext
使用ContextLoaderListener创建ApplicationContext必须服务器支持listener,下面这些服务器都是支持 Listener的,如果使用这些服务器,则可以使用ContextLoaderListener创建ApplicationContext实例:
1.Apache Tomcat 4.x+ 。
2.etty 4.x+ 。
3.Resin 2.1.8+ 。
4.Orion 2.0.2+ 。
5.BEA WebLogic 8.1 SP3。
Spring提供ServletContextListener的一个实现类ContextLoaderListener,该类可以作为listener 使用,它会在创建时候自动查找WEB-INF/下的applicationContext.xml文件,因此,如果只有一个配置文件,并且文件名为 applicationContext.xml,只需在web.xml文件中增加如下一段即可:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
如果有多个配置文件需要载入,则考虑使用<context-param>元素来确定配置文件的文件名。 ContextLoaderListener加载时,会查找名为contextConfigLocation的参数。因此,配置context- param时参数名字应该是contextConfigLocation。
带多个配置文件的web.xml文件如下:
<!-- XML文件的文件头-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- web.xml文件的DTD等信息-->
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!-- 确定多个配置文件-->
在web.xml文件中加载Spring容器,这是最常见的做法。Spring自己的MVC框架就是采用这种策略。
关于让MVC框架负责创建ApplicationContext实例的情况比较多,因为每个MVC框架的启动机制有区别,因此加载ApplicationContext的方式也各有不同。
对于在web.xml配置文件中配置ApplicationContext的自动创建有两种策略:
1.利用ServletContextListener实现。
<context-param>
<!-- 参数名为contextConfigLocation -->
<param-name>contextConfigLocation</param-name>
<!-- 多个配置文件之间以,隔开 -->
<param-value>/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!-- 采用listener创建ApplicationContext实例-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
如果没有contextConfigLocation制定配置文件,Spring自动查找applicationContext.xml配置文件。
如果有contextConfigLocation,则利用该参数确定的配置文件,该参数指定的一个字符串,Spring的ContextLoaderListener负责将该字符串分解成多个配置文件,逗号“,”、空格“ ”、分号“;”都可作为字符串的分割符。
如果既然没有applicationContext.xml文件,也没有使用contextConfigLocation参数确定配置文件,或者 contextConfigLocation确定的配置文件不存在,都将导致:Spring无法加载配置文件,无法正常创建 ApplicationContext实例。
Spring根据bean定义创建 WebApplicationContext对象,并将其保存在Web应用的ServletContext中。大部分情况下,应用中的bean无需感受到 ApplicationContext的存在,只要利用ApplicationContext的IoC即可。
如果需要在应用中获取ApplicationContext实例,可以通过如下方法获取:
WebApplicationContext ctx =
WebApplicationContextUtils.getWebApplicationContext(servletContext);
下面是采用Servlet获取ApplicationContext的完整源代码:
public class SpringTestServlet extends HttpServlet
{
//Servlet的响应方法。
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException,java.io.IOException
{z
//获取Servlet的ServletContext对象
ServletContext sc = getServletContext();
//使用WebApplicationContextUtils类获得ApplicationContext
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);
//获取Servlet的页面输出流
PrintWriter out = response.getWriter();
//将ApplicationContext对象输出
out.println(ctx);
}
}
程序里手动获取ApplicationContext对象,然后直接输出到Servlet的响应。结果看到,ApplicationContext加载了web.xml文件中指定的两个配置文件。
二. 采用load-on-startup Servlet创建ApplicationContext
如果容器不支持Listener,则只能使用load-on-startup Servlet创建ApplicationContext实例,下面的容器都不支持Listener:
1.BEA WebLogic up to 8.1 SP2。
2.IBM WebSphere 5.x 。
3.Oracle OC4J 9.0.3。
Spring提供了一个特殊的Servlet类:ContextLoaderServlet。该Servlet在启动时,会自动查找WEB-INF/下的applicationContext.xml文件。
当然,为了让ContextLoaderServlet随应用启动而启动,应将此Servlet配置成load-on-startup的Servlet, load-on-startup的值小一点比较合适,因为要保证ApplicationContext优先创建。如果只有一个配置文件,并且文件名为: applicationContext.xml。在web.xml文件中增加如下一段即可:
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
该Servlet用于提供“后台”服务,作为容器管理应用中的其他bean,不需要响应客户请求,因此无需配置servlet-mapping。
如果有多个配置文件,一样使用<context-param>元素来确定多个配置文件。事实上,不管是 ContextLoaderServlet,还是ContextLoaderListener,都依赖于ContextLoader创建 ApplicationContext实例。在ContextLoader代码的第240行,有如下代码:
String configLocation = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);
if (configLocation != null) {
wac.setConfigLocations(StringUtils.tokenizeToStringArray(configLocation,
ConfigurableWebApplicationContext.CONFIG_LOCATION_DELIMITERS));
}
其中CONFIG_LOCATION_PARAM是该类的常量,其值为contextConfigLocation。可看出:ContextLoader 首先检查servletContext中是否有contextConfigLocation的参数,如果有该参数,则加载该参数指定的配置文件。带多个配 置文件的web.xml文件如下:
<!-- XML文件的文件头-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- web.xml文件的DTD等信息-->
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!-- 确定多个配置文件-->
<context-param>
<!-- 参数名为contextConfigLocation -->
<param-name>contextConfigLocation</param-name>
<!-- 多个配置文件之间以,隔开 -->
<param-value>/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!-- 采用load-on-startup Servlet创建ApplicationContext实例-->
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<!-- 下面值小一点比较合适,会优先加载-->
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
测试所用的Servlet与前面所用的没有区别。ContextLoaderServlet与ContextLoaderListener底层都依赖于 ContextLoader。因此,二者的效果几乎没有区别。之间区别不是它们本身引起的,而是由于Servlet2.3的规范:listener比 servlet优先加载。因此,采用ContextLoaderListener创建ApplicationContext的时机更早。
当然,也可以通过ServletContext的getAttribute方法获取ApplicationContext,使用 WebApplicationContextUtils类更便捷,因为无需记住ServletContext属性名。即使ServletContext的 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE属性没有对应对象, WebApplicationContextUtils的getWebApplicationContext()方法将会返回空,而不会引起异常。
获得了WebApplicationContext实例的引用后,可以通过bean的名字访问容器中的bean实例。大部分时候,无需通过这种方式访问容 器中的bean。将表现层的控制器bean置入容器的管理中,客户端请求直接转发给容器中的bean,然后由容器管理bean之间的依赖,因此,无需手动 获取ApplicationContext引用。当然,每个框架都会有自己特定的整合策略。
发表评论
-
实现Applet与Servlet之间进行通讯的简单实例
2011-08-09 21:36 2951Servlet传送查询记录集给Applet 这篇文章是继< ... -
js 表单使用总结 jackey
2010-05-26 15:51 20571 javascript刷新页面 ... -
javascript的子窗口和父窗口的传值与刷新
2010-02-21 18:04 3144另存为子窗口 <!DOCTYPE HTML PUB ... -
showModalDialog参数使用详解
2010-02-04 19:24 1586showModalDialog:模式窗 ... -
Log4j配置文件的示例_jackey
2010-02-03 13:05 1995引子: 最近老是用到log4j的东西,我想这样优秀的一个 ... -
实现数据库中的数据(db data)转化成document文档 实现jdbc批量插入数据
2010-01-28 16:36 1707package com.test; import java. ... -
Ajax实现文件上传 jackey 好方法
2010-01-19 11:02 8258首先要说的就是 ajax 是无法实现上传文件的,可以想一下aj ... -
js控制select的option
2010-01-05 15:15 5716js控制select的option JS sele ... -
Windows下Apache+Tomcat+MySQL+jsp+php的服务器整合配置
2009-09-29 14:30 2484所需软件 (1) j2sdk- ... -
Windows下Apache+Tomcat+MySQL+jsp+php的服务器整合配置
2009-09-29 14:22 3833所需软件(1) j2sdk-1_4_2-win ... -
EL表达式 (详解)
2009-09-12 02:59 8205EL表达式 1、EL简介1)语法结构 ... -
在Tomcat中部署Web程序的几种方式
2009-09-10 18:36 20280在Tomcat中部署Java Web应用程序有两种方式:静态部 ... -
window xp Service pack 2+ iis 5.1+tomcat-5.5.27 +jdk1.5.0_08
2009-08-07 23:34 4224xp下整合IIS和tomcat ... -
使用IIS+Tomcat6.0将JSP网站发布到Internet
2009-08-07 10:40 5751使用IIS+Tomcat6.0将JS ... -
常见错误解决方案
2009-08-06 14:33 17091. sql server 错误签名 ISQL/w - ... -
dwr spring 如何配置
2009-08-06 13:57 2719DWR和Spring 让DWR和Spring一起工作的步 ... -
java 遍历map 方法 集合 jackey
2009-08-02 12:02 29623package com.jackey.topic; impo ... -
JSON 入门指南 jackey
2009-07-29 16:43 1303JSON 即 JavaScript Object Natati ... -
Eclipse插件的安装有两种方法 ___jackey
2009-07-29 14:06 1291Eclipse插件的安装有两种 ... -
利用apache的proxy-ajp做apache与tomcat的结合(转载) jackey
2009-07-28 16:14 2187解压apache的源代码 # ta ...
相关推荐
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据 c) 第三方缓存的实现 5. Hibernate的查询方式 Sql、Criteria,object comptosition Hql: 1、 属性查询 ...
10.2.4应用第三方缓存 216 10.3项目实战——借还图书 217 本章小结 224 课后练习 224 第11章spring框架基础 226 11.1spring框架概述 226 11.1.1认识spring框架 226 11.1.2spring框架特点 226 11.1.3spring...
4. **可扩展性**:预留插件和第三方服务接口,方便未来功能的扩展和升级。 5. **数据分析**:后台系统对用户行为进行实时分析,优化服务并发现潜在需求。 6. **安全机制**:集成最新的安全技术和策略,确保用户...
通用用户管理系统, 实现最常用的用户注册、登录、资料管理、个人中心、第三方登录等基本需求,支持扩展二次开发。 > zheng-wechat-mp 微信公众号管理平台,除实现官网后台自动回复、菜单管理、素材管理、用户管理...
由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...
第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码...
多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本...
第三章 跨域交互缓存处理设计 17 3.1 跨域交互缓存处理需求 17 3.1.1 缓存技术WebStorage 17 3.1.2 跨域交互缓存处理需求 17 3.1.3 页面回退管理需求 17 3.2 缓存处理机制 18 3.2.1 跨域缓存处理 18 3.2.2页面回退...