<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[璀璨心灵 - J2EE]]></title>
<link>http://blog.mmgg.net/</link>
<description><![CDATA[记录那些朝花拾夕的日子]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[Fly@MMGG.NET(小飞飞)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>璀璨心灵</title> 
	<url>http://blog.mmgg.net/images/logos.gif</url> 
	<link>http://blog.mmgg.net/</link> 
	<description>璀璨心灵</description> 
</image>

			<item>
			<link>http://blog.mmgg.net/default.asp?id=39</link>
			<title><![CDATA[httpSessionListener统计在线人数]]></title>
			<author>Fly@MMGG.NET(Fly)</author>
			<category><![CDATA[J2EE]]></category>
			<pubDate>Wed,21 May 2008 13:47:38 +0800</pubDate>
			<guid>http://blog.mmgg.net/default.asp?id=39</guid>	
		<description><![CDATA[package SessionCount;<br/>import javax.servlet.*;<br/>import javax.servlet.http.*;<br/>public class SessionCounter implements HttpSessionListener {<br/>private static int activeSessions = 0;<br/>public void sessionCr&#101;ated(HttpSessionEvent se) {<br/>activeSessions++;<br/>}<br/>public void sessionDestroyed(HttpSessionEvent se) {<br/>if(activeSessions &gt; 0)<br/>activeSessions--;<br/>}<br/>public static int getActiveSessions() {<br/>return activeSessions;<br/>}<br/>}<br/>　　接着建立online.jsp文件用于显示在线人数<br/><br/>&lt;%@ page import=&#34;SessionCount.SessionCounter&#34; %&gt;<br/>　　在线：<br/><br/>&lt;%= SessionCounter.getActiveSessions() %&gt;<br/>　　然后需要在你的网站的WEB-INF中建立web.xml 文件内容如下：<br/><br/>&lt;!-- Web.xml --&gt;<br/>&lt;?xml version=&#34;1.0&#34; encoding=&#34;ISO-8859-1&#34;?&gt;<br/>&lt;!DOCTYPE web-app<br/>PUBLIC &#34;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&#34;<br/>&#34;<a href="http://java.sun.com/j2ee/dtds/web-app_2.3.dtd" target="_blank">http://java.sun.com/j2ee/dtds/web-app_2.3.dtd</a>&#34;&gt;<br/>&lt;web-app&gt;<br/>&lt;!-- Listeners --&gt;<br/>&lt;listener&gt;<br/>&lt;listener-class&gt;<br/>SessionCount.SessionCounter<br/>&lt;/listener-class&gt;<br/>&lt;/listener&gt;<br/>&lt;/web-app&gt;<br/>　　然后重新启动你的应用服务器，访问online.jsp检查是否显示正确。<br/>]]></description>
		</item>
		
			<item>
			<link>http://blog.mmgg.net/default.asp?id=10</link>
			<title><![CDATA[配置log4j写入数据库]]></title>
			<author>Fly@MMGG.NET(Fly)</author>
			<category><![CDATA[J2EE]]></category>
			<pubDate>Mon,05 May 2008 16:03:33 +0800</pubDate>
			<guid>http://blog.mmgg.net/default.asp?id=10</guid>	
		<description><![CDATA[<p>首先按<a href="http://sagesse.bokee.com/5040063.html">tomcat +sqlserver 数据连接池</a> 中的方法配置数据连接池。</p>
<p>\WEB-INF\lib文件夹加入包msbase.jar;mssqlserver.jar;msutil.jar;log4j-1.2.8.jar</p>
<p>放在WEB_INF\class文件夹下的log.properties文件的内容如下</p>
<p>#输出到F:/home/example.log<br />log4j.rootLogger=DEBUG, A1<br />log4j.appender.A1=org.apache.log4j.RollingFileAppender<br />log4j.appender.A1.File=F:/home/example.log<br />log4j.appender.A1.MaxBackeupIndex=1<br />log4j.appender.A1.MaxFileSize=1MB<br />log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />log4j.appender.A1.layout.ConversionPattern=[%-5p][%d]%n%m%n%n</p>
<p>#控制台输出<br />#log4j.logger.A2=, myAppender<br />#log4j.appender.A1=org.apache.log4j.ConsoleAppender<br />#log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />#log4j.appender.A1.layout.ConversionPattern= [%-5p][%d]%n%m%n%n</p>
<p>#写入数据库<br />#log4j.rootLogger=DEBUG, DATABASE <br />#log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender//（root日志记录器的存储器）<br />#log4j.appender.DATABASE.URL=jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor<br />#log4j.appender.DATABASE.driver=com.microsoft.jdbc.sqlserver.SQLServerDriver<br />#log4j.appender.DATABASE.user=sd //用户名<br />#log4j.appender.DATABASE.password=<br />#log4j.appender.DATABASE.sql=Insert INTO LOG4J (Message) VALUES ('%d %c %p %m%n')//写入pubs数据库中的表LOG4J的Message字段中，内容％d（日期）<font color="#333333">%c: 日志信息所在地（类名）%p: 日志信息级别%m: 产生的日志具体信息 %n: 输出日志信息换行 </font><br />#log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout<br />#log4j.appender.DATABASE.layout.ConversionPattern=%d %c %p %m%n</p>
<p>类文件中的使用方法</p>
<p>import org.apache.log4j.Logger;</p>
<p>import javax.sql.DataSource;<br />import javax.naming.Context;<br />import javax.naming.InitialContext;<br />import java.sql.Connection;<br />import java.sql.SQLException;<br />import java.util.Vector;</p>
<p>/**<br />* 封装DataSource<br />*<br />* @version 1.0, 2005-9-16 11:18:44<br />*/</p>
<p>public class DataSourcePackBean {<br />&nbsp;&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * log4j<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp; private Logger logger = Logger.getLogger(DataSourcePackBean.class);</p>
<p>//DataSourcePackBean.class日志记录器的名与类名相同；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 引用名<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp; private String ref;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * DataSource对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp; private DataSource ds;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 保存当前DataSource对象中所有打开的Connection对象的引用。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp; private Vector openedConnections = new Vector();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 接收DataSource引用名，查找DataSource对象。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param ref DataSource引用名<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp; protected DataSourcePackBean(String ref) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ref = ref;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ds = lookup(ref);<br />&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; public String getRef() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ref;<br />&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; public int getActive() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return openedConnections.size();<br />&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 打开一个连接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param username 连接数据库的登录用户名，如果为null，表示用默认用户连接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param password 连接数据库的登录密码<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @throws SQLException<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp; public Connection getConnection(String username, String password) throws SQLException {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection conn = (username == null) ? ds.getConnection() : ds.getConnection(username, password);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // add to vector<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openedConnections.add(conn);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // log<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer log = new StringBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.append(&quot;Open&quot;).append(&quot; a connection(&quot;).append(conn.hashCode()).append(&quot;) of [&quot;).append(ref).append(&quot;]\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.append(openedConnections.size()).append(&quot; connection&quot;).append(&quot; in use&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.debug(log);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // return<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return conn;<br />&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 关闭一个连接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param conn<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @throws SQLException<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp; public void closeConnection(Connection conn) throws SQLException {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // remove from Vector<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openedConnections.remove(conn);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // log<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer log = new StringBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.append(&quot;Close&quot;).append(&quot; a connection(&quot;).append(conn.hashCode()).append(&quot;) of [&quot;).append(ref).append(&quot;]\n&quot;);//添加内容到日志记录中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.append(openedConnections.size()).append(&quot; connection&quot;).append(&quot; in use&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.debug(log);<br />&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * close all Connection of this DataSource<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @throws SQLException<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp; public void closeAll() throws SQLException {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; openedConnections.size(); i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((Connection)openedConnections.get(i)).close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // clear Vector<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openedConnections.removeAllElements();<br />&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * get a DataSource<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param ref the JNDI name of the DataSource<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp; private DataSource lookup(String ref) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSource dataSource = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 查找ref数据源对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Context env = new InitialContext();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataSource = (DataSource) env.lookup(ref);<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; dataSource.getConnection().close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.debug(new StringBuffer().append(&quot;DataSource[&quot;).append(ref).append(&quot;] has been initialized successfully.&quot;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // return<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return dataSource;<br />&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; public SQLRunnerIfc getSQLRunner(String username, String password) throws SQLException {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new SQLRunner(username, password, this);<br />&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; public SQLRunnerIfc getSQLRunner() throws SQLException {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return getSQLRunner(null, null);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />}</p>]]></description>
		</item>
		
			<item>
			<link>http://blog.mmgg.net/default.asp?id=9</link>
			<title><![CDATA[Struts2中相关配置文件]]></title>
			<author>Fly@MMGG.NET(Fly)</author>
			<category><![CDATA[J2EE]]></category>
			<pubDate>Mon,05 May 2008 12:08:52 +0800</pubDate>
			<guid>http://blog.mmgg.net/default.asp?id=9</guid>	
		<description><![CDATA[1） struts-default.xml <br /><br />这个文件是struts2框架默认加载的配置文件。它定义struts2一些核心的bean和拦截器。 <br /><br />&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt; <br /><br />&lt;!DOCTYPE struts PUBLIC <br />&quot;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quot; <br />&quot;http://struts.apache.org/dtds/struts-2.0.dtd&quot;&gt; <br /><br />&lt;struts&gt; <br />&lt;!--struts2中工厂bean的定义--&gt; <br />&lt;bean class=&quot;com.opensymphony.xwork2.ObjectFactory&quot; name=&quot;xwork&quot; /&gt; <br />&lt;bean type=&quot;com.opensymphony.xwork2.ObjectFactory&quot; name=&quot;struts&quot; class=&quot;org.apache.struts2.impl.StrutsObjectFactory&quot; /&gt; <br /><br />&lt;bean type=&quot;com.opensymphony.xwork2.ActionProxyFactory&quot; name=&quot;xwork&quot; class=&quot;com.opensymphony.xwork2.DefaultActionProxyFactory&quot;/&gt; <br />&lt;bean type=&quot;com.opensymphony.xwork2.ActionProxyFactory&quot; name=&quot;struts&quot; class=&quot;org.apache.struts2.impl.StrutsActionProxyFactory&quot;/&gt; <br />&lt;!--类型检测bean的定义--&gt; <br />&lt;bean type=&quot;com.opensymphony.xwork2.util.ObjectTypeDeterminer&quot; name=&quot;tiger&quot; class=&quot;com.opensymphony.xwork2.util.GenericsObjectTypeDeterminer&quot;/&gt; <br />&lt;bean type=&quot;com.opensymphony.xwork2.util.ObjectTypeDeterminer&quot; name=&quot;notiger&quot; class=&quot;com.opensymphony.xwork2.util.DefaultObjectTypeDeterminer&quot;/&gt; <br />&lt;bean type=&quot;com.opensymphony.xwork2.util.ObjectTypeDeterminer&quot; name=&quot;struts&quot; class=&quot;com.opensymphony.xwork2.util.DefaultObjectTypeDeterminer&quot;/&gt; <br />&lt;!--文件上传bean的定义--&gt; <br />&lt;bean type=&quot;org.apache.struts2.dispatcher.mapper.ActionMapper&quot; name=&quot;struts&quot; class=&quot;org.apache.struts2.dispatcher.mapper.DefaultActionMapper&quot; /&gt; <br />&lt;bean type=&quot;org.apache.struts2.dispatcher.mapper.ActionMapper&quot; name=&quot;composite&quot; class=&quot;org.apache.struts2.dispatcher.mapper.CompositeActionMapper&quot; /&gt; <br />&lt;bean type=&quot;org.apache.struts2.dispatcher.mapper.ActionMapper&quot; name=&quot;restful&quot; class=&quot;org.apache.struts2.dispatcher.mapper.RestfulActionMapper&quot; /&gt; <br />&lt;bean type=&quot;org.apache.struts2.dispatcher.mapper.ActionMapper&quot; name=&quot;restful2&quot; class=&quot;org.apache.struts2.dispatcher.mapper.Restful2ActionMapper&quot; /&gt; <br /><br />&lt;bean type=&quot;org.apache.struts2.dispatcher.multipart.MultiPartRequest&quot; name=&quot;struts&quot; class=&quot;org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest&quot; scope=&quot;default&quot; optional=&quot;true&quot;/&gt; <br />&lt;bean type=&quot;org.apache.struts2.dispatcher.multipart.MultiPartRequest&quot; name=&quot;jakarta&quot; class=&quot;org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest&quot; scope=&quot;default&quot; optional=&quot;true&quot; /&gt; <br />&lt;!--标签库bean的定义--&gt; <br />&lt;bean type=&quot;org.apache.struts2.views.TagLibrary&quot; name=&quot;s&quot; class=&quot;org.apache.struts2.views.DefaultTagLibrary&quot; /&gt; <br />&lt;!--一些常用视图bean的定义--&gt; <br />&lt;bean class=&quot;org.apache.struts2.views.freemarker.FreemarkerManager&quot; name=&quot;struts&quot; optional=&quot;true&quot;/&gt; <br />&lt;bean class=&quot;org.apache.struts2.views.velocity.VelocityManager&quot; name=&quot;struts&quot; optional=&quot;true&quot; /&gt; <br /><br />&lt;bean class=&quot;org.apache.struts2.components.template.TemplateEngineManager&quot; /&gt; <br />&lt;bean type=&quot;org.apache.struts2.components.template.TemplateEngine&quot; name=&quot;ftl&quot; class=&quot;org.apache.struts2.components.template.FreemarkerTemplateEngine&quot; /&gt; <br />&lt;bean type=&quot;org.apache.struts2.components.template.TemplateEngine&quot; name=&quot;vm&quot; class=&quot;org.apache.struts2.components.template.VelocityTemplateEngine&quot; /&gt; <br />&lt;bean type=&quot;org.apache.struts2.components.template.TemplateEngine&quot; name=&quot;jsp&quot; class=&quot;org.apache.struts2.components.template.JspTemplateEngine&quot; /&gt; <br />&lt;!--类型转换bean的定义--&gt; <br />&lt;bean type=&quot;com.opensymphony.xwork2.util.XWorkConverter&quot; name=&quot;xwork1&quot; class=&quot;com.opensymphony.xwork2.util.XWorkConverter&quot; /&gt; <br />&lt;bean type=&quot;com.opensymphony.xwork2.util.XWorkConverter&quot; name=&quot;struts&quot; class=&quot;com.opensymphony.xwork2.util.AnnotationXWorkConverter&quot; /&gt; <br />&lt;bean type=&quot;com.opensymphony.xwork2.TextProvider&quot; name=&quot;xwork1&quot; class=&quot;com.opensymphony.xwork2.TextProviderSupport&quot; /&gt; <br />&lt;bean type=&quot;com.opensymphony.xwork2.TextProvider&quot; name=&quot;struts&quot; class=&quot;com.opensymphony.xwork2.TextProviderSupport&quot; /&gt; <br /><br />&lt;!-- Struts2中一些可以静态注入的bean,也就是不需要实例化的 --&gt; <br />&lt;bean class=&quot;com.opensymphony.xwork2.ObjectFactory&quot; static=&quot;true&quot; /&gt; <br />&lt;bean class=&quot;com.opensymphony.xwork2.util.XWorkConverter&quot; static=&quot;true&quot; /&gt; <br />&lt;bean class=&quot;com.opensymphony.xwork2.util.OgnlValueStack&quot; static=&quot;true&quot; /&gt; <br />&lt;bean class=&quot;org.apache.struts2.dispatcher.Dispatcher&quot; static=&quot;true&quot; /&gt; <br />&lt;bean class=&quot;org.apache.struts2.components.Include&quot; static=&quot;true&quot; /&gt; <br />&lt;bean class=&quot;org.apache.struts2.dispatcher.FilterDispatcher&quot; static=&quot;true&quot; /&gt; <br />&lt;bean class=&quot;org.apache.struts2.views.util.ContextUtil&quot; static=&quot;true&quot; /&gt; <br />&lt;bean class=&quot;org.apache.struts2.views.util.UrlHelper&quot; static=&quot;true&quot; /&gt; <br />&lt;!-- 定义Struts2默认包--&gt; <br />&lt;package name=&quot;struts-default&quot; abstract=&quot;true&quot;&gt; <br />&lt;!-- 结果类型的种类--&gt; <br />&lt;result-types&gt; <br />&lt;result-type name=&quot;chain&quot; class=&quot;com.opensymphony.xwork2.ActionChainResult&quot;/&gt; <br />&lt;result-type name=&quot;dispatcher&quot; class=&quot;org.apache.struts2.dispatcher.ServletDispatcherResult&quot; default=&quot;true&quot;/&gt; <br />&lt;result-type name=&quot;freemarker&quot; class=&quot;org.apache.struts2.views.freemarker.FreemarkerResult&quot;/&gt; <br />&lt;result-type name=&quot;httpheader&quot; class=&quot;org.apache.struts2.dispatcher.HttpHeaderResult&quot;/&gt; <br />&lt;result-type name=&quot;redirect&quot; class=&quot;org.apache.struts2.dispatcher.ServletRedirectResult&quot;/&gt; <br />&lt;result-type name=&quot;redirectAction&quot; class=&quot;org.apache.struts2.dispatcher.ServletActionRedirectResult&quot;/&gt; <br />&lt;result-type name=&quot;stream&quot; class=&quot;org.apache.struts2.dispatcher.StreamResult&quot;/&gt; <br />&lt;result-type name=&quot;velocity&quot; class=&quot;org.apache.struts2.dispatcher.VelocityResult&quot;/&gt; <br />&lt;result-type name=&quot;xslt&quot; class=&quot;org.apache.struts2.views.xslt.XSLTResult&quot;/&gt; <br />&lt;result-type name=&quot;plainText&quot; class=&quot;org.apache.struts2.dispatcher.PlainTextResult&quot; /&gt; <br />&lt;result-type name=&quot;redirect-action&quot; class=&quot;org.apache.struts2.dispatcher.ServletActionRedirectResult&quot;/&gt; <br />&lt;result-type name=&quot;plaintext&quot; class=&quot;org.apache.struts2.dispatcher.PlainTextResult&quot; /&gt; <br />&lt;/result-types&gt; <br /><br />&lt;!--struts2中拦截器的定义--&gt; <br />&lt;interceptors&gt; <br />&lt;!--实现在不同请求中相似参数别名的准换--&gt; <br />&lt;interceptor name=&quot;alias&quot; class=&quot;com.opensymphony.xwork2.interceptor.AliasInterceptor&quot;/&gt; <br />&lt;!--与Spring整合时自动装配的拦截器--&gt; <br />&lt;interceptor name=&quot;autowiring&quot; class=&quot;com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor&quot;/&gt; <br />&lt;!--构建一个action链，使当前action可以访问前一个action，与&lt;result-type=&quot;chain&quot; /&gt;配合使用--&gt; <br />&lt;interceptor name=&quot;chain&quot; class=&quot;com.opensymphony.xwork2.interceptor.ChainingInterceptor&quot;/&gt; <br />&lt;!--负责类型转换的拦截器--&gt; <br />&lt;interceptor name=&quot;conversionError&quot; class=&quot;org.apache.struts2.interceptor.StrutsConversionErrorInterceptor&quot;/&gt; <br />&lt;!--使用配置的name,value来是指cookies --&gt; <br />&lt;interceptor name=&quot;cookie&quot; class=&quot;org.apache.struts2.interceptor.CookieInterceptor&quot;/&gt; <br />&lt;!--负责创建httpSession--&gt; <br />&lt;interceptor name=&quot;createSession&quot; class=&quot;org.apache.struts2.interceptor.CreateSessionInterceptor&quot; /&gt; <br />&lt;!--输出调试信息--&gt; <br />&lt;interceptor name=&quot;debugging&quot; class=&quot;org.apache.struts2.interceptor.debugging.DebuggingInterceptor&quot; /&gt; <br />&lt;!--扩展引用--&gt; <br />&lt;interceptor name=&quot;externalRef&quot; class=&quot;com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor&quot;/&gt; <br />&lt;!--后台执行action负责发送等待画面给用户--&gt; <br />&lt;interceptor name=&quot;execAndWait&quot; class=&quot;org.apache.struts2.interceptor.ExecuteAndWaitInterceptor&quot;/&gt; <br />&lt;!--异常处理--&gt; <br />&lt;interceptor name=&quot;exception&quot; class=&quot;com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor&quot;/&gt; <br />&lt;!--文件上传，解析表单域的内容--&gt; <br />&lt;interceptor name=&quot;fileUpload&quot; class=&quot;org.apache.struts2.interceptor.FileUploadInterceptor&quot;/&gt; <br />&lt;!--支持国际化--&gt; <br />&lt;interceptor name=&quot;i18n&quot; class=&quot;com.opensymphony.xwork2.interceptor.I18nInterceptor&quot;/&gt; <br />&lt;!--日志记录--&gt; <br />&lt;interceptor name=&quot;logger&quot; class=&quot;com.opensymphony.xwork2.interceptor.LoggingInterceptor&quot;/&gt; <br />&lt;!--模型拦截器，当action实现了ModelDriven接口时，负责把getModel的结果放入valueStack中--&gt; <br />&lt;interceptor name=&quot;modelDriven&quot; class=&quot;com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor&quot;/&gt; <br />&lt;!--有生命周期的ModelDriven--&gt; <br />&lt;interceptor name=&quot;scopedModelDriven&quot; class=&quot;com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor&quot;/&gt; <br />&lt;!--负责解析请求中的参数，并赋值给action中对应的属性--&gt; <br />&lt;interceptor name=&quot;params&quot; class=&quot;com.opensymphony.xwork2.interceptor.ParametersInterceptor&quot;/&gt; <br />&lt;!--实现该Preparable接口的action，会调用拦截器的prepare方法--&gt; <br />&lt;interceptor name=&quot;prepare&quot; class=&quot;com.opensymphony.xwork2.interceptor.PrepareInterceptor&quot;/&gt; <br />&lt;!--负责将action 标签下的param参数值传递给action实例--&gt; <br />&lt;interceptor name=&quot;staticParams&quot; class=&quot;com.opensymphony.xwork2.interceptor.StaticParametersInterceptor&quot;/&gt; <br />&lt;!--范围转换--&gt; <br />&lt;interceptor name=&quot;scope&quot; class=&quot;org.apache.struts2.interceptor.ScopeInterceptor&quot;/&gt; <br />&lt;!--用于访问Servlet API--&gt; <br />&lt;interceptor name=&quot;servletConfig&quot; class=&quot;org.apache.struts2.interceptor.ServletConfigInterceptor&quot;/&gt; <br /><br />&lt;interceptor name=&quot;sessionAutowiring&quot; class=&quot;org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor&quot;/&gt; <br />&lt;!--输出action执行时间--&gt; <br />&lt;interceptor name=&quot;timer&quot; class=&quot;com.opensymphony.xwork2.interceptor.TimerInterceptor&quot;/&gt; <br />&lt;!--防止表单重复提交--&gt; <br />&lt;interceptor name=&quot;token&quot; class=&quot;org.apache.struts2.interceptor.TokenInterceptor&quot;/&gt; <br />&lt;!--与token拦截器相似，只是把token保存到HttpSession--&gt; <br />&lt;interceptor name=&quot;tokenSession&quot; class=&quot;org.apache.struts2.interceptor.TokenSessionStoreInterceptor&quot;/&gt; <br />&lt;!--负责表单字段的验证 *-validation.xml--&gt; <br />&lt;interceptor name=&quot;validation&quot; class=&quot;org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor&quot;/&gt; <br />&lt;!--负责执行action的validate()--&gt; <br />&lt;interceptor name=&quot;workflow&quot; class=&quot;com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor&quot;/&gt; <br />&lt;!--存储和重新获取Action 消息/错误/字段错误为Action，实现ValidationAware接口到seesion--&gt; <br />&lt;interceptor name=&quot;store&quot; class=&quot;org.apache.struts2.interceptor.MessageStoreInterceptor&quot; /&gt; <br />&lt;!--添加自动checkbox处理代码,这样检探测checkbox和添加它作为一个参数使用默认值(通常&rsquo;false&rsquo;).使用一个指定名字隐藏字段探测没提交的checkbox--&gt; <br />&lt;interceptor name=&quot;checkbox&quot; class=&quot;org.apache.struts2.interceptor.CheckboxInterceptor&quot; /&gt; <br />&lt;interceptor name=&quot;profiling&quot; class=&quot;org.apache.struts2.interceptor.ProfilingActivationInterceptor&quot; /&gt; <br />&lt;!--JAAS服务拦截器--&gt; <br />&lt;interceptor name=&quot;roles&quot; class=&quot;org.apache.struts2.interceptor.RolesInterceptor&quot; /&gt; <br /><br />&lt;!-- 一个基本的拦截器栈 --&gt; <br />&lt;interceptor-stack name=&quot;basicStack&quot;&gt; <br />&lt;interceptor-ref name=&quot;exception&quot;/&gt; <br />&lt;interceptor-ref name=&quot;servletConfig&quot;/&gt; <br />&lt;interceptor-ref name=&quot;prepare&quot;/&gt; <br />&lt;interceptor-ref name=&quot;checkbox&quot;/&gt; <br />&lt;interceptor-ref name=&quot;params&quot;/&gt; <br />&lt;interceptor-ref name=&quot;conversionError&quot;/&gt; <br />&lt;/interceptor-stack&gt; <br /><br />&lt;!-- 简单的validtion和webflow栈 --&gt; <br />&lt;interceptor-stack name=&quot;validationWorkflowStack&quot;&gt; <br />&lt;interceptor-ref name=&quot;basicStack&quot;/&gt; <br />&lt;interceptor-ref name=&quot;validation&quot;/&gt; <br />&lt;interceptor-ref name=&quot;workflow&quot;/&gt; <br />&lt;/interceptor-stack&gt; <br /><br />&lt;!-- 文件上传的拦截器栈 --&gt; <br />&lt;interceptor-stack name=&quot;fileUploadStack&quot;&gt; <br />&lt;interceptor-ref name=&quot;fileUpload&quot;/&gt; <br />&lt;interceptor-ref name=&quot;basicStack&quot;/&gt; <br />&lt;/interceptor-stack&gt; <br /><br />&lt;!-- model-driven 栈 --&gt; <br />&lt;interceptor-stack name=&quot;modelDrivenStack&quot;&gt; <br />&lt;interceptor-ref name=&quot;modelDriven&quot;/&gt; <br />&lt;interceptor-ref name=&quot;basicStack&quot;/&gt; <br />&lt;/interceptor-stack&gt; <br /><br />&lt;!-- action链的拦截器栈 --&gt; <br />&lt;interceptor-stack name=&quot;chainStack&quot;&gt; <br />&lt;interceptor-ref name=&quot;chain&quot;/&gt; <br />&lt;interceptor-ref name=&quot;basicStack&quot;/&gt; <br />&lt;/interceptor-stack&gt; <br /><br />&lt;!-- i18n 拦截器栈 --&gt; <br />&lt;interceptor-stack name=&quot;i18nStack&quot;&gt; <br />&lt;interceptor-ref name=&quot;i18n&quot;/&gt; <br />&lt;interceptor-ref name=&quot;basicStack&quot;/&gt; <br />&lt;/interceptor-stack&gt; <br /><br />&lt;!-- 结合preparable和ModenDriven拦截器--&gt; <br />&lt;interceptor-stack name=&quot;paramsPrepareParamsStack&quot;&gt; <br />&lt;interceptor-ref name=&quot;exception&quot;/&gt; <br />&lt;interceptor-ref name=&quot;alias&quot;/&gt; <br />&lt;interceptor-ref name=&quot;params&quot;/&gt; <br />&lt;interceptor-ref name=&quot;servletConfig&quot;/&gt; <br />&lt;interceptor-ref name=&quot;prepare&quot;/&gt; <br />&lt;interceptor-ref name=&quot;i18n&quot;/&gt; <br />&lt;interceptor-ref name=&quot;chain&quot;/&gt; <br />&lt;interceptor-ref name=&quot;modelDriven&quot;/&gt; <br />&lt;interceptor-ref name=&quot;fileUpload&quot;/&gt; <br />&lt;interceptor-ref name=&quot;checkbox&quot;/&gt; <br />&lt;interceptor-ref name=&quot;staticParams&quot;/&gt; <br />&lt;interceptor-ref name=&quot;params&quot;/&gt; <br />&lt;interceptor-ref name=&quot;conversionError&quot;/&gt; <br />&lt;interceptor-ref name=&quot;validation&quot;&gt; <br />&lt;param name=&quot;excludeMethods&quot;&gt;input,back,cancel&lt;/param&gt; <br />&lt;/interceptor-ref&gt; <br />&lt;interceptor-ref name=&quot;workflow&quot;&gt; <br />&lt;param name=&quot;excludeMethods&quot;&gt;input,back,cancel&lt;/param&gt; <br />&lt;/interceptor-ref&gt; <br />&lt;/interceptor-stack&gt; <br /><br />&lt;!--定义默认的拦截器栈 --&gt; <br />&lt;interceptor-stack name=&quot;defaultStack&quot;&gt; <br />&lt;interceptor-ref name=&quot;exception&quot;/&gt; <br />&lt;interceptor-ref name=&quot;alias&quot;/&gt; <br />&lt;interceptor-ref name=&quot;servletConfig&quot;/&gt; <br />&lt;interceptor-ref name=&quot;prepare&quot;/&gt; <br />&lt;interceptor-ref name=&quot;i18n&quot;/&gt; <br />&lt;interceptor-ref name=&quot;chain&quot;/&gt; <br />&lt;interceptor-ref name=&quot;debugging&quot;/&gt; <br />&lt;interceptor-ref name=&quot;profiling&quot;/&gt; <br />&lt;interceptor-ref name=&quot;scopedModelDriven&quot;/&gt; <br />&lt;interceptor-ref name=&quot;modelDriven&quot;/&gt; <br />&lt;interceptor-ref name=&quot;fileUpload&quot;/&gt; <br />&lt;interceptor-ref name=&quot;checkbox&quot;/&gt; <br />&lt;interceptor-ref name=&quot;staticParams&quot;/&gt; <br />&lt;interceptor-ref name=&quot;params&quot;&gt; <br />&lt;param name=&quot;excludeParams&quot;&gt;dojo\..*&lt;/param&gt; <br />&lt;/interceptor-ref&gt; <br />&lt;interceptor-ref name=&quot;conversionError&quot;/&gt; <br />&lt;interceptor-ref name=&quot;validation&quot;&gt; <br />&lt;param name=&quot;excludeMethods&quot;&gt;input,back,cancel,browse&lt;/param&gt; <br />&lt;/interceptor-ref&gt; <br />&lt;interceptor-ref name=&quot;workflow&quot;&gt; <br />&lt;param name=&quot;excludeMethods&quot;&gt;input,back,cancel,browse&lt;/param&gt; <br />&lt;/interceptor-ref&gt; <br />&lt;/interceptor-stack&gt; <br /><br />&lt;interceptor-stack name=&quot;completeStack&quot;&gt; <br />&lt;interceptor-ref name=&quot;defaultStack&quot;/&gt; <br />&lt;/interceptor-stack&gt; <br /><br /><br />&lt;interceptor-stack name=&quot;executeAndWaitStack&quot;&gt; <br />&lt;interceptor-ref name=&quot;execAndWait&quot;&gt; <br />&lt;param name=&quot;excludeMethods&quot;&gt;input,back,cancel&lt;/param&gt; <br />&lt;/interceptor-ref&gt; <br />&lt;interceptor-ref name=&quot;defaultStack&quot;/&gt; <br />&lt;interceptor-ref name=&quot;execAndWait&quot;&gt; <br />&lt;param name=&quot;excludeMethods&quot;&gt;input,back,cancel&lt;/param&gt; <br />&lt;/interceptor-ref&gt; <br />&lt;/interceptor-stack&gt; <br /><br /><br />&lt;interceptor name=&quot;external-ref&quot; class=&quot;com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor&quot;/&gt; <br />&lt;interceptor name=&quot;model-driven&quot; class=&quot;com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor&quot;/&gt; <br />&lt;interceptor name=&quot;static-params&quot; class=&quot;com.opensymphony.xwork2.interceptor.StaticParametersInterceptor&quot;/&gt; <br />&lt;interceptor name=&quot;scoped-model-driven&quot; class=&quot;com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor&quot;/&gt; <br />&lt;interceptor name=&quot;servlet-config&quot; class=&quot;org.apache.struts2.interceptor.ServletConfigInterceptor&quot;/&gt; <br />&lt;interceptor name=&quot;token-session&quot; class=&quot;org.apache.struts2.interceptor.TokenSessionStoreInterceptor&quot;/&gt; <br /><br />&lt;/interceptors&gt; <br />&lt;!--定义默认拦截器为&quot;defaultStack&quot;--&gt; <br />&lt;default-interceptor-ref name=&quot;defaultStack&quot;/&gt; <br />&lt;/package&gt; <br /><br />&lt;/struts&gt; <br /><br /><br />2） struts.xml <br /><br />该文件也是struts2框架自动加载的文件，在这个文件中可以定义一些自己的action,interceptor，package等，该文件的package 通常继承struts-default包。下面是这个文件的格式。 <br /><br />&lt;?xml version=&quot;1.0&quot; encoding=&quot;GBK&quot;?&gt; <br />&lt;!-- 下面指定Struts 2配置文件的DTD信息 --&gt; <br />&lt;!DOCTYPE struts PUBLIC <br />&quot;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quot; <br />&quot;http://struts.apache.org/dtds/struts-2.0.dtd&quot;&gt; <br />&lt;!-- struts是Struts 2配置文件的根元素 --&gt; <br />&lt;struts&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;constant name=&quot;&quot; value=&quot;&quot; /&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;bean type=&quot;&quot; name=&quot;&quot; class=&quot;&quot; scope=&quot;&quot; static=&quot;&quot; optional=&quot;&quot; /&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;include file=&quot;&quot; /&gt; <br />&lt;!-- package元素是Struts配置文件的核心，该元素可以出现0次，或者无限多次 --&gt; <br />&lt;package name=&quot;必填的包名&quot; extends=&quot;&quot; namespace=&quot;&quot; abstract=&quot;&quot; <br />externalReferenceResolver&gt; <br />&lt;!-- 该元素可以出现，也可以不出现，最多出现一次 --&gt; <br />&lt;result-types&gt; <br />&lt;!-- 该元素必须出现，可以出现无限多次--&gt; <br />&lt;result-type name=&quot;&quot; class=&quot;&quot; default=&quot;true|false&quot;&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;param name=&quot;参数名&quot;&gt;参数值&lt;/param&gt;* <br />&lt;/result-type&gt; <br />&lt;/result-types&gt; <br />&lt;!-- 该元素可以出现，也可以不出现，最多出现一次 --&gt; <br />&lt;interceptors&gt; <br />&lt;!-- 该元素的interceptor元素和interceptor-stack至少出现其中之一， <br />也可以二者都出现 --&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;interceptor name=&quot;&quot; class=&quot;&quot;&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;param name=&quot;参数名&quot;&gt;参数值&lt;/param&gt;* <br />&lt;/interceptor&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;interceptor-stack name=&quot;&quot;&gt; <br />&lt;!-- 该元素必须出现，可以出现无限多次--&gt; <br />&lt;interceptor-ref name=&quot;&quot;&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;param name=&quot;参数名&quot;&gt;参数值&lt;/param&gt;* <br />&lt;/interceptor-ref&gt; <br />&lt;/interceptor-stack&gt; <br />&lt;/interceptors&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;default-interceptor-ref name=&quot;&quot;&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;param name=&quot;参数名&quot;&gt;参数值&lt;/param&gt; <br />&lt;/default-interceptor-ref&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;default-action-ref name=&quot;&quot;&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;param name=&quot;参数名&quot;&gt;参数值&lt;/param&gt;* <br />&lt;/default-action-ref&gt;? <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;global-results&gt; <br />&lt;!-- 该元素必须出现，可以出现无限多次--&gt; <br />&lt;result name=&quot;&quot; type=&quot;&quot;&gt; <br />&lt;!-- 该字符串内容可以出现0次或多次 --&gt; <br />映射资源 <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;param name=&quot;参数名&quot;&gt;参数值&lt;/param&gt;* <br />&lt;/result&gt; <br />&lt;/global-results&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;global-exception-mappings&gt; <br />&lt;!-- 该元素必须出现，可以出现无限多次--&gt; <br />&lt;exception-mapping name=&quot;&quot; exception=&quot;&quot; result=&quot;&quot;&gt; <br />异常处理资源 <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;param name=&quot;参数名&quot;&gt;参数值&lt;/param&gt;* <br />&lt;/exception-mapping&gt; <br />&lt;/global-exception-mappings&gt; <br />&lt;action name=&quot;&quot; class=&quot;&quot; method=&quot;&quot; converter=&quot;&quot;&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;param name=&quot;参数名&quot;&gt;参数值&lt;/param&gt;* <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;result name=&quot;&quot; type=&quot;&quot;&gt; <br />映射资源 <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;param name=&quot;参数名&quot;&gt;参数值&lt;/param&gt;* <br />&lt;/result&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;interceptor-ref name=&quot;&quot;&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;param name=&quot;参数名&quot;&gt;参数值&lt;/param&gt;* <br />&lt;/interceptor-ref&gt; <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;exception-mapping name=&quot;&quot; exception=&quot;&quot; result=&quot;&quot;&gt; <br />异常处理资源 <br />&lt;!-- 下面元素可以出现0次，也可以无限多次 --&gt; <br />&lt;param name=&quot;参数名&quot;&gt;参数值&lt;/param&gt;* <br />&lt;/exception-mapping&gt; <br />&lt;/action&gt; <br />&lt;/package&gt;* <br />&lt;struts&gt; <br /><br /><br />3） struts.properties文件 <br /><br />这个文件是struts2框架的全局属性文件，也是自动加载的文件。该文件包含了系列的key-value对。该文件完全可以配置在struts.xml文件中，使用constant元素。下面是这个文件中一些常见的配置项及说明。 <br /><br /><br />### 指定加载struts2配置文件管理器，默认为org.apache.struts2.config.DefaultConfiguration <br />### 开发者可以自定义配置文件管理器，该类要实现Configuration接口，可以自动加载struts2配置文件。 <br /># struts.configuration=org.apache.struts2.config.DefaultConfiguration <br /><br />### 设置默认的locale和字符编码 <br /># struts.locale=en_US <br />struts.i18n.encoding=UTF-8 <br /><br /><br />### 指定struts的工厂类 <br /># struts.objectFactory = spring <br /><br />### 指定spring框架的装配模式 <br />### 装配方式有: name, type, auto, and constructor (name 是默认装配模式) <br />struts.objectFactory.spring.autoWire = name <br /><br />### 该属性指定整合spring时，是否对bean进行缓存，值为true or false,默认为true. <br />struts.objectFactory.spring.useClassCache = true <br /><br />### 指定类型检查 <br />#struts.objectTypeDeterminer = tiger <br />#struts.objectTypeDeterminer = notiger <br /><br />### 该属性指定处理 MIME-type multipart/form-data，文件上传 <br /># struts.multipart.parser=cos <br /># struts.multipart.parser=pell <br />struts.multipart.parser=jakarta <br /># 指定上传文件时的临时目录，默认使用 javax.servlet.context.tempdir <br />struts.multipart.saveDir= <br />struts.multipart.maxSize=2097152 <br /><br />### 加载自定义属性文件 (不要改写struts.properties!) <br /># struts.custom.properties=application,org/apache/struts2/extension/custom <br /><br />### 指定请求url与action映射器，默认为org.apache.struts2.dispatcher.mapper.DefaultActionMapper <br />#struts.mapper.class=org.apache.struts2.dispatcher.mapper.DefaultActionMapper <br /><br />### 指定action的后缀，默认为action <br />struts.action.extension=action <br /><br />### 被 FilterDispatcher使用 <br />### 如果为 true 则通过jar文件提供静态内容服务. <br />### 如果为 false 则静态内容必须位于 &lt;context_path&gt;/struts <br />struts.serve.static=true <br /><br />### 被 FilterDispatcher使用 <br />### 指定浏览器是否缓存静态内容，测试阶段设置为false，发布阶段设置为true. <br />struts.serve.static.browserCache=true <br /><br />### 设置是否支持动态方法调用，true为支持，false不支持. <br />struts.enable.DynamicMethodInvocation = true <br /><br />### 设置是否可以在action中使用斜线，默认为false不可以，想使用需设置为true. <br />struts.enable.SlashesInActionNames = false <br /><br />### 是否允许使用表达式语法，默认为true. <br />struts.tag.altSyntax=true <br /><br /><br />### 设置当struts.xml文件改动时，是否重新加载. <br />### - struts.configuration.xml.reload = true <br />### 设置struts是否为开发模式，默认为false,测试阶段一般设为true. <br />struts.devMode = false <br /><br />### 设置是否每次请求，都重新加载资源文件，默认值为false. <br />struts.i18n.reload=false <br /><br />###标准的UI主题 <br />### 默认的UI主题为xhtml,可以为simple,xhtml或ajax <br />struts.ui.theme=xhtml <br />###模板目录 <br />struts.ui.templateDir=template <br />#设置模板类型. 可以为 ftl, vm, or jsp <br />struts.ui.templateSuffix=ftl <br /><br />###定位velocity.properties 文件. 默认 velocity.properties <br />struts.velocity.configfile = velocity.properties <br /><br />### 设置velocity的context. <br />struts.velocity.contexts = <br /><br />### 定位toolbox. <br />struts.velocity.toolboxlocation= <br /><br />### 指定web应用的端口. <br />struts.url.http.port = 80 <br />### 指定加密端口 <br />struts.url.https.port = 443 <br />### 设置生成url时，是否包含参数.值可以为: none, get or all <br />struts.url.includeParams = get <br /><br />### 设置要加载的国际化资源文件，以逗号分隔. <br /># struts.custom.i18n.resources=testmessages,testmessages2 <br /><br />### 对于一些web应用服务器不能处理HttpServletRequest.getParameterMap() <br />### 像 WebLogic, orion, and OC4J等，须设置成true,默认为false. <br />struts.dispatcher.parametersWorkaround = false <br /><br />### 指定freemarker管理器 <br />#struts.freemarker.manager.classname=org.apache.struts2.views.freemarker.FreemarkerManager <br /><br />### 设置是否对freemarker的模板设置缓存 <br />### 效果相当于把template拷贝到 WEB_APP/templates. <br />struts.freemarker.templatesCache=false <br /><br />### 通常不需要修改此属性. <br />struts.freemarker.wrapper.altMap=true <br /><br />### 指定xslt result是否使用样式表缓存.开发阶段设为true,发布阶段设为false. <br />struts.xslt.nocache=false <br /><br />### 设置struts自动加载的文件列表. <br />struts.configuration.files=struts-default.xml,struts-plugin.xml,struts.xml <br /><br />### 设定是否一直在最后一个slash之前的任何位置选定namespace. <br />struts.mapper.alwaysSelectFullNamespace=false]]></description>
		</item>
		
			<item>
			<link>http://blog.mmgg.net/default.asp?id=8</link>
			<title><![CDATA[Struts2（XWork）提供的拦截器的功能说明]]></title>
			<author>Fly@MMGG.NET(Fly)</author>
			<category><![CDATA[J2EE]]></category>
			<pubDate>Mon,05 May 2008 11:45:23 +0800</pubDate>
			<guid>http://blog.mmgg.net/default.asp?id=8</guid>	
		<description><![CDATA[<table cellspacing="0" cellpadding="1" border="1" i="ta-s">
    <tbody>
        <tr>
            <td valign="top" width="189">
            <p style="TEXT-INDENT: 2em">拦截器</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">名字</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">说明</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Alias Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">alias</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">在不同请求之间将请求参数在不同名字件转换，请求内容不变</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Chaining Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">chain</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">让前一个Action的属性可以被后一个Action访问，现在和chain类型的result（<result type="”chain”"></result>）结合使用。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Checkbox Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">checkbox</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">添加了checkbox自动处理代码，将没有选中的checkbox的内容设定为false，而html默认情况下不提交没有选中的checkbox。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Cookies Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">cookies</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">使用配置的name,value来是指cookies</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Conversion Error Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">conversionError</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">将错误从ActionContext中添加到Action的属性字段中。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Create Session Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">createSession</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">自动的创建HttpSession，用来为需要使用到HttpSession的拦截器服务。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Debugging Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">debugging</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">提供不同的调试用的页面来展现内部的数据状况。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Execute and Wait Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">execAndWait</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">在后台执行Action，同时将用户带到一个中间的等待页面。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Exception Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">exception</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">将异常定位到一个画面</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">File Upload Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">fileUpload</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">提供文件上传功能</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">I18n Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">i18n</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">记录用户选择的locale</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Logger Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">logger</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">输出Action的名字</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Message Store Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">store</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">存储或者访问实现ValidationAware接口的Action类出现的消息，错误，字段错误等。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Model Driven Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">model-driven</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">如果一个类实现了ModelDriven，将getModel得到的结果放在Value Stack中。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Scoped Model Driven</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">scoped-model-driven</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">如果一个Action实现了ScopedModelDriven，则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Parameters Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">params</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">将请求中的参数设置到Action中去。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Prepare Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">prepare</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">如果Acton实现了Preparable，则该拦截器调用Action类的prepare方法。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Scope Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">scope</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">将Action状态存入session和application的简单方法。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Servlet Config Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">servletConfig</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">提供访问HttpServletRequest和HttpServletResponse的方法，以Map的方式访问。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Static Parameters Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">staticParams</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">从struts.xml文件中将<action></action>中的
            <param />中的内容设置到对应的Action中。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Roles Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">roles</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">确定用户是否具有JAAS指定的Role，否则不予执行。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Timer Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">timer</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">输出Action执行的时间</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Token Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">token</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">通过Token来避免双击</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Token Session Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">tokenSession</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">和Token Interceptor一样，不过双击的时候把请求的数据存储在Session中</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Validation Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">validation</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">使用action-validation.xml文件中定义的内容校验提交的数据。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Workflow Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">workflow</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">调用Action的validate方法，一旦有错误返回，重新定位到INPUT画面</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Parameter Filter Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">N/A</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">从参数列表中删除不必要的参数</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="189">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">Profiling Interceptor</p>
            </td>
            <td valign="top" width="117">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">profiling</p>
            </td>
            <td valign="top" width="263">
            <p>&nbsp;</p>
            <p style="TEXT-INDENT: 2em">通过参数激活profile</p>
            </td>
        </tr>
    </tbody>
</table>]]></description>
		</item>
		
			<item>
			<link>http://blog.mmgg.net/default.asp?id=5</link>
			<title><![CDATA[防止表单重复提交的Servlet]]></title>
			<author>Fly@MMGG.NET(Fly)</author>
			<category><![CDATA[J2EE]]></category>
			<pubDate>Tue,29 Apr 2008 17:56:52 +0800</pubDate>
			<guid>http://blog.mmgg.net/default.asp?id=5</guid>	
		<description><![CDATA[<p><br />package net.mmgg;</p>
<p>/**<br />&nbsp;* @company MMGG.NET<br />&nbsp;* @date Apr 29, 2008 5:49:47 PM<br />&nbsp;*/</p>
<p>import java.security.MessageDigest;<br />import java.security.NoSuchAlgorithmException;</p>
<p>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpSession;</p>
<p>/**<br />&nbsp;* TokenProcessor类是一个单例类。<br />*/<br />public class TokenProcessor<br />{<br />&nbsp;&nbsp;&nbsp; static final String TOKEN_KEY=&quot;net.mmgg&quot;;<br />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private static TokenProcessor instance = new TokenProcessor();</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * getInstance()方法得到单例类的实例。<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public static TokenProcessor getInstance()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return instance;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * 最近一次生成令牌值的时间戳。<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; private long previous;</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * 判断请求参数中的令牌值是否有效。<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public synchronized boolean isTokenValid(HttpServletRequest request)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //得到请求的当前Session对象。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession session = request.getSession(false);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (session == null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从Session中取出保存的令牌值。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String saved = (String) session.getAttribute(TOKEN_KEY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (saved == null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //清除Session中的令牌值。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resetToken(request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //得到请求参数中的令牌值。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String token = request.getParameter(TOKEN_KEY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (token == null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return saved.equals(token);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * 清除Session中的令牌值。<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public synchronized void resetToken(HttpServletRequest request)<br />&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession session = request.getSession(false);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (session == null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.removeAttribute(TOKEN_KEY);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * 产生一个新的令牌值，保存到Session中，<br />&nbsp;&nbsp;&nbsp;&nbsp; * 如果当前Session不存在，则创建一个新的Session。<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public synchronized void saveToken(HttpServletRequest request)<br />&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession session = request.getSession();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String token = generateToken(request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (token != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute(TOKEN_KEY, token);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * 根据用户会话ID和当前的系统时间生成一个唯一的令牌。<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public synchronized String generateToken(HttpServletRequest request)<br />&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession session = request.getSession();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte id[] = session.getId().getBytes();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long current = System.currentTimeMillis();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (current == previous)<br />&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; current++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; previous = current;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte now[] = new Long(current).toString().getBytes();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageDigest md = MessageDigest.getInstance(&quot;MD5&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; md.update(id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; md.update(now);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return toHex(md.digest());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (NoSuchAlgorithmException e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * 将一个字节数组转换为一个十六进制数字的字符串。<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; private String toHex(byte buffer[])<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sb = new StringBuffer(buffer.length * 2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; buffer.length; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(Character.forDigit((buffer[i] &amp; 0xf0) &gt;&gt; 4, 16));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(Character.forDigit(buffer[i] &amp; 0x0f, 16));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sb.toString();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * 从Session中得到令牌值，如果Session中没有保存令牌值，则生成一个新的令牌值。<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public synchronized String getToken(HttpServletRequest request)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession session = request.getSession(false);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(null==session)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String token=(String)session.getAttribute(TOKEN_KEY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(null==token)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; token = generateToken(request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (token != null)<br />&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; session.setAttribute(TOKEN_KEY, token);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return token;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&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; return null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return token;<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></p>]]></description>
		</item>
		
			<item>
			<link>http://blog.mmgg.net/default.asp?id=2</link>
			<title><![CDATA[关于实现序列化的类提示没有定义serialVersionUID域]]></title>
			<author>Fly@MMGG.NET(Fly)</author>
			<category><![CDATA[J2EE]]></category>
			<pubDate>Sun,27 Apr 2008 19:06:54 +0800</pubDate>
			<guid>http://blog.mmgg.net/default.asp?id=2</guid>	
		<description><![CDATA[<p style="WORD-BREAK: break-all; LINE-HEIGHT: 16pt; WORD-WRAP: break-word"><span class="bt">The serializable class XXX does not declare a static final serialVersionUID field of type long</span></p>
<p style="WORD-BREAK: break-all; LINE-HEIGHT: 16pt; WORD-WRAP: break-word"><span class="bt">serialVersionUID作用： <br />序列化时为了保持版本的兼容性，即在版本升级时反序列化仍保持对象的唯一性。 <br /><br />你可以随便写一个，在Eclipse中它替你生成一个，有两种生成方式：<br />一个是默认的1L，比如：private static final long serialVersionUID = 1L;<br />一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段，比如：private static final long serialVersionUID = -8940196742313994740L;之类的。<br /><br />当你一个类实现了Serializable接口，如果没有定义serialVersionUID，Eclipse会提供这个提示功能告诉你去定义之。 <br />在Eclipse中点击类中warning的图标一下，Eclipse就会自动给定两种生成的方式，如上面所述。如果不想定义它，在Eclipse的设置中也可以把它关掉的，设置如下： <br />Window ==&gt; Preferences ==&gt; Java ==&gt; Compiler ==&gt; Error/Warnings ==&gt; Potential programming problems <br />将Serializable class without serialVersionUID的warning改成ignore即可。 <br /><br />如果你没有考虑到兼容性问题时，就把它关掉，不过有这个功能是好的，只要任何类别实现了Serializable这个接口的话，如果没有加入serialVersionUID，Eclipse都会给你warning提示，这个serialVersionUID为了让该类别Serializable向后兼容。 <br /><br />如果你的类Serialized存到硬盘上面后，可是后来你却更改了类别的field(增加或减少或改名)，当你Deserialize时，就会出现Exception的，这样就会造成不兼容性的问题。 <br /><br />但当serialVersionUID相同时，它就会将不一样的field以type的预设值Deserialize，这个可以避开不兼容性的问题。</span></p>]]></description>
		</item>
		
</channel>
</rss>