<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>lihaiyan</title>
    <description></description>
    <link>http://lihaiyan.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>AJAX实例入门(一)</title>
        <author>lihaiyan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lihaiyan.javaeye.com">lihaiyan</a>&nbsp;
          链接：<a href="http://lihaiyan.javaeye.com/blog/127822" style="color:red;">http://lihaiyan.javaeye.com/blog/127822</a>&nbsp;
          发表时间: 2007年09月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="center">AJAX实例入门(一)</p>
<div></div>
<div><span style="FONT-FAMILY: Arial">
<div><span style="FONT-FAMILY: Arial">一、开门见山</span></div>
<div></div>
<div><span style="FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; 这些时间，瞎子也看得见，AJAX正大踏步的朝我们走来。不管我们是拥护也好，反对也罢，还是视而不见，AJAX像一阵潮流，席转了我们所有的人。<br />
&nbsp;&nbsp;&nbsp; 关于AJAX的定义也好，大话也好，早有人在网上发表了汗牛充栋的文字，在这里我也不想照本宣科。<br />
&nbsp;&nbsp;&nbsp; 只想说说我感觉到的一些优点，对于不对，大家也可以和我讨论：<br />
&nbsp;&nbsp;&nbsp; 首先是异步交互，用户感觉不到页面的提交，当然也不等待页面返回。这是使用了AJAX技术的页面给用户的第一感觉。<br />
&nbsp;&nbsp;&nbsp; 其次是响应速度快，这也是用户强烈体验。<br />
&nbsp;&nbsp;&nbsp; 然后是与我们开发者相关的，复杂UI的成功处理，一直以来，我们对B/S模式的UI不如C/S模式UI丰富而苦恼。现在由于AJAX大量使用JS，使得复杂的UI的设计变得更加成功。<br />
&nbsp;&nbsp;&nbsp; 最后，AJAX请求的返回对象为XML文件，这也是一个潮流，就是WEB SERVICE潮流一样。易于和WEB SERVICE结合起来。<br />
&nbsp;&nbsp; &nbsp;好了，闲话少说，让我们转入正题吧。<br />
&nbsp;&nbsp;&nbsp; 我们的第一个例子是基于Servlet为后台的一个web应用。<br />
&nbsp;<br />
&nbsp;<br />
二、基于Servlet的AJAX</span></div>
<div></div>
<div><span style="FONT-FAMILY: Arial">&nbsp;&nbsp; &nbsp;第一个例子是关于关联选择框的问题，如图：<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 这是一个很常见的UI，当用户在第一个选择框里选择ZHEJIANG时，第二个选择框要出现ZHEJIANG的城市；当用户在第一个选择框里选择JIANGSU时，第二个选择框里要出现JIANGSU的城市。<br />
&nbsp;&nbsp;&nbsp; 首先，我们来看配置文件web.xml，在里面配置一个servlet，跟往常一样：<br />
&nbsp;&lt;web-app version=&quot;2.4&quot; <br />
&nbsp;xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot; <br />
&nbsp;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; <br />
&nbsp;xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee <br />
&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot;&gt; <br />
&nbsp;<br />
&nbsp;&lt;servlet&gt; <br />
&nbsp;&lt;servlet-name&gt;SelectCityServlet&lt;/servlet-name&gt; <br />
&nbsp;&lt;servlet-class&gt;com.stephen.servlet.SelectCityServlet&lt;/servlet-class&gt; <br />
&nbsp;&lt;/servlet&gt; <br />
&nbsp;<br />
&nbsp;&lt;servlet-mapping&gt; <br />
&nbsp;&lt;servlet-name&gt;SelectCityServlet&lt;/servlet-name&gt; <br />
&nbsp;&lt;url-pattern&gt;/servlet/SelectCityServlet&lt;/url-pattern&gt; <br />
&nbsp;&lt;/servlet-mapping&gt; <br />
&nbsp;<br />
&nbsp;&lt;/web-app&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 然后，来看我们的JSP文件：<br />
&nbsp;&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;<br />
&nbsp;&lt;html&gt;<br />
&nbsp;&lt;head&gt;<br />
&nbsp;&lt;title&gt;MyHtml.html&lt;/title&gt;<br />
&nbsp;<br />
&nbsp;&lt;meta http-equiv=&quot;keywords&quot; content=&quot;keyword1,keyword2,keyword3&quot;&gt;<br />
&nbsp;&lt;meta http-equiv=&quot;description&quot; content=&quot;this is my page&quot;&gt;<br />
&nbsp;<br />
&nbsp;&lt;!--&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;./styles.css&quot;&gt;--&gt;<br />
&nbsp;<br />
&nbsp;&lt;/head&gt;<br />
&nbsp;&lt;script type=&quot;text/javascript&quot;&gt;<br />
&nbsp;function getResult(stateVal) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var url = &quot;servlet/SelectCityServlet?state=&quot;+stateVal; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (window.XMLHttpRequest) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req = new XMLHttpRequest(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else if (window.ActiveXObject) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(req){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req.open(&quot;GET&quot;,url, true); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req.onreadystatechange = complete; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req.send(null); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;} <br />
&nbsp;function complete(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (req.readyState == 4) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (req.status == 200) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var city = req.responseXML.getElementsByTagName(&quot;city&quot;); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //alert(city.length);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var str=new Array();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var i=0;i&lt;city.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str[i]=city[i].firstChild.data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //alert(document.getElementById(&quot;city&quot;));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buildSelect(str,document.getElementById(&quot;city&quot;));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;}<br />
&nbsp;function buildSelect(str,sel) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sel.options.length=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var i=0;i&lt;str.length;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sel.options[sel.options.length]=new Option(str[i],str[i])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;}<br />
&nbsp;&lt;/script&gt;<br />
&nbsp;&lt;body&gt;<br />
&nbsp;&lt;select name=&quot;state&quot; onChange=&quot;getResult(this.value)&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value=&quot;&quot;&gt;Select&lt;/option&gt;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value=&quot;zj&quot;&gt;ZEHJIANG&lt;/option&gt;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value=&quot;zs&quot;&gt;JIANGSU&lt;/option&gt;&gt;<br />
&nbsp;&lt;/select&gt;<br />
&nbsp;&lt;select id=&quot;city&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;&quot;&gt;CITY&lt;/option&gt;<br />
&nbsp;&lt;/select&gt;<br />
&nbsp;&lt;/body&gt;<br />
&nbsp;&lt;/html&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 第一眼看来，跟我们平常的JSP没有两样。仔细一看，不同在JS里头。<br />
&nbsp;&nbsp;&nbsp; 我们首先来看第一个方法：getResult(stateVal)，在这个方法里，首先是取得XmlHttpRequest；然后设置该请求的url：req.open(&quot;GET&quot;,url, true);接着设置请求返回值的接收方法：req.onreadystatechange = complete;该返回值的接收方法为&mdash;&mdash;complete();最后是发送请求：req.send(null);<br />
&nbsp;&nbsp;&nbsp; 然后我们来看我们的返回值接收方法：complete()，这这个方法里，首先判断是否正确返回，如果正确返回，用DOM对返回的XML文件进行解析。关于DOM的使用，这里不再讲述，请大家参阅相关文档。得到city的值以后，再通过buildSelect(str,sel)方法赋值到相应的选择框里头去。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 最后我们来看看Servlet文件：<br />
&nbsp;import java.io.IOException;<br />
&nbsp;import java.io.PrintWriter;<br />
&nbsp;<br />
&nbsp;import javax.servlet.ServletException;<br />
&nbsp;import javax.servlet.http.HttpServlet;<br />
&nbsp;import javax.servlet.http.HttpServletRequest;<br />
&nbsp;import javax.servlet.http.HttpServletResponse;<br />
&nbsp;<br />
&nbsp;/**<br />
&nbsp; * @author Administrator<br />
&nbsp; *<br />
&nbsp; * TODO To change the template for this generated type comment go to<br />
&nbsp; * Window - Preferences - Java - Code Style - Code Templates<br />
&nbsp; */<br />
&nbsp;public class SelectCityServlet extends HttpServlet {<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public SelectCityServlet() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void destroy() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.destroy(); <br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void doGet(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ServletException, IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType(&quot;text/xml&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setHeader(&quot;Cache-Control&quot;, &quot;no-cache&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String state = request.getParameter(&quot;state&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sb=new StringBuffer(&quot;&lt;state&gt;&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (&quot;zj&quot;.equals(state)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(&quot;&lt;city&gt;hangzhou&lt;/city&gt;&lt;city&gt;huzhou&lt;/city&gt;&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if(&quot;zs&quot;.equals(state)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(&quot;&lt;city&gt;nanjing&lt;/city&gt;&lt;city&gt;yangzhou&lt;/city&gt;&lt;city&gt;suzhou&lt;/city&gt;&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(&quot;&lt;/state&gt;&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter out=response.getWriter();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(sb.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp; 这个类也十分简单，首先是从request里取得state参数，然后根据state参数生成相应的XML文件，最后将XML文件输出到PrintWriter对象里。<br />
&nbsp;&nbsp;&nbsp; 到现在为止，第一个例子的代码已经全部结束。是不是比较简单？我们进入到第二个实例吧！<br />
&nbsp;&nbsp;&nbsp; 这次是基于JSP的AJAX的一个应用。<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
三、基于JSP的AJAX</span></div>
<div></div>
<div><span style="FONT-FAMILY: Arial">&nbsp;&nbsp; 这个例子是关于输入校验的问题，我们知道，在申请用户的时候，需要去数据库对该用户性进行唯一性确认，然后才能继续往下申请。如图：<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 这种校验需要访问后台数据库，但又不希望用户在这里提交后等待，当然是AJAX技术大显身手的时候了。<br />
&nbsp;&nbsp;&nbsp; 首先来看显示UI的JSP:<br />
&nbsp;&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;<br />
&nbsp;&lt;html&gt;<br />
&nbsp;&lt;head&gt;<br />
&nbsp;&lt;title&gt;Check.html&lt;/title&gt;<br />
&nbsp;<br />
&nbsp;&lt;meta http-equiv=&quot;keywords&quot; content=&quot;keyword1,keyword2,keyword3&quot;&gt;<br />
&nbsp;&lt;meta http-equiv=&quot;description&quot; content=&quot;this is my page&quot;&gt;<br />
&nbsp;<br />
&nbsp;&lt;!--&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;./styles.css&quot;&gt;--&gt;<br />
&nbsp;<br />
&nbsp;&lt;/head&gt;<br />
&nbsp;&lt;script type=&quot;text/javascript&quot;&gt;<br />
&nbsp;&nbsp;var http_request = false;<br />
&nbsp; function send_request(url) {//初始化、指定处理函数、发送请求的函数<br />
&nbsp;&nbsp; http_request = false;<br />
&nbsp;&nbsp; //开始初始化XMLHttpRequest对象<br />
&nbsp;&nbsp; if(window.XMLHttpRequest) { //Mozilla 浏览器<br />
&nbsp;&nbsp;&nbsp; http_request = new XMLHttpRequest();<br />
&nbsp;&nbsp;&nbsp; if (http_request.overrideMimeType) {//设置MiME类别<br />
&nbsp;&nbsp;&nbsp;&nbsp; http_request.overrideMimeType('text/xml');<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; else if (window.ActiveXObject) { // IE浏览器<br />
&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp; http_request = new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);<br />
&nbsp;&nbsp;&nbsp; } catch (e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http_request = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; } catch (e) {}<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; if (!http_request) { // 异常，创建对象实例失败<br />
&nbsp;&nbsp;&nbsp; window.alert(&quot;不能创建XMLHttpRequest对象实例.&quot;);<br />
&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; http_request.onreadystatechange = processRequest;<br />
&nbsp;&nbsp; // 确定发送请求的方式和URL以及是否同步执行下段代码<br />
&nbsp;&nbsp; http_request.open(&quot;GET&quot;, url, true);<br />
&nbsp;&nbsp; http_request.send(null);<br />
&nbsp; }<br />
&nbsp; // 处理返回信息的函数<br />
&nbsp;&nbsp;&nbsp;&nbsp; function processRequest() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (http_request.readyState == 4) { // 判断对象状态<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (http_request.status == 200) { // 信息已经成功返回，开始处理信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(http_request.responseText);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { //页面不正常<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(&quot;您所请求的页面有异常。&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp; function userCheck() {<br />
&nbsp;&nbsp; var f = document.form1;<br />
&nbsp;&nbsp; var username = f.username.value;<br />
&nbsp;&nbsp; if(username==&quot;&quot;) {<br />
&nbsp;&nbsp;&nbsp; window.alert(&quot;The user name can not be null!&quot;);<br />
&nbsp;&nbsp;&nbsp; f.username.focus();<br />
&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; else {<br />
&nbsp;&nbsp;&nbsp; send_request('check1.jsp?username='+username);<br />
&nbsp;&nbsp; }<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp;&lt;/script&gt;<br />
&nbsp;&lt;body&gt;<br />
&nbsp;&nbsp;&lt;form name=&quot;form1&quot; action=&quot;&quot; method=&quot;post&quot;&gt;<br />
&nbsp;User Name:&lt;input type=&quot;text&quot; name=&quot;username&quot; value=&quot;&quot;&gt;&amp;nbsp;<br />
&nbsp;&lt;input type=&quot;button&quot; name=&quot;check&quot; value=&quot;check&quot; onClick=&quot;userCheck()&quot;&gt;<br />
&nbsp;&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;submit&quot;&gt;<br />
&nbsp;&lt;/form&gt;<br />
&nbsp;&lt;/body&gt;<br />
&nbsp;&lt;/html&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 所有的JS都跟上一个例子一样，不同的只是对返回值的操作，这次是用alert来显示：alert(http_request.responseText);<br />
&nbsp;&nbsp;&nbsp; 我们来看处理逻辑JSP:<br />
&nbsp;&lt;%@ page contentType=&quot;text/html; charset=gb2312&quot; language=&quot;java&quot; errorPage=&quot;&quot; %&gt;<br />
&nbsp;&lt;%<br />
&nbsp;String username= request.getParameter(&quot;username&quot;);<br />
&nbsp;if(&quot;educhina&quot;.equals(username)) out.print(&quot;用户名已经被注册，请更换一个用户名。&quot;);<br />
&nbsp;else out.print(&quot;用户名尚未被使用，您可以继续。&quot;);<br />
&nbsp;%&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 非常简单，先取得参数，然后作处理，最后将结果打印在out里。<br />
&nbsp;&nbsp;&nbsp; 我们的第三个例子仍然以这个唯一性校验为例子，这次结合Struts开发框架来完成AJAX的开发。<br />
&nbsp;<br />
&nbsp;<br />
四、基于Struts的AJAX</span></div>
<div><span style="FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; 首先，我们仍然是对Struts应用来做配置，仍然是在struts-config,xml文件里做配置，如下：<br />
&nbsp;&lt;action type=&quot;com.ajax.CheckAction&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; scope=&quot;request&quot; path=&quot;/ajax/check&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name=&quot;success&quot; path=&quot;/check.jsp&quot;/&gt;<br />
&nbsp;&lt;/action&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 跟普通的Struts应用的配置一样，只是没有ActionForm的配置。<br />
&nbsp;&nbsp;&nbsp; 下面是Action类：<br />
&nbsp;package com.ajax;<br />
&nbsp;<br />
&nbsp;import java.io.PrintWriter;<br />
&nbsp;<br />
&nbsp;import javax.servlet.http.HttpServletRequest;<br />
&nbsp;import javax.servlet.http.HttpServletResponse;<br />
&nbsp;<br />
&nbsp;import org.apache.struts.action.Action;<br />
&nbsp;import org.apache.struts.action.ActionForm;<br />
&nbsp;import org.apache.struts.action.ActionForward;<br />
&nbsp;import org.apache.struts.action.ActionMapping;<br />
&nbsp;import org.apache.struts.action.DynaActionForm;<br />
&nbsp;<br />
&nbsp;/**<br />
&nbsp; * @author Administrator<br />
&nbsp; *<br />
&nbsp; * TODO To change the template for this generated type comment go to<br />
&nbsp; * Window - Preferences - Java - Code Style - Code Templates<br />
&nbsp; */<br />
&nbsp;public class CheckAction extends Action<br />
&nbsp;{<br />
&nbsp;&nbsp;public final ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp;throws Exception<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;haha...............................&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;String username= request.getParameter(&quot;username&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(username);<br />
&nbsp;&nbsp;&nbsp;&nbsp;String retn;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(&quot;educhina&quot;.equals(username)) retn = &quot;Can't use the same name with the old use,pls select a difference...&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;else retn = &quot;congraducation!you can use this name....&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter out=response.getWriter();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(retn);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;return mapping.findForward(&quot;success&quot;);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;public static void main(String[] args)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 我们可以看到里面的逻辑跟上例中Servlet里的逻辑一样。最后，我们来看看JSP:<br />
&nbsp;&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;<br />
&nbsp;&lt;html&gt;<br />
&nbsp;&lt;head&gt;<br />
&nbsp;&lt;title&gt;Check.html&lt;/title&gt;<br />
&nbsp;<br />
&nbsp;&lt;meta http-equiv=&quot;keywords&quot; content=&quot;keyword1,keyword2,keyword3&quot;&gt;<br />
&nbsp;&lt;meta http-equiv=&quot;description&quot; content=&quot;this is my page&quot;&gt;<br />
&nbsp;<br />
&nbsp;&lt;!--&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;./styles.css&quot;&gt;--&gt;<br />
&nbsp;<br />
&nbsp;&lt;/head&gt;<br />
&nbsp;&lt;script type=&quot;text/javascript&quot;&gt;<br />
&nbsp;&nbsp;var http_request = false;<br />
&nbsp; function send_request(url) {//初始化、指定处理函数、发送请求的函数<br />
&nbsp;&nbsp; http_request = false;<br />
&nbsp;&nbsp; //开始初始化XMLHttpRequest对象<br />
&nbsp;&nbsp; if(window.XMLHttpRequest) { //Mozilla 浏览器<br />
&nbsp;&nbsp;&nbsp; http_request = new XMLHttpRequest();<br />
&nbsp;&nbsp;&nbsp; if (http_request.overrideMimeType) {//设置MiME类别<br />
&nbsp;&nbsp;&nbsp;&nbsp; http_request.overrideMimeType('text/xml');<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; else if (window.ActiveXObject) { // IE浏览器<br />
&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp; http_request = new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);<br />
&nbsp;&nbsp;&nbsp; } catch (e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http_request = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; } catch (e) {}<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; if (!http_request) { // 异常，创建对象实例失败<br />
&nbsp;&nbsp;&nbsp; window.alert(&quot;不能创建XMLHttpRequest对象实例.&quot;);<br />
&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; http_request.onreadystatechange = processRequest;<br />
&nbsp;&nbsp; // 确定发送请求的方式和URL以及是否同步执行下段代码<br />
&nbsp;&nbsp; http_request.open(&quot;GET&quot;, url, true);<br />
&nbsp;&nbsp; http_request.send(null);<br />
&nbsp; }<br />
&nbsp; // 处理返回信息的函数<br />
&nbsp;&nbsp;&nbsp;&nbsp; function processRequest() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (http_request.readyState == 4) { // 判断对象状态<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (http_request.status == 200) { // 信息已经成功返回，开始处理信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(http_request.responseText);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { //页面不正常<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(&quot;您所请求的页面有异常。&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp; function userCheck() {<br />
&nbsp;&nbsp; var f = document.forms[0];<br />
&nbsp;&nbsp; var username = f.username.value;<br />
&nbsp;&nbsp; if(username==&quot;&quot;) {<br />
&nbsp;&nbsp;&nbsp; window.alert(&quot;The user name can not be null!&quot;);<br />
&nbsp;&nbsp;&nbsp; f.username.focus();<br />
&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; else {<br />
&nbsp;&nbsp;&nbsp; send_request('ajax/check.do?username='+username);<br />
&nbsp;&nbsp; }<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp;&lt;/script&gt;<br />
&nbsp;&lt;body&gt;<br />
&nbsp;&nbsp;&lt;form name=&quot;form1&quot; action=&quot;&quot; method=&quot;post&quot;&gt;<br />
&nbsp;User Name:&lt;input type=&quot;text&quot; name=&quot;username&quot; value=&quot;&quot;&gt;&amp;nbsp;<br />
&nbsp;&lt;input type=&quot;button&quot; name=&quot;check&quot; value=&quot;check&quot; onClick=&quot;userCheck()&quot;&gt;<br />
&nbsp;&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;submit&quot;&gt;<br />
&nbsp;&lt;/form&gt;<br />
&nbsp;&lt;/body&gt;<br />
&nbsp;&lt;/html&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 我们可以看到，JSP基本是一样的，除了要发送的url：ajax/check.do?username='+username。<br />
&nbsp;&nbsp;&nbsp; 最后，我们来看一个基于Struts和AJAX的复杂一些的例子，如果不用AJAX技术，UI的代码将十分复杂。</span></div>
<div><span style="FONT-FAMILY: Arial">来源:http://blog.csdn.net/hivon/archive/2005/12/15/552860.aspx <br />
</span></div>
</span></div>
          <br/>
          <span style="color:red;">
            <a href="http://lihaiyan.javaeye.com/blog/127822#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Sep 2007 10:50:06 +0800</pubDate>
        <link>http://lihaiyan.javaeye.com/blog/127822</link>
        <guid>http://lihaiyan.javaeye.com/blog/127822</guid>
      </item>
      <item>
        <title>利用Spring AOP 缓存方法结果集(下)</title>
        <author>lihaiyan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lihaiyan.javaeye.com">lihaiyan</a>&nbsp;
          链接：<a href="http://lihaiyan.javaeye.com/blog/127818" style="color:red;">http://lihaiyan.javaeye.com/blog/127818</a>&nbsp;
          发表时间: 2007年09月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">invoke</span><span style="COLOR: black; FONT-FAMILY: 宋体">方法中</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">,</span><span style="COLOR: black; FONT-FAMILY: 宋体">首先根据</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">key</span><span style="COLOR: black; FONT-FAMILY: 宋体">查询缓存</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">(key=className + methodName + arguments)</span></font></p>
<p class="MsoNormal"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">,</span><span style="COLOR: black; FONT-FAMILY: 宋体">缓存中存在则返回</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">,</span><span style="COLOR: black; FONT-FAMILY: 宋体">否之调用</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">invocation.proceed()</span><span style="COLOR: black; FONT-FAMILY: 宋体">返回结果</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">.</span></font></p>
<p class="MsoNormal"><font size="2"><span style="COLOR: black; FONT-FAMILY: 宋体">在</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">Spring</span><span style="COLOR: black; FONT-FAMILY: 宋体">配置文件中定义拦截器</span></font></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体"><font size="2"></font></span></p>
<div align="center">
<table class="MsoNormalTable" cellspacing="1" border="0" width="90%" cellpadding="0" style="MARGIN-LEFT: -18.35pt; WIDTH: 90%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #d1d7dc 1pt solid; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d1d7dc 1pt solid; PADDING-LEFT: 2.25pt; BACKGROUND: #fafafa; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d1d7dc 1pt solid; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d1d7dc 1pt solid">
            <p><font size="2"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;bean</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">id=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;methodCacheInterceptor&quot;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">class=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;org.taha.interceptor.MethodCacheInterceptor&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span> </font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;property</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">name=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;cache&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;ref</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">local=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;methodCache&quot;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">/&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/property&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'"><font size="2">&lt;/bean&gt;</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;bean</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">id=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;methodCachePointCut&quot;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">class=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;org.springframework.aop.support.RegexpMethodPointcutAdvisor&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;property</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">name=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;advice&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;ref</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">local=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;methodCacheInterceptor&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">/&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/property&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;property</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">name=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;patterns&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;list&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;value&gt;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">.*methodOne</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/value&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;value&gt;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">.*methodTwo</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/value&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/list&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/property&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'"><font size="2">&lt;/bean&gt;</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;bean</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">id=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;myBean&quot;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">class=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;org.springframework.aop.framework.ProxyFactoryBean&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;property</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">name=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;target&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;bean</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">class=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;org.taha.beans.MyBean&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">/&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/property&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;property</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">name=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;interceptorNames&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;list&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;value&gt;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">methodCachePointCut</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/value&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/list&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/property&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'"><font size="2">&lt;/bean&gt;</font></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><font size="2"><span style="FONT-FAMILY: 宋体">这里</span><span lang="EN">org.springframework.aop.support.</span><span lang="EN-US" style="FONT-FAMILY: 'Courier New'">RegexpMethodPointcutAdvisor</span><span style="FONT-FAMILY: 宋体">是一个正规表达式切入点，</span></font></p>
<p><font size="2"><span style="FONT-FAMILY: 宋体">使用</span><span lang="EN">Perl 5</span><span style="FONT-FAMILY: 宋体">的正规表达式的语法</span><span lang="EN">, </span><span style="FONT-FAMILY: 宋体">基</span><span lang="EN-US" style="FONT-FAMILY: 'Courier New'">Jakarta ORO</span><span style="FONT-FAMILY: 宋体">。</span><span lang="EN">(</span><span style="FONT-FAMILY: 宋体">有空写个文档</span><span lang="EN">,</span><span style="FONT-FAMILY: 宋体">自己研究一下</span><span lang="EN">).</span></font></p>
<div align="center">
<table class="MsoNormalTable" cellspacing="1" border="0" width="90%" cellpadding="0" style="MARGIN-LEFT: -18.35pt; WIDTH: 90%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #d1d7dc 1pt solid; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d1d7dc 1pt solid; PADDING-LEFT: 2.25pt; BACKGROUND: #fafafa; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d1d7dc 1pt solid; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d1d7dc 1pt solid">
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;property</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">name=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;target&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;bean</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">class=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;org.taha.beans.MyBean&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">/&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/property&gt;</span></font></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'">org.taha.beans.MyBean</span><span style="FONT-FAMILY: 宋体">是我们需要做缓存处理的类</span><span lang="EN-US" style="FONT-FAMILY: 'Courier New'">.<span style="COLOR: navy"> </span></span></font></p>
<p class="MsoNormal" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'">methodCachePointCut</span><span style="FONT-FAMILY: 宋体">中</span></font></p>
<div align="center">
<table class="MsoNormalTable" cellspacing="1" border="0" width="90%" cellpadding="0" style="MARGIN-LEFT: -18.35pt; WIDTH: 90%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #d1d7dc 1pt solid; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d1d7dc 1pt solid; PADDING-LEFT: 2.25pt; BACKGROUND: #fafafa; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d1d7dc 1pt solid; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d1d7dc 1pt solid">
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;value&gt;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">.*methodOne</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/value&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;value&gt;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">.*methodTwo</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/value&gt;</span></font></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal" style="TEXT-ALIGN: left"><font size="2"><span style="COLOR: black; FONT-FAMILY: 宋体">则是指定的模式匹配方法</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">,</span><span style="COLOR: black; FONT-FAMILY: 宋体">对应于</span><span lang="EN-US" style="FONT-FAMILY: 'Courier New'">org.taha.beans.MyBean</span><span style="FONT-FAMILY: 宋体">中的方法</span><span lang="EN-US" style="FONT-FAMILY: 'Courier New'">. </span><span style="FONT-FAMILY: 宋体">这里指定了</span><span lang="EN-US" style="FONT-FAMILY: 'Courier New'">2</span><span style="FONT-FAMILY: 宋体">个方法需要做缓存处理</span><span lang="EN-US" style="FONT-FAMILY: 'Courier New'">.</span></font></p>
<p class="MsoNormal" style="TEXT-ALIGN: left"><font size="2"><span style="FONT-FAMILY: 宋体">呵呵</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体">就是这么简单</span><span lang="EN-US">.</span><span style="FONT-FAMILY: 宋体">这样每次对</span><span lang="EN-US" style="FONT-FAMILY: 'Courier New'">org.taha.beans.MyBean</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">methodOne</span><span style="COLOR: black; FONT-FAMILY: 宋体">方法进行调用</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">,</span><span style="COLOR: black; FONT-FAMILY: 宋体">都会首先从缓存查找</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">,</span></font></p>
<p class="MsoNormal" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"></span><font size="2"><span style="COLOR: black; FONT-FAMILY: 宋体">其次才会查询数据库</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">. </span><span style="COLOR: black; FONT-FAMILY: 宋体">这样我就不需要在</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">xx.hbm.xml</span><span style="COLOR: black; FONT-FAMILY: 宋体">来指定讨厌的</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">cache</span><span style="COLOR: black; FONT-FAMILY: 宋体">了</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">.</span><span style="COLOR: black; FONT-FAMILY: 宋体">也不需要在开发阶段来关心缓存</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">.</span></font></p>
<p class="MsoNormal" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"></span><span style="COLOR: black; FONT-FAMILY: 宋体">一切</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">AOP</span><span style="COLOR: black; FONT-FAMILY: 宋体">搞定</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">.. ^_^<br />
</span></font></p>
          <br/>
          <span style="color:red;">
            <a href="http://lihaiyan.javaeye.com/blog/127818#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Sep 2007 10:39:56 +0800</pubDate>
        <link>http://lihaiyan.javaeye.com/blog/127818</link>
        <guid>http://lihaiyan.javaeye.com/blog/127818</guid>
      </item>
      <item>
        <title>利用Spring AOP 缓存方法结果集(上)</title>
        <author>lihaiyan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lihaiyan.javaeye.com">lihaiyan</a>&nbsp;
          链接：<a href="http://lihaiyan.javaeye.com/blog/127817" style="color:red;">http://lihaiyan.javaeye.com/blog/127817</a>&nbsp;
          发表时间: 2007年09月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体"><font size="2">我们都知道<span lang="EN-US">Hibernate</span>可以用<span lang="EN-US">ehcache</span>来作为<span lang="EN-US">Second Level Cache.</span>主要是针对<span lang="EN-US">POJO</span>的缓存<span lang="EN-US">,</span>而且缓存的读取</font></span></p>
<p class="MsoNormal" style="TEXT-ALIGN: left"><font size="2"><span style="FONT-FAMILY: 宋体">在<span lang="EN-US">Hibernate</span>中是写死<span lang="EN-US">.</span>实际运用中感觉很不灵活<span lang="EN-US">.</span></span><span style="FONT-FAMILY: 宋体">今天看到一篇介绍利用<span lang="EN-US">Spring Interceptor </span>来缓存指定</span></font></p>
<p class="MsoNormal" style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体"><font size="2">方法结果的例子<span lang="EN-US">,</span>感觉很不错<span lang="EN-US">,</span>充分体会到<span lang="EN-US">AOP</span>的强大力量<span lang="EN-US"> :)</span></font></span></p>
<p class="MsoNormal" style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体"><font size="2">首先配置<span lang="EN-US">ehcache.xml</span></font></span></p>
<div align="center">
<table class="MsoNormalTable" cellspacing="1" border="0" width="90%" cellpadding="0" style="MARGIN-LEFT: -18.35pt; WIDTH: 90%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #d1d7dc 1pt solid; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d1d7dc 1pt solid; PADDING-LEFT: 2.25pt; BACKGROUND: #fafafa; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d1d7dc 1pt solid; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d1d7dc 1pt solid">
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: Courier">&nbsp;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'"><font color="#000000" face="Courier">&lt;ehcache&gt;</font></span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'"><font color="#000000" face="Courier"></font></span></font>&nbsp;</p>
            <font size="2"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'"><font color="#000000" face="Courier">
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><br />
            &nbsp;&nbsp;&nbsp; &lt;diskStore path=&quot;java.io.tmpdir&quot;/&gt; </p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&lt;defaultCache name=&quot;default&quot;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxElementsInMemory=&quot;300&quot;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eternal=&quot;false&quot;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToIdleSeconds=&quot;500&quot;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToLiveSeconds=&quot;500&quot;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; overflowToDisk=&quot;true&quot;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; diskPersistent=&quot;false&quot;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; diskExpiryThreadIntervalSeconds=&quot;110&quot;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><br />
            &nbsp;&nbsp;&nbsp; &lt;cache name=&quot;org.taha.cache.METHOD_CACHE&quot;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxElementsInMemory=&quot;300&quot;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eternal=&quot;false&quot;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToIdleSeconds=&quot;500&quot;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToLiveSeconds=&quot;500&quot;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; overflowToDisk=&quot;true&quot;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left">&lt;/ehcache&gt;<br />
            </p>
            </font></span></font></td>
        </tr>
    </tbody>
</table>
</div>
<p align="center"><font size="2"></font>&nbsp;</p>
<p align="left"><font size="2"><span style="FONT-FAMILY: 宋体">接下在</span><span lang="EN-US">Spring</span><span style="FONT-FAMILY: 宋体">配置文件中定义</span><span lang="EN-US">Ehcache</span><span style="FONT-FAMILY: 宋体">组件</span></font></p>
<p align="left"><span style="FONT-FAMILY: 宋体"><font size="2"></font></span>&nbsp;</p>
<div align="center">
<table class="MsoNormalTable" cellspacing="1" border="0" width="90%" cellpadding="0" style="MARGIN-LEFT: -18.35pt; WIDTH: 90%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #d1d7dc 1pt solid; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d1d7dc 1pt solid; PADDING-LEFT: 2.25pt; BACKGROUND: #fafafa; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d1d7dc 1pt solid; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d1d7dc 1pt solid">
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;bean</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">id=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;cacheManager&quot;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">class=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;org.springframework.cache.ehcache.EhCacheManagerFactoryBean&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;property</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">name=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;configLocation&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;value&gt;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">classpath:ehcache.xml</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/value&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/property&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'"><font size="2">&lt;/bean&gt;</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;bean</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">id=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;methodCache&quot;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">class=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;org.springframework.cache.ehcache.EhCacheFactoryBean&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;property</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">name=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;cacheManager&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;ref</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">local=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;cacheManager&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">/&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/property&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;property</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">name=</span><span lang="EN-US" style="COLOR: navy; FONT-FAMILY: 'Courier New'">&quot;cacheName&quot;</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;value&gt;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">org.taha.cache.METHOD_CACHE</span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/value&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp; </span><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'">&lt;/property&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #0000e1; FONT-FAMILY: 'Courier New'"><font size="2">&lt;/bean<span style="BACKGROUND: white">&gt;</span></font></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体"><font size="2">建立我们自己的方法拦截器</font></span><a name="CachingtheresultofmethodsusingSpringandE"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: Verdana"><font size="2">MethodCacheInterceptor</font></span></a><span lang="EN-US" style="COLOR: black; FONT-FAMILY: Verdana"><font size="2">.</font></span></p>
<p class="MsoNormal" align="left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: Verdana">MethodCacheInterceptor</span><span style="COLOR: black; FONT-FAMILY: 宋体">实现了</span><span class="nobr"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: Verdana"><a href="http://cvs.sourceforge.net/viewcvs.py/aopalliance/aopalliance/src/main/org/aopalliance/intercept/MethodInterceptor.java?view=markup" title="Visit page outside Confluence"><font color="#000080">org.aopalliance.intercept.MethodInterceptor<span style="TEXT-DECORATION: none"><img src="file:///C:/Documents%20and%20Settings/znjq/桌面/我们都知道Hibernate可以用ehcache来作为Second%20Level%20Cache.files/image001.gif" border="0" onclick="javascript:window.open(this.src);" height="7" onload="rsimg(this,420)" alt="" style="CURSOR: pointer" width="7" /></span></font></a></span></span><span class="nobr"><span style="COLOR: black; FONT-FAMILY: 宋体">接口</span></span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: Verdana">. </span></font></p>
<div align="center">
<table class="MsoNormalTable" cellspacing="1" border="0" width="90%" cellpadding="0" style="MARGIN-LEFT: -18.35pt; WIDTH: 90%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #d1d7dc 1pt solid; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d1d7dc 1pt solid; PADDING-LEFT: 2.25pt; BACKGROUND: #fafafa; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d1d7dc 1pt solid; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d1d7dc 1pt solid">
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">import</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> java.io.Serializable;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">import</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> net.sf.ehcache.Cache;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">import</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> net.sf.ehcache.Element;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">import</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> org.aopalliance.intercept.MethodInterceptor;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">import</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> org.aopalliance.intercept.MethodInvocation;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">import</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> org.springframework.beans.factory.InitializingBean;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'"><font size="2">/**</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;</span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">*</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span style="COLOR: #3f5fbf; FONT-FAMILY: 宋体">拦截器</span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">,</span><span style="COLOR: #3f5fbf; FONT-FAMILY: 宋体">用于缓存方法返回结果</span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">.</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;</span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">*</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;</span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">*</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #7f9fbf; FONT-FAMILY: 'Courier New'">@version</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">$Id:</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">MethodCacheInterceptor.java</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">v</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">1.0</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">2004</span><span lang="EN-US" style="COLOR: #7f7f9f; FONT-FAMILY: 'Courier New'">-</span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">11</span><span lang="EN-US" style="COLOR: #7f7f9f; FONT-FAMILY: 'Courier New'">-</span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">28</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">14:57:00</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">Znjq</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">Exp</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">$</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;</span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">*</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #7f9fbf; FONT-FAMILY: 'Courier New'">@author</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">&lt;a href=&quot;mailto:znjq1980@etang.com&quot;&gt;Znjq</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #7f7f9f; FONT-FAMILY: 'Courier New'">&lt;/a&gt;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;</span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">*/</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">public</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">class</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> MethodCacheInterceptor </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">implements</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> MethodInterceptor,</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializingBean {</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">private</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> Cache cache;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">/**</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">*</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">sets</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">cache</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">name</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">to</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">be</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">used</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">*/</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">public</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">void</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> setCache(Cache cache) {</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">this</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">.cache = cache;</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp; }</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'">/*</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; * (non-Javadoc)</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; * </font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp; &nbsp;*/</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">public</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> Object invoke(MethodInvocation invocation) </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">throws</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> Throwable {</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String targetName = invocation.getThis().getClass().getName();</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String methodName = invocation.getMethod().getName();</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] arguments = invocation.getArguments();</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object result;</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String cacheKey = getCacheKey(targetName, methodName, arguments);</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element element = cache.get(cacheKey);</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">if</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> (element == </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">null</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">) {</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'">//call target/sub-interceptor</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = invocation.proceed();</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'">//cache method result</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element = </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">new</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> Element(cacheKey, (Serializable) result);</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cache.put(element);</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">return</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> element.getValue();</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp; }</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">/**</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">*</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">creates</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">cache</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">key:</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">targetName.methodName.argument0.argument1...</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'">*/</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">private</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> String getCacheKey(String targetName, String methodName,</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] arguments) {</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sb = </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">new</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> StringBuffer();</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(targetName).append(</span><span lang="EN-US" style="COLOR: #2a00ff; FONT-FAMILY: 'Courier New'">&quot;.&quot;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">).append(methodName);</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">if</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> ((arguments != </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">null</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">) &amp;&amp; (arguments.length != 0)) {</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">for</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> (</span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">int</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> i = 0; i &lt; arguments.length; i++) {</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(</span><span lang="EN-US" style="COLOR: #2a00ff; FONT-FAMILY: 'Courier New'">&quot;.&quot;</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">).append(arguments[i]);</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">return</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> sb.toString();</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp; }</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'">/*</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; * (non-Javadoc)</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; * </font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; */</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">public</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">void</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> afterPropertiesSet() </span><span lang="EN-US" style="COLOR: #7f0055; FONT-FAMILY: 'Courier New'">throws</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"> Exception {</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><font size="2"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'">// </span><span lang="EN-US" style="COLOR: #7f9fbf; FONT-FAMILY: 'Courier New'">TODO</span><span lang="EN-US" style="COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'"> Auto-generated method stub</span></font></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 'Courier New'"><font size="2"></font></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">&nbsp;&nbsp;&nbsp; }</font></span></p>
            <p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 'Courier New'"><font size="2">}</font></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://lihaiyan.javaeye.com/blog/127817#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Sep 2007 10:39:23 +0800</pubDate>
        <link>http://lihaiyan.javaeye.com/blog/127817</link>
        <guid>http://lihaiyan.javaeye.com/blog/127817</guid>
      </item>
      <item>
        <title>关于spring声明式事务管理异常处理的测试和小结</title>
        <author>lihaiyan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lihaiyan.javaeye.com">lihaiyan</a>&nbsp;
          链接：<a href="http://lihaiyan.javaeye.com/blog/127814" style="color:red;">http://lihaiyan.javaeye.com/blog/127814</a>&nbsp;
          发表时间: 2007年09月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>关于spring事务管理以及异常处理的帖子，本论坛争论颇多，各有各的测试代码，也各有各的测试结果， <br />
不知道是spring版本的不同还是各测试的例子的不同而导致测试结果出现差异． <br />
本人也很想弄清楚spring是如何对Service进行事务管理的，并且还去看了一下spring框架关于事务管理几个相关类的源码，可惜由于本人功力有限，只看懂了皮毛． <br />
既然源代码看不懂，那么只有运用例子进行测试，虽然笨了点，不过管是白猫还是黑猫，能捉老鼠就是好猫．：） <br />
为引起不必要的争论，本帖子只针对本案例的测试结果进行小结，并保证此测试代码在本人的运行环境绝对正确．</p>
<p>开发环境： <br />
ＯＳ：windows 2003 Server <br />
Web Server: jakarta-tomcat-5.0.28 <br />
DataBase Server: MS SQL Server 2000 (打了ＳＰ３补丁) <br />
IDE: Eclipse 3.2.0+MyEclipse 5.0GA</p>
<p>测试案例系统结构： <br />
web层&lt;----&gt;Service层&lt;----&gt;DAO层</p>
<p>web层使用struts 1.1，DAO使用的spring的JDBC，spring版本1.2</p>
<p>数据库中有两张表： <br />
student1和Student2，表结构相同：id,name,address．其中id为主键且为自增长型. <br />
student1表中有一条记录： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt">id&nbsp;&nbsp;name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address &nbsp;&nbsp; </li>
    <li class=""><span class="number">1</span>&nbsp;&nbsp;&nbsp;xiaoming&nbsp;&nbsp;&nbsp;&nbsp;wuhan &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp; </li>
    <li class="">student2表中记录为空&nbsp;&nbsp;</li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>测试情形一： <br />
web层捕获异常并处理，DAO层不捕获异常，Service也不捕获异常．</p>
<p>Service层接口：</p>
<p>&nbsp;</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span class="keyword">public</span>&nbsp;<span class="keyword">interface</span>&nbsp;StudentManagerService&nbsp;{ &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp; &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span>&nbsp;<span class="keyword">void</span>&nbsp;&nbsp;bus_method(); &nbsp;&nbsp; </li>
    <li class="">}&nbsp;&nbsp;</li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>DAO层接口 <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span class="keyword">public</span>&nbsp;<span class="keyword">interface</span>&nbsp;StudentDAO&nbsp;{ &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp; &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span>&nbsp;<span class="keyword">void</span>&nbsp;&nbsp;deleteStudent1(); &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span>&nbsp;<span class="keyword">void</span>&nbsp;&nbsp;insertStudent2(); &nbsp;&nbsp; </li>
    <li class="alt">}&nbsp;&nbsp;</li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>StudentDAO接口的实现： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span class="keyword">public</span>&nbsp;<span class="keyword">class</span>&nbsp;StudentDAOImp&nbsp;<span class="keyword">extends</span>&nbsp;JdbcDaoSupport&nbsp;<span class="keyword">implements</span>&nbsp;StudentDAO{ &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//删除student1表中的id=1的记录 </span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span>&nbsp;<span class="keyword">void</span>&nbsp;&nbsp;deleteStudent1(){ &nbsp;&nbsp; </li>
    <li class="">　　　　　JdbcTemplate&nbsp;jt=<span class="keyword">this</span>.getJdbcTemplate(); &nbsp;&nbsp; </li>
    <li class="alt">　　　　　jt.update(<span class="string">&quot;delete&nbsp;from&nbsp;student1&nbsp;where&nbsp;id=1&quot;</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li>
    <li class="">　　　} &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//将student1表中删除的记录插入到student2中,但是此方法实现有错，因为 </span>&nbsp;&nbsp; </li>
    <li class="alt">　　　<span class="comment">//id字段设置为自增长的，所以在插入记录时我们不能指定值 </span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;　&nbsp;<span class="keyword">public</span>&nbsp;<span class="keyword">void</span>&nbsp;&nbsp;insertStudent2(){ &nbsp;&nbsp; </li>
    <li class="alt">　　　　　　　JdbcTemplate&nbsp;jt=<span class="keyword">this</span>.getJdbcTemplate(); &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;arg[]=<span class="keyword">new</span>&nbsp;String[<span class="number">3</span>]; &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arg[<span class="number">0</span>]=<span class="string">&quot;1&quot;</span>; &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arg[<span class="number">1</span>]=<span class="string">&quot;xiaoming&quot;</span>; &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arg[<span class="number">2</span>]=<span class="string">&quot;wuhan&quot;</span>; &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jt.update(<span class="string">&quot;insert&nbsp;student2(id,name,address)&nbsp;values(?,?,?)&quot;</span>,arg); &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp; </li>
    <li class="alt">}&nbsp;&nbsp;&nbsp;</li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>StudentManagerService 接口的实现： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span class="keyword">public</span>&nbsp;<span class="keyword">class</span>&nbsp;StudentManagerServiceImp&nbsp;<span class="keyword">implements</span>&nbsp;StudentManagerService{ &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;<span class="keyword">private</span>&nbsp;StudentDAO&nbsp;&nbsp;stdDAO; &nbsp;&nbsp; </li>
    <li class="alt">&nbsp; &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;<span class="keyword">public</span>&nbsp;<span class="keyword">void</span>&nbsp;setStdDAO(StudentDAO&nbsp;&nbsp;&nbsp;stdDAO){ &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span>.stdDAO=stdDAO; &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;} &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;<span class="comment">//此方法为事务型的：删除student1中的记录成功且插入student2的记录也成功， </span>&nbsp;&nbsp; </li>
    <li class="alt">　<span class="comment">//如果insertStudent2()方法执行失败，那么deleteStudent1()方法也应该会失败 </span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;<span class="keyword">public</span>&nbsp;<span class="keyword">void</span>&nbsp;&nbsp;bus_method(){ &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span>.stdDAO.deleteStudent1(); &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span>.stdDAO.insertStudent2(); &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;} &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp; &nbsp;&nbsp; </li>
    <li class="alt">}&nbsp;&nbsp;&nbsp;</li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>web层: <br />
三个jsp,一个action: <br />
index.jsp ==&gt;首页面．上面仅仅有一个超链接&lt;a herf=&quot;test.do&quot;&gt;执行&lt;/a&gt; <br />
chenggong.jsp ==&gt;Service执行成功后转向的JSP页面 <br />
shibai.jsp　====&gt;Service执行失败后转向的JSP页面</p>
<p>action实现： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span class="keyword">public</span>&nbsp;<span class="keyword">class</span>&nbsp;StudentManagerAction&nbsp;&nbsp;<span class="keyword">extends</span>&nbsp;&nbsp;Action{ &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span>&nbsp;ActionForward&nbsp;execute(ActionMapping&nbsp;mapping,&nbsp;ActionForm&nbsp;form, &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;{ &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span>{ &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebApplicationContext&nbsp;appContext=WebApplicationContextUtils.&nbsp; &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getWebApplicationContext(<span class="keyword">this</span>.getServlet().getServletContext()); &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StudentManagerService&nbsp;stdm=(StudentManagerService)appContext. &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getBean(<span class="string">&quot;stdServiceManager&quot;</span>); &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stdm.bus_method(); &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span>&nbsp;mapping.findForward(<span class="string">&quot;chenggong&quot;</span>); &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">catch</span>(DataAccessException&nbsp;e){ &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(<span class="string">&quot;action&nbsp;execute&nbsp;service&nbsp;exception!&quot;</span>); &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span>&nbsp;mapping.findForward(<span class="string">&quot;shibai&quot;</span>); &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li>
    <li class="alt">}&nbsp;&nbsp;</li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>配置文件：</p>
<p>web.xml <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span class="tag">&lt;?</span><span class="tag-name">xml</span>&nbsp;<span class="attribute">version</span>=<span class="attribute-value">&quot;1.0&quot;</span>&nbsp;<span class="attribute">encoding</span>=<span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span>&nbsp;&nbsp; </li>
    <li class=""><span class="tag">&lt;</span><span class="tag-name">web-app</span>&nbsp;<span class="attribute">xmlns</span>=<span class="attribute-value">&quot;http://java.sun.com/xml/ns/j2ee&quot;</span>&nbsp;<span class="attribute">xmlns:xsi</span>=<span class="attribute-value">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span>&nbsp;<span class="attribute">version</span>=<span class="attribute-value">&quot;2.4&quot;</span>&nbsp;<span class="attribute">xsi:schemaLocation</span>=<span class="attribute-value">&quot;http://java.sun.com/xml/ns/j2ee&nbsp;&nbsp;&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot;</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">context-param</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span>log4jConfigLocation<span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span>/WEB-INF/log4j.properties<span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">context-param</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">context-param</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span>contextConfigLocation<span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span>/WEB-INF/applicationContext.xml<span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">context-param</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">listener</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">listener-class</span><span class="tag">&gt;</span>org.springframework.web.util.Log4jConfigListener<span class="tag">&lt;/</span><span class="tag-name">listener-class</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">listener</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">listener</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">listener-class</span><span class="tag">&gt;</span>org.springframework.web.context.ContextLoaderListener<span class="tag">&lt;/</span><span class="tag-name">listener-class</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">listener</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span>action<span class="tag">&lt;/</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span>org.apache.struts.action.ActionServlet<span class="tag">&lt;/</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span>config<span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span>/WEB-INF/struts-config.xml<span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">init-param</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span>debug<span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span>3<span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">init-param</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span>detail<span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span>3<span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">init-param</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">load-on-startup</span><span class="tag">&gt;</span>0<span class="tag">&lt;/</span><span class="tag-name">load-on-startup</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">servlet</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-mapping</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span>action<span class="tag">&lt;/</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span>*.do<span class="tag">&lt;/</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">servlet-mapping</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class=""><span class="tag">&lt;/</span><span class="tag-name">web-app</span><span class="tag">&gt;</span>&nbsp;&nbsp;</li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>sturts-config.xml <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">struts-config</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">action-mappings</span>&nbsp;<span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">action</span>&nbsp;&nbsp;<span class="attribute">input</span>=<span class="attribute-value">&quot;/index.jsp&quot;</span>&nbsp;&nbsp;<span class="attribute">path</span>=<span class="attribute-value">&quot;/test&quot;</span>&nbsp;&nbsp;<span class="attribute">type</span>=&quot;test.StudentManagerAction&nbsp;&nbsp;&nbsp;<span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">forward</span>&nbsp;<span class="attribute">name</span>=<span class="attribute-value">&quot;chenggong&quot;</span>&nbsp;<span class="attribute">path</span>=<span class="attribute-value">&quot;/chenggong.jsp&quot;</span>&nbsp;<span class="tag">/&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">forward</span>&nbsp;<span class="attribute">name</span>=<span class="attribute-value">&quot;shibai&quot;</span>&nbsp;<span class="attribute">path</span>=<span class="attribute-value">&quot;/shibai.jsp&quot;</span>&nbsp;<span class="tag">/&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">action</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">action-mappings</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">message-resources</span>&nbsp;<span class="attribute">parameter</span>=<span class="attribute-value">&quot;test.ApplicationResources&quot;</span>&nbsp;<span class="tag">/&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">struts-config</span><span class="tag">&gt;</span>&nbsp;&nbsp;</li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>applicationContext.xml <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span class="tag">&lt;?</span><span class="tag-name">xml</span>&nbsp;<span class="attribute">version</span>=<span class="attribute-value">&quot;1.0&quot;</span>&nbsp;<span class="attribute">encoding</span>=<span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&lt;!DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;&quot;-//SPRING//DTD&nbsp;BEAN//EN&quot;&nbsp;&quot;http://www.springframework.org/dtd/spring-beans.dtd&quot;<span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">beans</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span>&nbsp;<span class="attribute">id</span>=<span class="attribute-value">&quot;dataSource&quot;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span>=<span class="attribute-value">&quot;org.apache.commons.dbcp.BasicDataSource&quot;</span>&nbsp;<span class="attribute">destroy-method</span>=<span class="attribute-value">&quot;close&quot;</span>&nbsp;<span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span>&nbsp;<span class="attribute">name</span>=<span class="attribute-value">&quot;driverClassName&quot;</span>&nbsp;<span class="attribute">value</span>=<span class="attribute-value">&quot;com.microsoft.jdbc.sqlserver.SQLServerDriver&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span>&nbsp;<span class="attribute">name</span>=<span class="attribute-value">&quot;url&quot;</span>&nbsp;<span class="attribute">value</span>=<span class="attribute-value">&quot;jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=test&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span>&nbsp;<span class="attribute">name</span>=<span class="attribute-value">&quot;username&quot;</span>&nbsp;<span class="attribute">value</span>=<span class="attribute-value">&quot;sa&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span>&nbsp;<span class="attribute">name</span>=<span class="attribute-value">&quot;password&quot;</span>&nbsp;<span class="attribute">value</span>=<span class="attribute-value">&quot;sa&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span>&nbsp;<span class="attribute">id</span>=<span class="attribute-value">&quot;transactionManager&quot;</span>&nbsp;<span class="attribute">class</span>=<span class="attribute-value">&quot;org.springframework.jdbc.datasource.DataSourceTransactionManager&quot;</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span>&nbsp;<span class="attribute">name</span>=<span class="attribute-value">&quot;dataSource&quot;</span>&nbsp;<span class="attribute">ref</span>=<span class="attribute-value">&quot;dataSource&quot;</span><span class="tag">/&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span>&nbsp;<span class="attribute">id</span>=<span class="attribute-value">&quot;baseTxProxy&quot;</span>&nbsp;<span class="attribute">class</span>=<span class="attribute-value">&quot;org.springframework.transaction.interceptor.TransactionProxyFactoryBean&quot;</span>&nbsp;&nbsp;<span class="attribute">lazy-init</span>=<span class="attribute-value">&quot;true&quot;</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span>&nbsp;<span class="attribute">name</span>=<span class="attribute-value">&quot;transactionManager&quot;</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span>&nbsp;<span class="attribute">bean</span>=<span class="attribute-value">&quot;transactionManager&quot;</span>&nbsp;<span class="tag">/&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span>&nbsp;<span class="attribute">name</span>=<span class="attribute-value">&quot;transactionAttributes&quot;</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">props</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span>&nbsp;<span class="attribute">key</span>=<span class="attribute-value">&quot;*&quot;</span><span class="tag">&gt;</span>PROPAGATION_REQUIRED<span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">props</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span>&nbsp;<span class="attribute">id</span>=<span class="attribute-value">&quot;stdServiceManager&quot;</span>&nbsp;&nbsp;<span class="attribute">parent</span>=<span class="attribute-value">&quot;baseTxProxy&quot;</span>&nbsp;<span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span>&nbsp;<span class="attribute">name</span>=<span class="attribute-value">&quot;target&quot;</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span>&nbsp;<span class="attribute">class</span>=<span class="attribute-value">&quot;test.StudentManagerServiceImp&quot;</span><span class="tag">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span>&nbsp;<span class="attribute">name</span>=<span class="attribute-value">&quot;stdDAO&quot;</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">　　　　　　　　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span>&nbsp;<span class="attribute">bean</span>=<span class="attribute-value">&quot;stdDAO&quot;</span><span class="tag">/&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span>&nbsp; &nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span>&nbsp; &nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span>&nbsp;<span class="attribute">id</span>=<span class="attribute-value">&quot;stdDAO&quot;</span>&nbsp;<span class="attribute">class</span>=<span class="attribute-value">&quot;test.StudentDAOImp&quot;</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span>&nbsp;<span class="attribute">name</span>=<span class="attribute-value">&quot;dataSource&quot;</span>&nbsp;<span class="attribute">ref</span>=<span class="attribute-value">&quot;dataSource&quot;</span><span class="tag">/&gt;</span>&nbsp;&nbsp; </li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span>&nbsp;&nbsp; </li>
    <li class=""><span class="tag">&lt;/</span><span class="tag-name">beans</span><span class="tag">&gt;</