﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava--随笔分类-spring</title><link>http://www.blogjava.net/jackstudio/category/12673.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 18:07:20 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 18:07:20 GMT</pubDate><ttl>60</ttl><item><title>spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.</title><link>http://www.blogjava.net/jackstudio/archive/2006/11/09/80060.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 09 Nov 2006 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/11/09/80060.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/80060.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/11/09/80060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/80060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/80060.html</trackback:ping><description><![CDATA[
		<p>spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.<br />看一下ContextLoaderListener的源码,这是一个ServletContextListener<br />/**<br />  * Initialize the root web application context.<br />  */<br /> public void contextInitialized(ServletContextEvent event) {<br />  this.contextLoader = createContextLoader();<br />  this.contextLoader.initWebApplicationContext(event.getServletContext());<br /> }<br /> <br />  /**<br />  * Create the ContextLoader to use. Can be overridden in subclasses.<br />  * @return the new ContextLoader<br />  */<br /> protected ContextLoader createContextLoader() {<br />  return new ContextLoader();<br /> }</p>
		<p> contextLoader的源码<br /> public WebApplicationContext initWebApplicationContext(ServletContext servletContext)<br />   throws BeansException {</p>
		<p>  long startTime = System.currentTimeMillis();<br />  if (logger.isInfoEnabled()) {<br />   logger.info("Root WebApplicationContext: initialization started");<br />  }<br />  servletContext.log("Loading Spring root WebApplicationContext");</p>
		<p>  try {<br />   // Determine parent for root web application context, if any.<br />   ApplicationContext parent = loadParentContext(servletContext);</p>
		<p>   WebApplicationContext wac = createWebApplicationContext(servletContext, parent);<br />   servletContext.setAttribute(<br />     WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);</p>
		<p>   if (logger.isInfoEnabled()) {<br />    logger.info("Using context class [" + wac.getClass().getName() +<br />      "] for root WebApplicationContext");<br />   }<br />   if (logger.isDebugEnabled()) {<br />    logger.debug("Published root WebApplicationContext [" + wac +<br />      "] as ServletContext attribute with name [" +<br />      WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]");<br />   }</p>
		<p>   if (logger.isInfoEnabled()) {<br />    long elapsedTime = System.currentTimeMillis() - startTime;<br />    logger.info("Root WebApplicationContext: initialization completed in " + elapsedTime + " ms");<br />   }</p>
		<p>   return wac;<br />  }<br />  catch (RuntimeException ex) {<br />   logger.error("Context initialization failed", ex);<br />   servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);<br />   throw ex;<br />  }<br />  catch (Error err) {<br />   logger.error("Context initialization failed", err);<br />   servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err);<br />   throw err;<br />  }<br /> }<br /> 注意WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,这里面放了WebApplicationContext,需要使用时从ServletContext取出<br /> 可以使用WebApplicationContextUtils得到WebApplicationContext<br /> public static WebApplicationContext getWebApplicationContext(ServletContext sc) {<br />  Object attr = sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);<br />  if (attr == null) {<br />   return null;<br />  }<br />  if (attr instanceof RuntimeException) {<br />   throw (RuntimeException) attr;<br />  }<br />  if (attr instanceof Error) {<br />   throw (Error) attr;<br />  }<br />  if (!(attr instanceof WebApplicationContext)) {<br />   throw new IllegalStateException("Root context attribute is not of type WebApplicationContext: " + attr);<br />  }<br />  return (WebApplicationContext) attr;<br /> }<br /> 关键的问题在于struts如何启动的spring的,ContextLoaderPlugIn的源码<br /> <br /> // Publish the context as a servlet context attribute.<br />  String attrName = getServletContextAttributeName();<br />  getServletContext().setAttribute(attrName, wac);<br /> <br /> public String getServletContextAttributeName() {<br />  return SERVLET_CONTEXT_PREFIX + getModulePrefix();<br /> }<br /> 不同加载的Key竟然不同,原因就是WebApplicationContext放在那里的问题,可spring调用的时候会根据WebApplicationContext里面定义的那个名字去找的,问题出在这里</p>
		<p>
				<br /> 在struts-config.xml中配置<br />    &lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;<br />      &lt;set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /&gt;<br />    &lt;/plug-in&gt;</p>
		<p>    &lt;controller&gt;<br />        &lt;set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor" /&gt;<br />    &lt;/controller&gt;</p>
		<p>
				<br /> 原理是这样的,Struts虽然只能有一个ActionServlet实例,但是对于不同的子应用分别能有自己的RequestProcessor实例每个RequestProcessor实例分别对应不同的struts配置文件。<br />   子应用的ProcessorClass类必须重写一般就是继承RequestProcessor类，然后再其配置文件的controller元素中的&lt;processorClass&gt;属性中作出修改。那么当<br />  getRequestProcessor(getModuleConfig(request)).process(request,response);就能根据request选择相应的moduleconfig,再根据其&lt;processorClass&gt;属性选择相应的RequestProcessor子类来处理相应的请求了。</p>
		<p> </p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/80060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-11-09 10:40 <a href="http://www.blogjava.net/jackstudio/archive/2006/11/09/80060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用ServletContextListener在服务器启动和关闭时创建和关闭缓存</title><link>http://www.blogjava.net/jackstudio/archive/2006/11/09/80058.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 09 Nov 2006 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/11/09/80058.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/80058.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/11/09/80058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/80058.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/80058.html</trackback:ping><description><![CDATA[
		<div class="con_sample">
				<p>ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志，转发请求。每一个 Web 应用程序含有一个Context，被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享，所以我所知道的 ServletContext 的最大应用是Web缓存----把不经常更改的内容读入内存，所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。</p>
		</div>
		<div class="con_all">
				<p>
				</p>
				<p>ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志，转发请求。每一个 Web 应用程序含有一个Context，被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享，所以我所知道的 ServletContext 的最大应用是Web缓存----把不经常更改的内容读入内存，所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。 </p>
				<p>ServletContextListener 是 ServletContext 的监听者，如果 ServletContext 发生变化，如服务器启动时 ServletContext 被创建，服务器关闭时 ServletContext 将要被销毁。 </p>
				<p>在JSP文件中，application 是 ServletContext 的实例，由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。 </p>
				<p>我们使用缓存的思路大概是： </p>
				<ol>
						<li>
								<p>服务器启动时，ServletContextListener 的 contextInitialized()方法被调用，所以在里面创建好缓存。可以从文件中或者从数据库中读取取缓存内容生成类，用 ervletContext.setAttribute()方法将缓存类保存在 ServletContext 的实例中。 </p>
						</li>
						<li>
								<p>程序使用 ServletContext.getAttribute()读取缓存。如果是 JSP，使用a pplication.getAttribute()。如果是 Servlet，使用 getServletContext().getAttribute()。如果缓存发生变化(如访问计数)，你可以同时更改缓存和文件/数据库。或者你等 变化积累到一定程序再保存，也可以在下一步保存。 </p>
						</li>
						<li>
								<p>服务器将要关闭时，ServletContextListener 的 contextDestroyed()方法被调用，所以在里面保存缓存的更改。将更改后的缓存保存回文件或者数据库，更新原来的内容。 </p>
						</li>
				</ol>
				<pre>import User; //my own class<br />import DatabaseManager; // my own class<br />import javax.servlet.ServletContext;<br />import javax.servlet.ServletContextListener;<br /><br />public class MyContextListener<br /><br />	implements ServletContextListener {<br />	private ServletContext context = null;<br /><br />	public void contextInitialized(ServletContextEvent event) {<br />		context = event.getServletContext();<br />		User user = DatabaseManager.getUserById(1);<br />		context.setAttribute("user1", user);<br />	}<br /><br />	public void contextDestroyed(ServletContextEvent event) {<br />		User user = (User)context.getAttribute("user1");<br />		DatabaseManager.updateUserData(user);<br />		this.context = null;<br />	}<br />}<br /></pre>
				<h3 class="para">布署 ServletContextListener</h3>
				<p>你实现(implements)了 ServletContextListener 编译后，把它放在正确的WEB-INF/classes目录下，更改WEB-INF目录下的 web.xml文件，在web-app节点里添加 </p>
				<pre>&lt;listener&gt;<br />	&lt;listener-class&gt;MyServletContextListener&lt;/listener-class&gt;<br />&lt;/listener&gt;<br /></pre> 来自：<a href="http://www.ideawu.net/ideablog/">idea's blog</a></div>
<img src ="http://www.blogjava.net/jackstudio/aggbug/80058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-11-09 10:39 <a href="http://www.blogjava.net/jackstudio/archive/2006/11/09/80058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Spring , Struts结合学习</title><link>http://www.blogjava.net/jackstudio/archive/2006/09/21/71106.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 21 Sep 2006 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/21/71106.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/71106.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/21/71106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/71106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/71106.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 关于Spring , Struts结合学习。		一、前言		刚刚接触了日本一个项目，用的框架名称是Northland Framework，主要用到以下部分		Struts、Spring、iBATIS、Velocity。Struts、Spring如何结合在一起？						二、				Spring				提供了三种整合				Struts				的方法：		...&nbsp;&nbsp;<a href='http://www.blogjava.net/jackstudio/archive/2006/09/21/71106.html'>阅读全文</a><img src ="http://www.blogjava.net/jackstudio/aggbug/71106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-21 15:04 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/21/71106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>