<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>燕子~~</title>
    <description></description>
    <link>http://wangzhen-1104.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>创建表空间</title>
        <author>燕子~~</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangzhen-1104.javaeye.com">燕子~~</a>&nbsp;
                    链接：<a href="http://wangzhen-1104.javaeye.com/blog/239383" style="color:red;">http://wangzhen-1104.javaeye.com/blog/239383</a>&nbsp;
          发表时间: 2008年09月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="tit">Oracle创建删除用户、角色、表空间、导入导出、...命令总结【转】</div>
<div class="date">2008年04月28日 星期一 下午 12:49</div>
<table border="0" style="table-layout: fixed;">
<tbody>
<tr>
<td>
<div class="cnt" id="blog_text">
<p><strong><span style="color: #000000;">//创建临时表空间</span></strong></p>
<p><span style="color: #0000ff;"><strong>create temporary tablespace zfmi_temp<br />tempfile 'D:\oracle\oradata\zfmi\zfmi_temp.dbf' <br />size 32m <br />autoextend on <br />next 32m maxsize 2048m<br />extent management local;</strong></span></p>
<p><span style="color: #ff0000;">//tempfile参数必须有</span></p>
<p><br /><span style="color: #000000;"><strong>//创建数据表空间</strong></span></p>
<p><span style="color: #0000ff;"><strong>create tablespace zfmi<br />logging<br />datafile 'D:\oracle\oradata\zfmi\zfmi.dbf' <br />size 100m <br />autoextend on <br />next 32m maxsize 2048m<br />extent management local;</strong></span></p>
<p><span style="color: #ff0000;">//datafile参数必须有</span></p>
<p><br /><strong><span style="color: #000000;">//删除用户以及用户所有的对象</span></strong></p>
<p><strong><span style="color: #0000ff;">drop user zfmi cascade;</span></strong></p>
<p>//cascade参数是级联删除该用户所有对象，经常遇到如用户有对象而未加此参数则用户删不了的问题，所以习惯性的加此参数</p>
<p><br /><strong><span style="color: #000000;">//删除表空间</span></strong><br />前提：删除表空间之前要确认该表空间没有被其他用户使用之后再做删除</p>
<p><strong><span style="color: #0000ff;">drop tablespace zfmi including contents and datafiles cascade onstraints;</span></strong></p>
<p>//including contents 删除表空间中的内容，如果删除表空间之前表空间中有内容，而未加此参数，表空间删不掉，所以习惯性的加此参数<br />//including datafiles 删除表空间中的数据文件 <br />//cascade constraints 同时删除tablespace中表的外键参照</p>
<p>&nbsp;</p>
<p><br /><strong><span style="color: #000000;">如果删除表空间之前删除了表空间文件，解决办法:</span></strong></p>
<p>如果在清除表空间之前，先删除了表空间对应的数据文件，会造成数据库无法正常启动和关闭。<br />可使用如下方法恢复（此方法已经在oracle9i中验证通过）：<br />下面的过程中，filename是已经被删除的数据文件，如果有多个，则需要多次执行；tablespace_name是相应的表空间的名称。<br />$ sqlplus /nolog<br />SQL&gt; conn / as sysdba;<br />如果数据库已经启动，则需要先执行下面这行：<br />SQL&gt; shutdown abort<br />SQL&gt; startup mount <br />SQL&gt; alter database datafile 'filename' offline drop; <br />SQL&gt; alter database open; <br />SQL&gt; drop tablespace tablespace_name including contents;</p>
<p>&nbsp;</p>
<p><strong><span style="color: #000000;">//创建用户并指定表空间</span></strong></p>
<p><strong><span style="color: #0000ff;">create user zfmi identified by zfmi<br />default tablespace zfmi </span></strong><strong><span style="color: #0000ff;">temporary tablespace zfmi_temp;</span></strong></p>
<p><span style="color: #ff0000;">//<span style="color: #0000ff;"><span style="color: #ff0000;">identified by</span> </span>参数必须有</span></p>
<p><br /><strong><span style="color: #000000;">//授予message用户DBA角色的所有权限</span></strong></p>
<p><strong><span style="color: #0000ff;">GRANT DBA TO zfmi;</span></strong></p>
<p><br /><strong><span style="color: #000000;">//给用户授予权限</span></strong></p>
<p><strong><span style="color: #0000ff;">grant connect,resource to zfmi;</span></strong> (db2：指定所有权限)</p>
<p>&nbsp;</p>
<p><br /><strong><span style="color: #000000;">导入导出命令：</span></strong></p>
<p>Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件， imp命令可以把dmp文件从本地导入到远处的数据库服务器中。 利用这个功能可以构建两个相同的数据库，一个用来测试，一个用来正式使用。</p>
<p>执行环境：可以在SQLPLUS.EXE或者DOS（命令行）中执行，<br />DOS中可以执行时由于 在oracle 8i 中 安装目录ora81BIN被设置为全局路径，<br />该目录下有EXP.EXE与IMP.EXE文件被用来执行导入导出。<br />oracle用java编写，SQLPLUS.EXE、EXP.EXE、IMP.EXE这两个文件有可能是被包装后的类文件。<br />SQLPLUS.EXE调用EXP.EXE、IMP.EXE所包裹的类，完成导入导出功能。</p>
<p>下面介绍的是导入导出的实例。<br />数据导出：<br />1 将数据库TEST完全导出,用户名system 密码manager 导出到D:daochu.dmp中<br />&nbsp;&nbsp; exp <a href="mailto:system/manager@TEST">system/manager@TEST</a> file=d:daochu.dmp full=y<br />2 将数据库中system用户与sys用户的表导出<br />&nbsp;&nbsp; exp <a href="mailto:system/manager@TEST">system/manager@TEST</a> file=d:daochu.dmp owner=(system,sys)<br />3 将数据库中的表inner_notify、notify_staff_relat导出<br />&nbsp;&nbsp;&nbsp; exp <a href="mailto:aichannel/aichannel@TESTDB2">aichannel/aichannel@TESTDB2</a> file= d:datanewsmgnt.dmp tables=(inner_notify,notify_staff_relat)</p>
<p>4 将数据库中的表table1中的字段filed1以"00"打头的数据导出<br />&nbsp;&nbsp; exp <a href="mailto:system/manager@TEST">system/manager@TEST</a> file=d:daochu.dmp tables=(table1) query=" where filed1 like '00%'"</p>
<p>上面是常用的导出，对于压缩，既用winzip把dmp文件可以很好的压缩。<br />也可以在上面命令后面 加上 compress=y 来实现。</p>
<p>数据的导入<br />1 将D:daochu.dmp 中的数据导入 TEST数据库中。<br />&nbsp;&nbsp; imp <a href="mailto:system/manager@TEST">system/manager@TEST</a> file=d:daochu.dmp<br />&nbsp;&nbsp; imp <a href="mailto:aichannel/aichannel@HUST">aichannel/aichannel@HUST</a> full=y file=d:datanewsmgnt.dmp ignore=y<br />&nbsp;&nbsp; 上面可能有点问题，因为有的表已经存在，然后它就报错，对该表就不进行导入。<br />&nbsp;&nbsp; 在后面加上 ignore=y 就可以了。<br />2 将d:daochu.dmp中的表table1 导入<br />imp <a href="mailto:system/manager@TEST">system/manager@TEST</a> file=d:daochu.dmp tables=(table1)</p>
<p>基本上上面的导入导出够用了。不少情况要先是将表彻底删除，然后导入。</p>
<p>注意：<br />操作者要有足够的权限，权限不够它会提示。<br />数据库时可以连上的。可以用tnsping TEST 来获得数据库TEST能否连上。</p>
<p>附录一：<br />给用户增加导入数据权限的操作<br />第一,启动sql*puls<br />第二，以system/manager登陆<br />第三，create user 用户名 IDENTIFIED BY 密码 （如果已经创建过用户，这步可以省略）<br />第四，GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,<br />&nbsp;&nbsp; DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBA,CONNECT,RESOURCE,CREATE SESSION TO 用户名字<br />第五, 运行-cmd-进入dmp文件所在的目录,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imp userid=system/manager full=y file=*.dmp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或者 imp userid=system/manager full=y file=filename.dmp</p>
<p>执行示例:<br />F:WorkOracle_Databackup&gt;imp userid=test/test full=y file=inner_notify.dmp</p>
<p>屏幕显示<br />Import: Release 8.1.7.0.0 - Production on 星期四 2月 16 16:50:05 2006<br />(c) Copyright 2000 Oracle Corporation. All rights reserved.</p>
<p>连接到: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production<br />With the Partitioning option<br />JServer Release 8.1.7.0.0 - Production</p>
<p>经由常规路径导出由EXPORT:V08.01.07创建的文件<br />已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入<br />导出服务器使用UTF8 NCHAR 字符集 (可能的ncharset转换)<br />. 正在将AICHANNEL的对象导入到 AICHANNEL<br />. . 正在导入表&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "INNER_NOTIFY"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4行被导入<br />准备启用约束条件...<br />成功终止导入，但出现警告。</p>
<p><br />附录二：<br />Oracle 不允许直接改变表的拥有者, 利用Export/Import可以达到这一目的.<br />先建立import9.par,<br />然后，使用时命令如下：imp parfile=/filepath/import9.par<br />例 import9.par 内容如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROMUSER=TGPMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TOUSER=TGPMS2&nbsp;&nbsp;&nbsp;&nbsp; （注：把表的拥有者由FROMUSER改为TOUSER，FROMUSER和TOUSER的用户可以不同）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROWS=Y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEXES=Y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GRANTS=Y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONSTRAINTS=Y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BUFFER=409600<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file==/backup/ctgpc_20030623.dmp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log==/backup/import_20030623.log</p>
</div>
</td>
</tr>
</tbody>
</table>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wangzhen-1104.javaeye.com/blog/239383#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 08 Sep 2008 16:58:46 +0800</pubDate>
        <link>http://wangzhen-1104.javaeye.com/blog/239383</link>
        <guid>http://wangzhen-1104.javaeye.com/blog/239383</guid>
      </item>
          <item>
        <title>myEclipse安装过程</title>
        <author>燕子~~</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangzhen-1104.javaeye.com">燕子~~</a>&nbsp;
                    链接：<a href="http://wangzhen-1104.javaeye.com/blog/225565" style="color:red;">http://wangzhen-1104.javaeye.com/blog/225565</a>&nbsp;
          发表时间: 2008年08月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>MyEclipse是Eclipse的一个插件，所以，你必须先安装Eclipse才可以安装MyEclipse。 <br />MyEclipse是一个编译器，要做JAVA程序，就要配置基本的JDK环境变量 <br />一、安装JDK <br /><br />首先下载JDK 5.0（JDK 5.0的下载页面为：<a href="http://java.sun.com/j2se/1.5.0/download.jsp" target="_blank">http://java.sun.com/j2se/1.5.0/download.jsp</a>）； 然后运行JDK 5.0安装程序jdk-1_5_0_06-windows-i586-p.exe，安装过程中所有选项保持默认；最后配置JDK的环境变量：在&ldquo;我的电脑&rdquo;上点右键&mdash;&gt;&ldquo;属性&rdquo;&mdash;&gt;&ldquo;高级&rdquo;&mdash;&gt; &ldquo;环境变量(N)&rdquo;。 <br /><br /><br /><br />新建系统变量JAVA_HOME：C:\Program Files\Java\jdk1.5.0_06； <br /><br />新建系统变量CLASSPATH：.;%JAVA_HOME%\lib;（注意：点号表示当前目录，不能省略） <br /><br />在系统变量Path的值的前面加入以下内容：%JAVA_HOME%\bin;(注意:这里的分号不能省略) <br /><br />到这里，JDK安装完毕。 <br /><br />注意:如果以后要安装诸如Eclipse、Borland JBuilder、JCreator、IntelliJ IDEA等集成开发环境(IDE,Integrated Development Environment),应该在IDE中编译运行一个简单的HelloWorld程序，以保证IDE可以识别出JDK的位置。 <br /><br />二、安装Tomcat <br /><br />首先下载jakarta-tomcat-5.0.30.zip，之所以下载免安装版的好处是可以使用多个Tomcat（jakarta-tomcat-5.0.30.zip的下载页面为： <br /><br /><a href="http://apache.linuxforum.net/tomcat/tomcat-5/v5.0.30/bin/" target="_blank">http://apache.linuxforum.net/tomcat/tomcat-5/v5.0.30/bin/</a>）； <br /><br />然后将jakarta-tomcat-5.0.30.zip直接解压到D盘根目录： <br /><br /><br /><br />最后配置Tomcat的环境变量：在&ldquo;我的电脑&rdquo;上点右键&mdash;&gt;&ldquo;属性&rdquo;&mdash;&gt;&ldquo;高级&rdquo;&mdash;&gt; &ldquo;环境变量(N)&rdquo;。 <br /><br />新建系统变量CATALINA_HOME：D:\jakarta-tomcat-5.0.30 <br /><br />在系统变量CLASSPATH的值的后面加入：%CATALINA_HOME%\common\lib; <br /><br />在系统变量Path的值中"%JAVA_HOME%\bin;"的后面加入以下内容：%CATALINA_HOME%\bin; <br /><br />到这里，Tomcat安装完毕。 <br /><br />进行完一、二两步的设置以后，各系统变量的值如下： <br /><br />JAVA_HOME:C:\Program Files\Java\jdk1.5.0_06 <br />CATALINA_HOME:D:\jakarta-tomcat-5.0.30 <br />CLASSPATH:.;%JAVA_HOME%\lib;%CATALINA_HOME%\common\lib; <br />Path:%JAVA_HOME%\bin;%CATALINA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem <br /><br />三、安装Eclipse <br /><br />首先下载eclipse-SDK-3.1.2-win32.zip（eclipse-SDK-3.1.2-win32.zip下载地址为： <br /><br /><a href="http://www.eclipse.org/downloads/" target="_blank">http://www.eclipse.org/downloads/</a>）； <br /><br />然后将eclipse-SDK-3.1.2-win32.zip直接解压到D盘根目录： <br /><br /><br /><br />到这里， Eclipse安装完毕。 <br /><br />四、安装MyEclipse <br /><br />首先下载EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe（EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe 的下载地址为： <br /><a href="http://www.myeclipseide.com/ContentExpress-display-ceid-10.html" target="_blank">http://www.myeclipseide.com/ContentExpress-display-ceid-10.html</a>）； <br /><br />然后安装EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe。注意：安装时候要选择Eclipse的安装路径，其他选项保持默认。 <br /><br /><br /><br />安装完毕之后，将MyEclipse安装目录下的features和plugins这2个目录覆盖到Eclipse的安装目录下。 <br /><br />最后将刚才安装的 MyEclipse 卸载。 <br /><br />解释一下上面这样做的原因： 因为MyEclipse是Eclipse的插件，所以只要把features和plugins这2个目录覆盖到Eclipse的安装目录，Eclipse就会自动认出这些插件。 <br /><br />到这里，MyEclipse安装完毕。 <br /><br />五、破解MyEclipse <br /><br />运行MyEclipse4.1.1注册机MyEclipseKeyGen.exe，选择MyEclipse的版本号，输入注册名，生成序列号。（MyEclipse4.x注册机的下载地址为： <br /><br /><a href="http://esoft.g8.com.cn/UploadFiles/2006-5/520753587.rar" target="_blank">http://esoft.g8.com.cn/UploadFiles/2006-5/520753587.rar</a>） <br /><br />运行eclipse.exe（首次运行要求指定Workspace），依次点击Window ----&gt; Preferences ----&gt;MyEclipse----&gt;Subscription ----&gt; Enter Subscription，输入注册名以及注册机生成的注册码。 <br /><br />到这里，MyEclipse破解完毕。 <br /><br />六、指定Eclipse+MyEclipse的JRE <br />1.设定Eclipse+MyEclipse的JRE <br /><br />一般情况下，Eclipse可以自动找到JRE，我们不用进行过多的设置。 <br /><br />到这里，我们的Eclipse+MyEclipse开发环境就搭建完毕了！</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wangzhen-1104.javaeye.com/blog/225565#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 07 Aug 2008 17:29:40 +0800</pubDate>
        <link>http://wangzhen-1104.javaeye.com/blog/225565</link>
        <guid>http://wangzhen-1104.javaeye.com/blog/225565</guid>
      </item>
          <item>
        <title>org.hibernate.hql.ast.HqlToken 错误weblogic异常</title>
        <author>燕子~~</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangzhen-1104.javaeye.com">燕子~~</a>&nbsp;
                    链接：<a href="http://wangzhen-1104.javaeye.com/blog/221444" style="color:red;">http://wangzhen-1104.javaeye.com/blog/221444</a>&nbsp;
          发表时间: 2008年07月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在运行过程中出现 <br />ClassNotFoundException: org.hibernate.hql.ast.HqlToken 错误weblogic异常退出。 <br />原因: <br />Hibernate3.0 采用新的基于ANTLR的HQL/SQL查询翻译器，在Hibernate的配置文件中，hibernate.query.factory_class属性用来选择查询翻译器。 <br />（1）选择Hibernate3.0的查询翻译器： <br />hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory <br />（2）选择Hibernate2.1的查询翻译器 <br />hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory <br />为了使用3.0的批量更新和删除功能，只能选择（1）否则不能解释批量更新的语句，当使用的时候出现了不支持条件输入中文的情况。选择（2）可以支持输入中文，但没法解释批量更新语句了 <br />在hibernate3中需要用到antlr，然而这个包在weblogic.jar中已经包含了antrl类库，就会产生一些类加载的错误，无法找到在war或者ear中的hibernate3.jar。 <br />出现这个错误之后，antlr会调用System.exit()，这样weblogic就会中止服务。 <br />解决方法: <br />1.是在hibernate.properties文件中增加属性：hibernate.query.factory_class，属性的值是org.hibernate.hql.classic.ClassicQueryTranslatorFactory，这样就可以解决问题了。 <br />但是部分功能会有问题，譬如 <br />但本系在批量删除和更新会有问题,本系统不采用 <br />2.将antlr-2.7.5H3.jar到Weblogic的pre_Classpath :用WinRar或Winzip打开C:\bea\weblogic81\server\lib\weblogic.jar 删除里面的antlr目录, 然后再antlr-2.7.5H3.jar放在weblogic.jar的同一目录(注:替换之后没做做过严格测试,尚不知是否有后遗症) <br />3. 1、拷贝Hibernate3里带的包antlr-2.7.5H3.jar到%WL_HOME%\server\lib下 <br />2、修改% mydomain% \ startWebLogic.cmd ： <br />在set CLASSPATH之前加上下面一句： <br />set PRE_CLASSPATH=%WL_HOME%\server\lib\antlr-2.7.5H3.jar; <br />在set CLASSPATH之后加上下面一句： <br />set CLASSPATH=%PRE_CLASSPATH%;%CLASSPATH% <br />一切OK！ <br />具体原因可参照此页：http://dev2dev.bea.com/blog/pmalani/archive/2005/07/configuring_web.html</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wangzhen-1104.javaeye.com/blog/221444#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Jul 2008 11:25:23 +0800</pubDate>
        <link>http://wangzhen-1104.javaeye.com/blog/221444</link>
        <guid>http://wangzhen-1104.javaeye.com/blog/221444</guid>
      </item>
          <item>
        <title>jsp request</title>
        <author>燕子~~</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangzhen-1104.javaeye.com">燕子~~</a>&nbsp;
                    链接：<a href="http://wangzhen-1104.javaeye.com/blog/220512" style="color:red;">http://wangzhen-1104.javaeye.com/blog/220512</a>&nbsp;
          发表时间: 2008年07月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table cellspacing="0" border="0" width="96%" cellpadding="0" style="table-layout: fixed; word-break: break-all;">
<tbody>
<tr>
<td bgcolor="#e8f0f1">JSP&nbsp;request用法</td>
</tr>
<tr>
<td>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td></td>
</tr>
</tbody>
</table>
<span class="oblog_text">&nbsp;
<p>&lt;<a href="mailto:%@page">%@page</a> contentType="text/html; charset=GB2312"%&gt;<br />&lt;html&gt;<br />&nbsp; &lt;head&gt;<br />&nbsp;&nbsp;&nbsp; &lt;title&gt;tree&lt;/title&gt;<br />&nbsp; &lt;/head&gt;<br />&nbsp; &lt;body bgcolor="green"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;font size="1"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取文本框提交的信息：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String textContent = request.getParameter("boy");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte b[] = textContent.getBytes("ISO-8859-1");&nbsp;&nbsp; //传递中文信息以防乱码<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textContent = new String(b);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (textContent == null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textContent = "";&nbsp;&nbsp; //防止文本框为空出错<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br/&gt;<br />&lt;%=textContent %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取按钮的名字：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%String btnname = request.getParameter("submit");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%out.write(btnname);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BR&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 客户使用的协议是:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String protocol = request.getProtocol();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(protocol);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BR&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取接受客户提交信息的页面：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String path = request.getServletPath();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(path);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BR&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接受客户提交信息的长度：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int length = request.getContentLength();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BR&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 客户提交信息的方式：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String method = request.getMethod();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(method);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BR&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取HTTP头文件中User-Agent的值：：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String header1 = request.getHeader("User-Agent");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(header1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BR&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取HTTP头文件中accept的值：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String header2 = request.getHeader("accept");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(header2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BR&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取HTTP头文件中Host的值：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String header3 = request.getHeader("Host");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(header3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BR&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取HTTP头文件中accept-encoding的值：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String header4 = request.getHeader("accept-encoding");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(header4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BR&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取客户的IP地址：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String IP = request.getRemoteAddr();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(IP);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BR&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取客户机的名称：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String clientName = request.getRemoteHost();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(clientName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BR&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取服务器的名称：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String serverName = request.getServerName();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(serverName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BR&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取服务器的端口号：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int serverPort = request.getServerPort();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(serverPort);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BR&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/font&gt;<br />&nbsp; &lt;/body&gt;<br />&lt;/html&gt;</p>
<p>request对象的主要方法有：<br />1. getAttribute( String name )<br />返回name指定的属性值，如果指定的属性值不存在，则会返回null值．</p>
<p>2. getAttributeNames()<br />返回request对象的所有属性的名字，其结果是一个类举（Enumeration）类的实例．</p>
<p>3. getCookies()<br />返回客户端的Cookie对象，结果是一个Cookies数组．</p>
<p>4. getHeader( String name )<br />返回指定名字的request Header的所有值，其结果也是一个类举类的实例．</p>
<p>5. getHeaderNames()<br />返回所有request Header 的名字，其结果也是一个类举类的实例．</p>
<p>6. getMethod()<br />获得客户端向服务器端传送数据的方法，如get,post等．</p>
<p>7. getParameter( String name )<br />获得客户端传送给服务器的参数值，该参数是由name指定的．</p>
<p>8. getParameterNames()<br />返回客户端传给服务器摘的所有参数的名字，其结果也是一个类举类的实例．</p>
<p>9. getParameterValues( String name )<br />获得指定参数的所有值，参数由name指定．</p>
<p>10. getProtocol()<br />获得客户端向服务器端传送数据所依据的协议的名称．</p>
<p>11. getQueryString()<br />获得查询字符串，该字符串由客户端以get方法向服务器端传送．</p>
<p>12. getRequestURI()<br />获取发出请求字符串的客户端的地址．</p>
<p>13. getRemoteAddr()<br />获取客户端的IP地址．</p>
<p>14. getRemoteHost()<br />获取客户端的名字．</p>
<p>15. getServerName()<br />获取服务器的名字．</p>
<p>16. getServerPort()<br />获取服务器的名字．．</p>
<p>17. setAttribute( String name , java.lang.Object objt )<br />设置名字为name的request参数的值，该值是由java.lang.Object类型的objt指定</p>
</span></td>
</tr>
</tbody>
</table>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wangzhen-1104.javaeye.com/blog/220512#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 Jul 2008 16:19:27 +0800</pubDate>
        <link>http://wangzhen-1104.javaeye.com/blog/220512</link>
        <guid>http://wangzhen-1104.javaeye.com/blog/220512</guid>
      </item>
          <item>
        <title>Struts的FormFile与Commons-FileUpload控件使用心得 </title>
        <author>燕子~~</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangzhen-1104.javaeye.com">燕子~~</a>&nbsp;
                    链接：<a href="http://wangzhen-1104.javaeye.com/blog/216254" style="color:red;">http://wangzhen-1104.javaeye.com/blog/216254</a>&nbsp;
          发表时间: 2008年07月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: x-small;"><span style="font-family: 宋体;">前一段时间刚来公司,看到一个项目中以前有人写的</span><span style="font-family: Times New Roman;">struts</span><span style="font-family: 宋体;">代码。是使用了<span style="font-family: Times New Roman;">FormFile来处理</span>关于文件上传的模块</span><span style="font-family: 宋体;">。但是用力一段时间后，发现出问题了。写完的这个模块，上传文件是没有问题的，但是当服务器的空间较小的时候，穿一个比较大的文件就出问题了，文件还没有上传完，就抛出一个错误的页面</span><span style="font-family: Times New Roman;">,</span><span style="font-family: 宋体;">报告上传模块出了问题，而且是</span><span style="font-family: Times New Roman;">Tomcat</span><span style="font-family: 宋体;">默认的出错页面。</span></span> </p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">于是想办法，修改，查看源代码，发现原来写这段代码的人是默认等文件上传完以后进入</span><span style="font-size: x-small; font-family: Times New Roman;">Action</span><span style="font-size: x-small; font-family: 宋体;">了才判断文件大小是否超出了限制。</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">但是，默认配置下使用</span><span style="font-size: x-small; font-family: Times New Roman;">struts</span><span style="font-size: x-small; font-family: 宋体;">的</span><span style="font-size: x-small; font-family: Times New Roman;">FormFile</span><span style="font-size: x-small; font-family: 宋体;">比较特殊，</span><span style="font-size: x-small; font-family: Times New Roman;">FormFile</span><span style="font-size: x-small; font-family: 宋体;">是</span><span style="font-size: x-small; font-family: Times New Roman;">struts</span><span style="font-size: x-small; font-family: 宋体;">包对外的一个接口，而且</span><span style="font-size: x-small; font-family: Times New Roman;">org.apache.struts.upload</span><span style="font-size: x-small; font-family: 宋体;">包是使用的</span><span style="font-size: x-small; font-family: Times New Roman;">commons-fileupload-1.0</span><span style="font-size: x-small; font-family: 宋体;">进行的封装。如果使用了它来实现文件上传的功能，则<strong>必须是</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>FormFile</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>对象在被初始化以后才能使用</strong>，那什么时候它才是被初始化的呢？</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">答案是：<strong>在进入</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>Action</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>之前就已经初始化好了！</strong></span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">因此，原先的设计：在</span><span style="font-size: x-small; font-family: Times New Roman;">Action</span><span style="font-size: x-small; font-family: 宋体;">中判断文件大小是根本不能在上传过程中起到提示作用的，因为这时候文件已经上传完了。而且这个设计还有一个确定就是不能捕获上传过程中出现的任何问题。也就是说：在</span><span style="font-size: x-small; font-family: Times New Roman;">Action</span><span style="font-size: x-small; font-family: 宋体;">里我们得到的</span><span style="font-size: x-small; font-family: Times New Roman;">FormFile</span><span style="font-size: x-small; font-family: 宋体;">对象是上传的一个结果，而不是一个未上传好就可以使用的对象！</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">那如何控制</span><span style="font-size: x-small; font-family: Times New Roman;">FormFile</span><span style="font-size: x-small; font-family: 宋体;">上传的过程呢？显然，在</span><span style="font-size: x-small; font-family: Times New Roman;">Action</span><span style="font-size: x-small; font-family: 宋体;">里处理已经不能奏效了，想想别的办法，让我们翻看一下</span><span style="font-size: x-small; font-family: Times New Roman;">Struts</span><span style="font-size: x-small; font-family: 宋体;">的源代码找找灵感吧。</span>&nbsp;</p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">这是</span><span style="font-size: x-small; font-family: Times New Roman;">struts1.1</span><span style="font-size: x-small; font-family: 宋体;">的</span><span style="font-size: x-small; font-family: Times New Roman;">org.apache.struts.upload</span><span style="font-size: x-small; font-family: 宋体;">包的描述：</span></p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/iwindyforest/mail.jpg" height="364" alt="" width="624" /></p>
<p>&nbsp;<span style="font-size: x-small; font-family: 宋体;">从上图我们可以看出有有</span><span style="font-size: x-small; font-family: Times New Roman;">CommonsMultipartRequestHandler</span><span style="font-size: x-small; font-family: 宋体;">和</span><span style="font-size: x-small; font-family: Times New Roman;">DiskMultipartRequestHandler</span><span style="font-size: x-small; font-family: 宋体;">两个类实现了</span><span style="font-size: x-small; font-family: Times New Roman;">MultipartRequestHandler</span><span style="font-size: x-small; font-family: 宋体;">接口。</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">大家都知道，</span><span style="font-size: x-small; font-family: Times New Roman;">Commons-fileupload</span><span style="font-size: x-small; font-family: 宋体;">控件在上传的时候，<strong>使用的</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>enctype</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>为：</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>enctype="multipart/form-data"</strong></span><span style="font-size: x-small; font-family: 宋体;">，因此不难看出</span><span style="font-size: x-small; font-family: Times New Roman;">MultipartRequestHandler</span><span style="font-size: x-small; font-family: 宋体;">的实现就是来处理</span><span style="font-size: x-small; font-family: Times New Roman;">enctype="multipart/form-data"</span><span style="font-size: x-small; font-family: 宋体;">这样的</span><span style="font-size: x-small; font-family: Times New Roman;">post</span><span style="font-size: x-small; font-family: 宋体;">请求的。</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">但是这里有两个类，</span><span style="font-size: x-small; font-family: Times New Roman;">CommonsMultipartRequestHandler</span><span style="font-size: x-small; font-family: 宋体;">和</span><span style="font-size: x-small; font-family: Times New Roman;">DiskMultipartRequestHandler</span><span style="font-size: x-small; font-family: 宋体;">。到底哪个是处理</span><span style="font-size: x-small; font-family: Times New Roman;">FormFile</span><span style="font-size: x-small; font-family: 宋体;">的上传的呢？这个问题应该从</span><span style="font-size: x-small; font-family: Times New Roman;"><strong>org.apache.struts.config</strong></span><span style="font-size: x-small; font-family: 宋体;">包里来找。</span></p>
<p align="justify"><span style="font-size: x-small; font-family: Times New Roman;">org.apache.struts.config</span><span style="font-size: x-small; font-family: 宋体;">包是用来处理</span><span style="font-size: x-small; font-family: Times New Roman;">struts</span><span style="font-size: x-small; font-family: 宋体;">配置文件的数据的包。找到</span><span style="font-size: x-small; font-family: Times New Roman;"><strong>org.apache.struts.config. ControllerConfig</strong></span><span style="font-size: x-small; font-family: 宋体;">。</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">看这几行：</span></p>
<p>&nbsp;</p>
<p><br /><br /><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;fully&nbsp;qualified&nbsp;Java&nbsp;class&nbsp;name&nbsp;of&nbsp;the&nbsp;MultipartRequestHandler<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;class&nbsp;to&nbsp;be&nbsp;used.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;String&nbsp;multipartClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">org.apache.struts.upload.CommonsMultipartRequestHandler</span><span style="color: #000000;">"</span><span style="color: #000000;">;&nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getMultipartClass()&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.multipartClass);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setMultipartClass(String&nbsp;multipartClass)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(configured)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IllegalStateException(</span><span style="color: #000000;">"</span><span style="color: #000000;">Configuration&nbsp;is&nbsp;frozen</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.multipartClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;multipartClass;<br /><br />&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br /><br /></span></p>
<p>&nbsp;</p>
<p><span style="font-size: x-small;"><span style="font-family: 宋体;">这几行的意思很明白，<strong>如果没有在配置文件中配置</strong></span><strong><span style="font-family: Times New Roman;">MultipartRequestHandler</span><span style="font-family: 宋体;"><strong>实现类的绝对路径，那就使用</strong></span><span style="font-family: Times New Roman;"><strong>org.apache.struts.upload.CommonsMultipartRequestHandler</strong></span><span style="font-family: 宋体;"><strong>类默认处理</strong>。</span></strong></span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: Times New Roman;">^_^</span><span style="font-size: x-small; font-family: 宋体;">，这就是关键了</span><span style="font-size: x-small; font-family: Times New Roman;">:<strong>struts</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>是默认使用</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>org.apache.struts.upload.CommonsMultipartRequestHandler</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>类来处理</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>FormFile</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>指定的上传文件的</strong>。</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">马上转到</span><span style="font-size: x-small; font-family: Times New Roman;">org.apache.struts.upload.CommonsMultipartRequestHandler</span><span style="font-size: x-small; font-family: 宋体;">来看看：</span></p>
<p align="justify">&nbsp;</p>
<p><br /><br /><span style="color: #008000;">/**</span><span style="color: #008000;"><br /><br />&nbsp;&nbsp;&nbsp;*默认文件上传的大小是250M<br /><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;DEFAULT_SIZE_MAX&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">250</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1024</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1024</span><span style="color: #000000;">;&nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br /><br />&nbsp;&nbsp;&nbsp;*上传文件在内存中使用的缓冲区大小，超过次数值的数据写入硬盘。<br /><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;DEFAULT_SIZE_THRESHOLD&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">256</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1024</span><span style="color: #000000;">;&nbsp;<br /><br /><br /></span></p>
<p>&nbsp;</p>
<p><strong>&nbsp;<span style="font-size: x-small; font-family: 宋体;">还有，最最重要的实现方法：</span></strong></p>
<p>&nbsp;</p>
<p><br /><br /><span style="color: #008000;">/**</span><span style="color: #008000;"><br /><br />&nbsp;&nbsp;&nbsp;*&nbsp;Parses&nbsp;the&nbsp;input&nbsp;stream&nbsp;and&nbsp;partitions&nbsp;the&nbsp;parsed&nbsp;items&nbsp;into&nbsp;a&nbsp;set&nbsp;of<br /><br />&nbsp;&nbsp;&nbsp;*&nbsp;form&nbsp;fields&nbsp;and&nbsp;a&nbsp;set&nbsp;of&nbsp;file&nbsp;items.&nbsp;In&nbsp;the&nbsp;process,&nbsp;the&nbsp;parsed&nbsp;items<br /><br />&nbsp;&nbsp;&nbsp;*&nbsp;are&nbsp;translated&nbsp;from&nbsp;Commons&nbsp;FileUpload&nbsp;&lt;code&gt;FileItem&lt;/code&gt;&nbsp;instances<br /><br />&nbsp;&nbsp;&nbsp;*&nbsp;to&nbsp;Struts&nbsp;&lt;code&gt;FormFile&lt;/code&gt;&nbsp;instances.<br /><br />&nbsp;&nbsp;&nbsp;*<br /><br />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;request&nbsp;The&nbsp;multipart&nbsp;request&nbsp;to&nbsp;be&nbsp;processed.<br /><br />&nbsp;&nbsp;&nbsp;*<br /><br />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;ServletException&nbsp;if&nbsp;an&nbsp;unrecoverable&nbsp;error&nbsp;occurs.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;就是这个函数处理上传文件的request，把request交给<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Commons&nbsp;FileUpload&nbsp;控件处理，并解析FileItem转换成Struts的FormFile。<br /><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;handleRequest(HttpServletRequest&nbsp;request)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;ServletException&nbsp;<br /><br /><br /></span></p>
<p>&nbsp;</p>
<p><span style="font-size: x-small; font-family: 宋体;">再看看这个函数内部是怎么实现的吧？</span></p>
<p><span style="font-size: x-small; font-family: 宋体;">&nbsp;</span>&nbsp;</p>
<p><br /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;使用了DiskFileUpload。<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;（Commons-FileUpload很老版本的一个上传实现类了，还在用？我的显示是Deprecated）</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;DiskFileUpload&nbsp;upload&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DiskFileUpload();<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;上传最大值</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;upload.setSizeMax((</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)&nbsp;getSizeMax(ac));<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;上传文件在内存中使用的缓冲区大小</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;upload.setSizeThreshold((</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)&nbsp;getSizeThreshold(ac));<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;存在硬盘的什么地方，一般是默认</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;upload.setRepositoryPath(getRepositoryPath(ac));&nbsp;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /></span></p>
<p>&nbsp;</p>
<p>接着看handleRequest如何处理request的：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br /><br /><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Parse&nbsp;the&nbsp;request&nbsp;into&nbsp;file&nbsp;items.</span><span style="color: #008000;"><br /></span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;items&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;items&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;upload.parseRequest(request);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">这里是关键：上传过程中出了超出最大值的异常了，如何处理？</span><span style="color: #008000;"><br /></span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(DiskFileUpload.SizeLimitExceededException&nbsp;e)&nbsp;{&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Special&nbsp;handling&nbsp;for&nbsp;uploads&nbsp;that&nbsp;are&nbsp;too&nbsp;big.</span><span style="color: #008000;"><br /></span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute(<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED,<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Boolean.TRUE);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">出了其他异常，如enctype不对，磁盘空间不足怎么办？</span><span style="color: #008000;"><br /></span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(FileUploadException&nbsp;e)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(</span><span style="color: #000000;">"</span><span style="color: #000000;">Failed&nbsp;to&nbsp;parse&nbsp;multipart&nbsp;request</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;e);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ServletException(e);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></span></p>
<p>&nbsp;</p>
<p>&nbsp;<span style="font-size: x-small; font-family: 宋体;">这次一目了然了：</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: Times New Roman;"><strong>Struts</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>根本没有把上传过程中出的超出最大值的异常带到</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>Action</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>，因为那是不可能的，而是把它放到了</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>rquest</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>的</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>Attribute</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>里</strong>。</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">而出了其他异常如</span><span style="font-size: x-small; font-family: Times New Roman;">enctype</span><span style="font-size: x-small; font-family: 宋体;">不对，磁盘空间不足怎么办？很遗憾，</span><span style="font-size: x-small; font-family: Times New Roman;">Struts</span><span style="font-size: x-small; font-family: 宋体;">没有去处理它，而是</span><span style="font-size: x-small; font-family: Times New Roman;">log</span><span style="font-size: x-small; font-family: 宋体;">了一下，抛给了上一层了。</span>&nbsp;</p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">那我一定要获得这些全部异常咋办呢？没办法，自己定制一个</span><span style="font-size: x-small; font-family: Times New Roman;">MultipartRequestHandler</span><span style="font-size: x-small; font-family: 宋体;">吧，那样就能彻底解决上传过程中的控制问题了！</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">在此之前，我们得先去最新版的</span><span style="font-size: x-small; font-family: Times New Roman;">commons-fileupload</span><span style="font-size: x-small; font-family: 宋体;">控件看看上传过程中可能抛出多少异常？</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: Times New Roman;">//</span><span style="font-size: x-small; font-family: 宋体;">所有上传异常的父类</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: Times New Roman;">org.apache.commons.fileupload.FileUploadException</span>&nbsp;</p>
<ul>
<p align="justify"><span style="font-size: x-small; font-family: Times New Roman;">//</span><span style="font-size: x-small; font-family: 宋体;">注意：这个类的类名是</span><span style="font-size: x-small; font-family: Times New Roman;">FileUploadBase.SizeLimitExceededException</span><span style="font-size: x-small; font-family: 宋体;">是个</span><span style="font-size: x-small; font-family: Times New Roman;">public</span><span style="font-size: x-small; font-family: 宋体;">内</span><span style="font-size: x-small; font-family: Times New Roman;">//</span><span style="font-size: x-small; font-family: 宋体;">部类。上传的</span><span style="font-size: x-small; font-family: Times New Roman;">formdata</span><span style="font-size: x-small; font-family: 宋体;">总的数据超出了规定大小</span></p>
</ul>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: Times New Roman;">org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException</span>&nbsp;</p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: Times New Roman;">//</span><span style="font-size: x-small; font-family: 宋体;">注意：也是个内部类。这个才是上传的文件超出了规定大小</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: Times New Roman;">org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">其它的，也看看吧：</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: Times New Roman;">org.apache.commons.fileupload.FileUploadBase.FileUploadIOException</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: Times New Roman;">org.apache.commons.fileupload.FileUploadBase.InvalidContentTypeException</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: Times New Roman;">org.apache.commons.fileupload.FileUploadBase.IOFileUploadException</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: Times New Roman;">org.apache.commons.fileupload.FileUploadBase.UnknownSizeException</span>&nbsp;</p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">要想获得尽可能仔细的数据就在处理的</span><span style="font-size: x-small; font-family: Times New Roman;">try/catch</span><span style="font-size: x-small; font-family: 宋体;">块里把上面的异常都</span><span style="font-size: x-small; font-family: Times New Roman;">catch</span><span style="font-size: x-small; font-family: 宋体;">一下，放到</span><span style="font-size: x-small; font-family: Times New Roman;">request</span><span style="font-size: x-small; font-family: 宋体;">的</span><span style="font-size: x-small; font-family: Times New Roman;">attribute</span><span style="font-size: x-small; font-family: 宋体;">里去就</span><span style="font-size: x-small; font-family: Times New Roman;">OK</span><span style="font-size: x-small; font-family: 宋体;">了。</span></p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">另外还有要说的是，<strong>最好用</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>commons-fileupload</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>控件的最新版本，因为</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>DiskFileUpload</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>这个类，</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>commons-fileupload</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>已经弃用了，取而代之的是</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>ServletFileUpload</strong></span><span style="font-size: x-small; font-family: 宋体;"><strong>类了，所以一定要注意！切记，切记</strong></span><span style="font-size: x-small; font-family: Times New Roman;"><strong>&hellip;..</strong></span>&nbsp;</p>
<p align="justify">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small; font-family: 宋体;">这是我写的</span><span style="font-size: x-small; font-family: Times New Roman;">CommonsMultipartRequestHandler</span><span style="font-size: x-small; font-family: 宋体;">替代类的</span><span style="font-size: x-small; font-family: Times New Roman;">public void handleRequest(HttpServletRequest request) throws ServletException</span><span style="font-size: x-small; font-family: 宋体;">函数：</span>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;handleRequest(HttpServletRequest&nbsp;request)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;ServletException<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" id="_89_4458_Open_Image" onclick="this.style.display=''none''; document.getElementById(''_89_4458_Open_Text'').style.display=''none''; document.getElementById(''_89_4458_Closed_Image'').style.display=''inline''; document.getElementById(''_89_4458_Closed_Text'').style.display=''inline'';" align="top" alt="" /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" id="_89_4458_Closed_Image" onclick="this.style.display=''none''; document.getElementById(''_89_4458_Closed_Text'').style.display=''none''; document.getElementById(''_89_4458_Open_Image'').style.display=''inline''; document.getElementById(''_89_4458_Open_Text'').style.display=''inline'';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="_89_4458_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">...</span><span id="_89_4458_Open_Text"><span style="color: #000000;">{&nbsp;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Get&nbsp;the&nbsp;app&nbsp;config&nbsp;for&nbsp;the&nbsp;current&nbsp;request.</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ModuleConfig&nbsp;ac&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(ModuleConfig)&nbsp;request.getAttribute(Globals.MODULE_KEY);&nbsp;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;DiskFileItem工厂,主要用来设定上传文件的参数</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DiskFileItemFactory&nbsp;fileItemFactory&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DiskFileItemFactory();<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;上传文件所用到的缓冲区大小,超过此缓冲区的部分将被写入到磁盘</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileItemFactory.setSizeThreshold((</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.getSizeThreshold(ac));<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;上传文件用到的临时文件存放位置</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileItemFactory.setRepository(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.getRepository(ac));&nbsp;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;使用fileItemFactory为参数实例化一个ServletFileUpload对象<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;注意:该对象为commons-fileupload-1.2新增的类.<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;对于1.2以下的commons-fileupload版本并不存在此类.</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletFileUpload&nbsp;upload&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ServletFileUpload(fileItemFactory);<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;从session中读取对本次上传文件的最大值的限制</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;maxUploadSize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(String)&nbsp;request.getSession().getAttribute(BasicConstants.maxUploadSize);<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;获取struts-config文件中controller标签的maxFileSize属性来确定默认上传的限制<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果struts-config文件中controller标签的maxFileSize属性没设置则使用默认的上传限制250M.</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;defaultOrConfigedMaxUploadSize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.getSizeMax(ac);&nbsp;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(maxUploadSize&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;maxUploadSize&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">)<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" id="_1348_1620_Open_Image" onclick="this.style.display=''none''; document.getElementById(''_1348_1620_Open_Text'').style.display=''none''; document.getElementById(''_1348_1620_Closed_Image'').style.display=''inline''; document.getElementById(''_1348_1620_Closed_Text'').style.display=''inline'';" align="top" alt="" /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" id="_1348_1620_Closed_Image" onclick="this.style.display=''none''; document.getElementById(''_1348_1620_Closed_Text'').style.display=''none''; document.getElementById(''_1348_1620_Open_Image'').style.display=''inline''; document.getElementById(''_1348_1620_Open_Text'').style.display=''inline'';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="_1348_1620_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">...</span><span id="_1348_1620_Open_Text"><span style="color: #000000;">{<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果maxUploadSize设定不正确则上传限制为defaultOrConfigedMaxUploadSize的值<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;正确则为maxUploadSize转换成的字节数</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upload.setSizeMax((</span><span style="color: #0000ff;">long</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.convertSizeToBytes(maxUploadSize,&nbsp;defaultOrConfigedMaxUploadSize));<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" id="_1659_1804_Open_Image" onclick="this.style.display=''none''; document.getElementById(''_1659_1804_Open_Text'').style.display=''none''; document.getElementById(''_1659_1804_Closed_Image'').style.display=''inline''; document.getElementById(''_1659_1804_Closed_Text'').style.display=''inline'';" align="top" alt="" /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" id="_1659_1804_Closed_Image" onclick="this.style.display=''none''; document.getElementById(''_1659_1804_Closed_Text'').style.display=''none''; document.getElementById(''_1659_1804_Open_Image'').style.display=''inline''; document.getElementById(''_1659_1804_Open_Text'').style.display=''inline'';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="_1659_1804_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">...</span><span id="_1659_1804_Open_Text"><span style="color: #000000;">{<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果maxUploadSize没设置则使用默认的上传限制</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upload.setSizeMax(defaultOrConfigedMaxUploadSize);<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;">&nbsp;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;从session中清空maxUploadSize</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.getSession().removeAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">maxUploadSize</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Create&nbsp;the&nbsp;hash&nbsp;tables&nbsp;to&nbsp;be&nbsp;populated.</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elementsText&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Hashtable();<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elementsFile&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Hashtable();<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elementsAll&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Hashtable();&nbsp;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Parse&nbsp;the&nbsp;request&nbsp;into&nbsp;file&nbsp;items.</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;items&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;ServletFileUpload类来处理表单请求<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;抛出的异常为FileUploadException的子异常<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果捕获这些异常就将捕获的异常放到session中返回.</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" id="_2396_2474_Open_Image" onclick="this.style.display=''none''; document.getElementById(''_2396_2474_Open_Text'').style.display=''none''; document.getElementById(''_2396_2474_Closed_Image'').style.display=''inline''; document.getElementById(''_2396_2474_Closed_Text'').style.display=''inline'';" align="top" alt="" /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" id="_2396_2474_Closed_Image" onclick="this.style.display=''none''; document.getElementById(''_2396_2474_Closed_Text'').style.display=''none''; document.getElementById(''_2396_2474_Open_Image'').style.display=''inline''; document.getElementById(''_2396_2474_Open_Text'').style.display=''inline'';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="_2396_2474_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">...</span><span id="_2396_2474_Open_Text"><span style="color: #000000;">{<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;items&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;upload.parseRequest(request);<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(FileUploadBase.SizeLimitExceededException&nbsp;e)<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" id="_2560_2759_Open_Image" onclick="this.style.display=''none''; document.getElementById(''_2560_2759_Open_Text'').style.display=''none''; document.getElementById(''_2560_2759_Closed_Image'').style.display=''inline''; document.getElementById(''_2560_2759_Closed_Text'').style.display=''inline'';" align="top" alt="" /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" id="_2560_2759_Closed_Image" onclick="this.style.display=''none''; document.getElementById(''_2560_2759_Closed_Text'').style.display=''none''; document.getElementById(''_2560_2759_Open_Image'').style.display=''inline''; document.getElementById(''_2560_2759_Open_Text'').style.display=''inline'';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="_2560_2759_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">...</span><span id="_2560_2759_Open_Text"><span style="color: #000000;">{<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;请求数据的size超出了规定的大小.</span><span style="color: #008000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.getSession().setAttribute(BasicConstants.baseSizeLimitExceededException,&nbsp;e);<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(FileUploadBase.FileSizeLimitExceededException&nbsp;e)<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" id="_2849_3052_Open_Image" onclick="this.style.display=''none''; document.getElementById(''_2849_3052_Open_Text'').style.display=''none''; document.getElementById(''_2849_3052_Closed_Image'').style.display=''inline''; document.getElementById(''_2849_3052_Closed_Text'').style.display=''inline'';" align="top" alt="" /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" id="_2849_3052_Closed_Image" onclick="this.style.display=''none''; document.getElementById(''_2849_3052_Closed_Text'').style.display=''none''; document.getElementById(''_2849_3052_Open_Image'').style.display=''inline''; document.getElementById(''_2849_3052_Open_Text'').style.display=''inline'';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="_2849_3052_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">...</span><</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wangzhen-1104.javaeye.com/blog/216254#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 Jul 2008 17:02:14 +0800</pubDate>
        <link>http://wangzhen-1104.javaeye.com/blog/216254</link>
        <guid>http://wangzhen-1104.javaeye.com/blog/216254</guid>
      </item>
          <item>
        <title>杭州游记</title>
        <author>燕子~~</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangzhen-1104.javaeye.com">燕子~~</a>&nbsp;
                    链接：<a href="http://wangzhen-1104.javaeye.com/blog/215966" style="color:red;">http://wangzhen-1104.javaeye.com/blog/215966</a>&nbsp;
          发表时间: 2008年07月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small; color: #008000; font-family: 幼圆;">&ldquo;西湖美景，三月天呐，春雨如酒，柳如烟呐；有缘千里来相会，无缘对面手难牵，十年修得同船度，百年修得共枕眠。&rdquo;走在西湖边上，嘴里哼着这首歌，想象着当年许仙和白娘子在断桥上相逢，那场面啊，今天想起来确实有些感觉。而今我是一个人漫步在这西湖边上，头顶着烈日，任凭周围人声嘈杂，心中却是欢喜的，毕竟是出来旅游嘛，心情当然不错。更何况是这美丽的西湖呢，脑中又浮现出一句，&ldquo;若把西湖比西子，淡妆浓抹总相宜。&rdquo;怪不得同事说，他跟他老婆走在西湖边上，边走边作诗呢，当时我还不信，现在我信了，这么美的景色面前，才思如泉涌一般的冒出来了。据说来西湖最好的时间是清明前后，或者十月份（山核桃下来了，很好吃）。去之前，我盼望着下雨，那时就可以雨中漫步西湖了，可并未随我心愿，又是艳阳高照，最高气温达到35&deg;，但对于没来过西湖的我来说，不管是下火也好，也阻挡不了我游玩的脚步。我从武林门，一直走到断桥，然后徒步走过白堤，到了岳庙，这在地图上也是一段不近的距离呢，估计去过杭州的人应该知道，像我这样的没有几个吧。我想走这么远的路是跟心情有关的，我的心情一直都很愉快。所以也就一路走来了。白堤是没有什么特别的，两旁都种了很多树，而且路两旁的风景各异。走在白堤上可以望见远处的在湖中的一个个郁郁葱葱的小岛，那是三潭印月，就是湖中的三个岛，需要乘船过去；再远处依稀可见雷峰塔还有远山。白堤的另一侧，则是一池荷花，还有那青翠逼人的山，让人看着真是舒服。一路上有美景陪伴，所以也就不觉得累了。来西湖之前，我告诉自己一定要来岳飞庙看看，总觉得这是个一定要去的地方，说心中有几分崇敬之情是一点也不夸张的。在去岳庙的途中，路过了苏小小的墓，之前，我一直以为苏小小是苏东坡的妹妹呢，呵呵，我在那照相留念，希望沾点她的才情和她那不俗气质。中午12点半了，我终于到了岳庙。站在岳庙门前，我几乎睁不开眼睛，强烈的太阳光直射地面，然后又反射到我的身上，把我像馒头一样的烤着:) 又是留影，无非是想告诉别人我来过这了。一个人旅游就是这点不好，想留个影总得麻烦别人，这不，我又麻烦别人了。我喜欢岳庙里面那些很有气节的题词，比如心昭天日、还我河山、精忠报国、一门忠孝、气壮山河等等。这时候不管是谁，都会精神振奋的！人们纷纷跟大英雄岳飞合影，终于轮到我了，我紧紧的握住岳飞的手，让那一瞬间成为了永恒。当然还有那些遭人唾弃的叛徒，比如说秦桧，他老婆王氏。很早以前听我妈说过，秦桧和王氏的铜像是跪着的，并且游人路过都要唾弃一番，所以想象着比较恶心，今日亲眼所见，确实挺那个的，唉，名垂千史和遗臭万年都是会让人们记住的，只不过，纪念的方式不同罢了。他们估计也没想想到这么多年过去了，他们竟是这样的下场。好在现代人的素质高了，随地吐痰是不文明的，大家多吃几根油条就行了，一样解恨了。油条不就是炸得秦桧和王氏么？我没有再多留片刻，因为我实在是有些虚脱了，在这炎炎烈日下，我又徒步走了这么多路，实在是没那个体力了。本来我想去雷峰塔还有龙井村去看看呢，可是只能留给下次了，人生本来就是要留些遗憾的，不然怎么还会有下次呢。 <br /><br />其实我来杭州的一个主要的目的是奔好吃的来的。在杭州吃的第一顿饭就是在马滕路的外婆家，这是家很有名的餐厅，早上十点多就有很多人在就餐了，我去的时候刚好，人还不多，我把这得招聘菜点了个遍，别忘了我是一个人啊，一个人的战斗啊，一个人吃了这么多的菜，珊瑚虾、茶香鸡、西湖醋鱼、酒酿圆子等等，可把我撑坏了，周围就餐的人和服务员一定以为我几天没吃饭了呢，我顾不得那么多了，谁让我是&ldquo;见了吃不要命&rdquo;呢。所以吃完了，我就去宾馆躺着去了，实在是走不动了。中午吃得多也就算了，谁知道，下午从灵隐寺回来，又遇上了美味，真是可与而不可求啊--&ldquo;知味观&rdquo;。这又是杭州的一个无人不知无人不晓的地方。虽然我毫无饿意，但我还是走进去了，唉，见了吃不要命嘛。我点了东坡肉、猫耳朵、千层木瓜酥、小笼包......居然这么美味。当时我脑子里突然冒出一个念头，我要是在杭州买房多好啊。真想一辈子陪着这些美食过。到了第二天，我知道下午就要回上海了，但是心里面总觉还缺了点什么，那就是--&ldquo;爆鳝面&rdquo;。来杭州之前，我就Google了一下杭州的美食，有一个叫做&ldquo;奎元馆&rdquo;的地方给我很深印象，据说，金庸每次来杭州，必到奎元馆吃一碗爆鳝面。想必这爆鳝面必定是美味了。所以，在临走之前，我一定要吃上一碗再走。为了这碗面，我又付出了沉重的代价。我走街串巷，四处询问，估计打车也得花上几十块钱的路程，但不管怎么说，我找到了，在解放路上的这家奎元馆。下午四点钟，我坐在大厅里，吃着爆鳝面，那叫一个香，什么千里迢迢，跋山涉水啊，统统抛到脑后了，此时此刻，就享受一碗爆鳝面。在杭州一共就吃了这三顿饭，让人回味无穷啊。 <br /><br />当然在这次旅行中，给我印象最深是两位素不相识的大妈。她们的热情好客，给我这次一个人的旅行很多鼓舞，也让我心情变得很愉快，很轻松。她们给我讲当地的风土人情，告诉到到哪买上好的丝绸，去哪买正宗的龙井，还有就是到哪吃正宗的爆鳝面，呵呵，这些除了龙井茶外，我都领略过了。真的由衷的感谢他们。杭州有了这群可爱的人们明天会更好！ <br /><br />杭州，我还会再来的！</span></p>
<p><span style="font-size: small; color: #008000; font-family: 幼圆;">&nbsp;</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wangzhen-1104.javaeye.com/blog/215966#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 17 Jul 2008 22:53:16 +0800</pubDate>
        <link>http://wangzhen-1104.javaeye.com/blog/215966</link>
        <guid>http://wangzhen-1104.javaeye.com/blog/215966</guid>
      </item>
          <item>
        <title>webwork+spring+hibernate下用spring aop 做日志 </title>
        <author>燕子~~</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangzhen-1104.javaeye.com">燕子~~</a>&nbsp;
                    链接：<a href="http://wangzhen-1104.javaeye.com/blog/210612" style="color:red;">http://wangzhen-1104.javaeye.com/blog/210612</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我想用spring aop拦截webwork中action的方法，用的是jdk dynamic proxy，可是action中的request为空，还有从页面传过来的参数也是空的，不知道为什么
          <br/><br/>
          <span style="color:red;">
            <a href="http://wangzhen-1104.javaeye.com/blog/210612#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 14:45:02 +0800</pubDate>
        <link>http://wangzhen-1104.javaeye.com/blog/210612</link>
        <guid>http://wangzhen-1104.javaeye.com/blog/210612</guid>
      </item>
          <item>
        <title>sping aop 看得懂的</title>
        <author>燕子~~</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangzhen-1104.javaeye.com">燕子~~</a>&nbsp;
                    链接：<a href="http://wangzhen-1104.javaeye.com/blog/207962" style="color:red;">http://wangzhen-1104.javaeye.com/blog/207962</a>&nbsp;
          发表时间: 2008年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Aspect Oriented Programming<br />AOP概念<br />Aspect Oriented Programming（AOP）是近来较为热门的一个话题。AOP，国内<br />大致译作&ldquo;面向方面编程&rdquo;。<br />&ldquo;面向方面编程&rdquo;,这样的名字并不是非常容易理解，且容易产生一些误导。笔者不止<br />一次听到类似&ldquo;OOP/OOD11即将落伍，AOP是新一代软件开发方式&rdquo;这样的发言。显然，<br />发言者并没有理解AOP的含义。<br />Aspect，没错，的确是&ldquo;方面&rdquo;的意思。不过，华语传统语义中的&ldquo;方面&rdquo;，大多数情<br />况下指的是一件事情的不同维度、或者说不同角度上的特性，比如我们常说：&ldquo;这件事情要<br />从几个方面来看待&rdquo;，往往意思是：需要从不同的角度来看待同一个事物。这里的&ldquo;方面&rdquo;，<br />指的是事务的外在特性在不同观察角度下的体现。<br />而在AOP中，Aspect的含义，可能更多的理解为&ldquo;切面&rdquo;比较合适。所以笔者更倾向<br />于&ldquo;面向切面编程&rdquo;的译法。<br />另外需要提及的是，AOP、OOP在字面上虽然非常类似，但却是面向不同领域的两种<br />设计思想。OOP（面向对象编程）针对业务处理过程的实体及其属性和行为进行抽象封装，<br />以获得更加清晰高效的逻辑单元划分。<br />而AOP则是针对业务处理过程中的切面进行提取，它所面对的是处理过程中的某个步<br />骤或阶段，以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有<br />着本质的差异。<br />上面的陈述可能过于理论化，举个简单的例子，对于&ldquo;雇员&rdquo;这样一个业务实体进行封<br />装，自然是OOP/OOD的任务，我们可以为其建立一个&ldquo;Employee&rdquo;类，并将&ldquo;雇员&rdquo;相<br />关的属性和行为封装其中。而用AOP设计思想对&ldquo;雇员&rdquo;进行封装将无从谈起。<br />同样，对于&ldquo;权限检查&rdquo;这一动作片断进行划分，则是AOP的目标领域。而通过OOD/OOP<br />对一个动作进行封装，则有点不伦不类。<br />换而言之，OOD/OOP面向名词领域，AOP面向动词领域。<br />AOP和OOD/OOP并不冲突，我们完全可以在一个应用系统中同时应用OOD/OOP和<br />AOP设计思想，通过OOD/OOP对系统中的业务对象进行建模，同时通过AOP对实体处理<br />过程中的阶段进行隔离处理。即使不是OOD/OOP，而是在传统的POP（面向过程编程）中，<br />AOP也能起到同样的作用。<br />将不同阶段领域加以分隔，这是否就算是AOP呢？<br />AOP还有另外一个重要特点：源码组成无关性。<br />11 OOD ＝ Object Oriented Design OOP = Object Oriented Programming<br />SpringFrameWork Developer&rsquo;s Guide Version 0.6<br />October 8, 2004 So many open source projects. Why not Open your Documents?<br />倘若应用中通过某个具体的业务逻辑类实现了独立的权限检查，而请求调度方法通过预<br />编码调用这个权限模块实现权限管理。那么这也不算是AOP。对于AOP组件而言，很重要<br />的一点就是源码组成无关性，所谓源码组成无关性，体现在具体设计中就是AOP组件必须<br />与应用代码无关，简单来讲，就是应用代码可以脱离AOP组件独立编译。<br />为了实现源码组成无关性，AOP往往通过预编译方式（如AspectJ）和运行期动态代理<br />模式（如Spring AOP 和JBoss AOP）实现。<br />稍后章节中我们会就Spring Framework中的AOP实现机制进行更加深入的探讨。<br />下面先来看AOP中几个比较重要的概念：<br />1． 切面（Aspect）<br />切面，对象操作过程中的截面。这可能是AOP中最关键的一个术语。<br />我们首先来看一个应用开发中常见的切面：用户权限检查。大概只要是完整的应用，都<br />少不了用户权限检查这个模块，不同身份的用户可以做什么，不可以做什么，均由这个模块<br />加以判定。而这个模块调用的位置通常也比较固定：用户发起请求之后，执行业务逻辑之前。<br />针对权限检查这一模块进行分离，我们就得到了一个切面：<br />切面意义何在？<br />首先根据上例，假设我们实现了一个通用的权限检查模块，那么就可以在这层切面上进<br />行统一的集中式权限管理。而业务逻辑组件则无需关心权限方面的问题。也就是说，通过切<br />面，我们可以将系统中各个不同层次上的问题隔离开来，实现统一集约式处理。各切面只需<br />集中于自己领域内的逻辑实现。<br />这一方面使得开发逻辑更加清晰，专业化分工更加易于进行；另一方面，由于切面的隔<br />离，降低了耦合性，我们就可以在不同的应用中将各个切面组合使用，从而使得代码可重用<br />性大大增强。<br />SpringFrameWork Developer&rsquo;s Guide Version 0.6<br />October 8, 2004 So many open source projects. Why not Open your Documents?<br />2． 连接点（JoinPoint）<br />程序运行过程中的某个阶段点。如某个方法调用，或者某个异常被抛出。<br />3． 处理逻辑（Advice）<br />在某个连接点所采用的处理逻辑<br />（这里的Advice，国内不少文案中翻译为&ldquo;通知&rdquo;，估计是源于金山词霸，与实际含义不符，因而这<br />里采用意译）<br />处理逻辑的调用模式通常有三种：<br />i. Around<br />在连接点前后插入预处理过程和后处理过程。<br />ii. Before<br />仅在连接点之前插入预处理过程。<br />iii. Throw<br />在连接点抛出异常时进行异常处理。<br />4． 切点（PointCut）<br />一系列连接点的集合，它指明处理方式（Advice）将在何时被触发。<br />上述几个概念我们将在稍后的&ldquo;AOP应用&rdquo;一节中结合实际使用进行具体探讨。<br />SpringFrameWork Developer&rsquo;s Guide Version 0.6<br />October 8, 2004 So many open source projects. Why not Open your Documents?<br />AOP in Spring<br />Spring中提供的内置AOP支持，是基于动态AOP机制实现。从技术角度来讲，所谓动<br />态AOP，即通过动态Proxy模式，在目标对象的方法调用前后插入相应的处理代码。<br />而Spring AOP中的动态Proxy模式，则是基于Java Dynamic Proxy（面向Interface）<br />和CGLib（面向Class）实现。<br />前面曾经提及，Spring Framework中的&ldquo;事务管理&rdquo;服务，实际上是借助AOP机制<br />完成。我们这里就以&ldquo;事务管理&rdquo;为例，对动态AOP的实现加以探讨，一方面对动态AOP<br />的实现原理加以探究，另一方面，也可以加深对Spring中事务管理机制的理解。<br />首先，我们来看基于Java Dynamic Proxy的AOP实现原理。<br />Dynamic Proxy 与Spring AOP<br />Dynamic Proxy是JDK 1.3版本中新引入的一种动态代理机制。它是Proxy模式的一<br />种动态实现版本。<br />我们先来看传统方式下一个Proxy的实现实例。<br />假设我们有一个UserDAO接口及其实现类UserDAOImp:<br />UserDAO.java:<br />public interface UserDAO {<br />public void saveUser(User user);<br />}<br />UserDAOImp.java:<br />public class UserDAOImp implements UserDAO{<br />public void saveUser(User user) {<br />&hellip;&hellip;<br />}<br />}<br />UserDAOImp.saveUser方法中实现了针对User对象的数据库持久逻辑。<br />如果我们希望在UserDAOImp.saveUser方法执行前后追加一些处理过程，如启动/<br />提交事务，而不影响外部代码的调用逻辑，那么，增加一个Proxy类是个不错的选择：<br />UserDAOProxy.java<br />public class UserDAOProxy implements UserDAO {<br />private UserDAO userDAO;<br />public UserDAOProxy(UserDAO userDAO) {<br />SpringFrameWork Developer&rsquo;s Guide Version 0.6<br />October 8, 2004 So many open source projects. Why not Open your Documents?<br />this.userDAO = userDAO;<br />}<br />public void saveUser(User user) {<br />UserTransaction tx = null;<br />try {<br />tx = (UserTransaction) (<br />new InitialContext().lookup("java/tx")<br />);<br />userDAO.saveUser(user);<br />tx.commit();<br />} catch (Exception ex) {<br />if (null!=tx){<br />try {<br />tx.rollback();<br />}catch(Exception e) {<br />}<br />}<br />}<br />}<br />}<br />UserDAOProxy同样是UserDAO接口的实现，对于调用者而言，saveUser方法的使<br />用完全相同，不同的是内部实现机制已经发生了一些变化――我们在UserDAOProxy中为<br />UserDAO.saveUser方法套上了一个JTA事务管理的外壳。<br />上面是静态Proxy模式的一个典型实现。<br />现在假设系统中有20个类似的接口，针对每个接口实现一个Proxy，实在是个繁琐无<br />味的苦力工程。<br />Dynamic Proxy的出现，为这个问题提供了一个更加聪明的解决方案。<br />我们来看看怎样通过Dynamic Proxy解决上面的问题：<br />public class TxHandler implements InvocationHandler {<br />private Object originalObject;<br />public Object bind(Object obj) {<br />this.originalObject = obj;<br />return Proxy.newProxyInstance(<br />obj.getClass().getClassLoader(),<br />obj.getClass().getInterfaces(),<br />SpringFrameWork Developer&rsquo;s Guide Version 0.6<br />October 8, 2004 So many open source projects. Why not Open your Documents?<br />this);<br />}<br />public Object invoke(Object proxy, Method method, Object[] args)<br />throws Throwable {<br />Object result = null;<br />if (!method.getName().startsWith("save")) {<br />UserTransaction tx = null;<br />try {<br />tx = (UserTransaction) (<br />new InitialContext().lookup("java/tx")<br />);<br />result = method.invoke(originalObject, args);<br />tx.commit();<br />} catch (Exception ex) {<br />if (null != tx) {<br />try {<br />tx.rollback();<br />} catch (Exception e) {<br />}<br />}<br />}<br />} else {<br />result = method.invoke(originalObject, args);<br />}<br />return result;<br />}<br />}<br />首先注意到，上面这段代码中，并没有出现与具体应用层相关的接口或者类引用。也就<br />是说，这个代理类适用于所有接口的实现。<br />其中的关键在两个部分：<br />1.<br />return Proxy.newProxyInstance(<br />obj.getClass().getClassLoader(),<br />obj.getClass().getInterfaces(),<br />SpringFrameWork Developer&rsquo;s Guide Version 0.6<br />October 8, 2004 So many open source projects. Why not Open your Documents?<br />this);<br />java.lang.reflect.Proxy.newProxyInstance方法根据传入的接口类型<br />（obj.getClass().getInterfaces()）动态构造一个代理类实例返回，这个代理类是JVM<br />在内存中动态构造的动态类，它实现了传入的接口列表中所包含的所有接口。<br />这里也可以看出，Dynamic Proxy要求所代理的类必须是某个接口的实现<br />（obj.getClass().getInterfaces()不可为空），否则无法为其构造响应的动态类。这也<br />就是为什么Spring对接口实现类通过Dynamic Proxy实现AOP，而对于没有实现任何接口<br />的类通过CGLIB实现AOP机制的原因，关于CGLIB，请参见稍后章节的讨论。<br />2.<br />public Object invoke(Object proxy, Method method, Object[] args)<br />throws Throwable {<br />&hellip;&hellip;<br />result = method.invoke(originalObject, args);<br />&hellip;&hellip;<br />return result;<br />}<br />InvocationHandler.invoke方法将在被代理类的方法被调用之前触发。通过这个方<br />法中，我们可以在被代理类方法调用的前后进行一些处理，如代码中所示，<br />InvocationHandler.invoke方法的参数中传递了当前被调用的方法（Method），以及被<br />调用方法的参数。<br />同时，我们可以通过Method.invoke方法调用被代理类的原始方法实现。这样，我们<br />就可以在被代理类的方法调用前后大做文章。<br />在示例代码中，我们为所有名称以&ldquo;save&rdquo;开头的方法追加了JTA事务管理。<br />谈到这里，可以回忆一下Spring事务配置中的内容：<br />&lt;property name="transactionAttributes"&gt;<br />&lt;props&gt;<br />&lt;prop key="save*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />&lt;prop key="get*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />&lt;/props&gt;<br />&lt;/property&gt;<br />想必大家已经猜测到Spring事务管理机制的实现原理。<br />是的，只需通过一个Dynamic Proxy对所有需要事务管理的Bean进行加载，并根据配<br />置，在invoke方法中对当前调用的方法名进行判定，并为其加上合适的事务管理代码，那<br />么就实现了Spring式的事务管理。<br />当然，Spring中的AOP实现更为复杂和灵活，不过基本原理一致。<br />SpringFrameWork Developer&rsquo;s Guide Version 0.6<br />October 8, 2004 So many open source projects. Why not Open your Documents?<br />代码胜千言，下面是笔者在客户培训过程中编写的一个Dynamic Proxy based AOP<br />实现示例，非常简单，有兴趣的读者可以看看。<br />AOPHandler.java:<br />public class AOPHandler implements InvocationHandler {<br />private static Log logger = LogFactory.getLog(AOPHandler.class);<br />private List interceptors = null;<br />private Object originalObject;<br />/**<br />* 返回动态代理实例<br />* @param obj<br />* @return<br />*/<br />public Object bind(Object obj) {<br />this.originalObject = obj;<br />return Proxy.newProxyInstance(obj.getClass().getClassLoader(),<br />obj<br />.getClass().getInterfaces(), this);<br />}<br />/**<br />* 在Invoke方法中，加载对应的Interceptor，并进行<br />* 预处理(before)、后处理(after)以及异常处理（exceptionThrow）过程<br />*/<br />public Object invoke(Object proxy, Method method, Object[] args)<br />throws Throwable {<br />Object result = null;<br />Throwable ex = null;<br />InvocationInfo invInfo = new InvocationInfo(proxy, method, args,<br />result, ex);<br />logger.debug("Invoking Before Intercetpors!");<br />invokeInterceptorsBefore(invInfo);<br />SpringFrameWork Developer&rsquo;s Guide Version 0.6<br />October 8, 2004 So many open source projects. Why not Open your Documents?<br />try {<br />logger.debug("Invoking Proxy Method!");<br />result = method.invoke(originalObject, args);<br />invInfo.setResult(result);<br />logger.debug("Invoking After Method!");<br />invokeInterceptorsAfter(invInfo);<br />} catch (Throwable tr) {<br />invInfo.setException(tr);<br />logger.debug("Invoking exceptionThrow Method!");<br />invokeInterceptorsExceptionThrow(invInfo);<br />throw new AOPRuntimeException(tr);<br />}<br />return result;<br />}<br />/**<br />* 加载Interceptor<br />* @return<br />*/<br />private synchronized List getIntercetors() {<br />if (null == interceptors) {<br />interceptors = new ArrayList();<br />//Todo：读取配置，加载Interceptor实例<br />//interceptors.add(new MyInterceptor());<br />}<br />return interceptors;<br />}<br />/**<br />* 执行预处理方法<br />* @param invInfo<br />*/<br />private void invokeInterceptorsBefore(InvocationInfo invInfo) {<br />List interceptors = getIntercetors();<br />int len = interceptors.size();<br />SpringFrameWork Developer&rsquo;s Guide Version 0.6<br />October 8, 2004 So many open source projects. Why not Open your Documents?<br />for (int i = 0; i &lt; len; i++) {<br />((Interceptor) interceptors.get(i)).before(invInfo);<br />}<br />}<br />/**<br />* 执行后处理方法<br />* @param invInfo<br />*/<br />private void invokeInterceptorsAfter(InvocationInfo invInfo) {<br />List interceptors = getIntercetors();<br />int len = interceptors.size();<br />for (int i = len - 1; i &gt;= 0; i--) {<br />((Interceptor) interceptors.get(i)).after(invInfo);<br />}<br />}<br />/**<br />* 执行异常处理方法<br />* @param invInfo<br />*/<br />private void invokeInterceptorsExceptionThrow(InvocationInfo<br />invInfo) {<br />List interceptors = getIntercetors();<br />int len = interceptors.size();<br />for (int i = len - 1; i &gt;= 0; i--) {<br />((Interceptor)<br />interceptors.get(i)).exceptionThrow(invInfo);<br />}<br />}<br />}<br />Interceptor.java:<br />public interface Interceptor {<br />public void before(InvocationInfo invInfo);<br />public void after(InvocationInfo invInfo);<br />public void exceptionThrow(InvocationInfo invInfo);<br />}<br />InvocationInfo.java:<br />SpringFrameWork Developer&rsquo;s Guide Version 0.6<br />October 8, 2004 So many open source projects. Why not Open your Documents?<br />public class InvocationInfo {<br />Object proxy;<br />Method method;<br />Object[] args;<br />Object result;<br />Throwable Exception;<br />public InvocationInfo(Object proxy, Method method, Object[] args,<br />Object result, Throwable exception) {<br />super();<br />this.proxy = proxy;<br />this.method = method;<br />this.args = args;<br />this.result = result;<br />Exception = exception;<br />}<br />public Object getResult() {<br />return result;<br />}<br />public void setResult(Object result) {<br />this.result = result;<br />}<br />public Object[] getArgs() {<br />return args;<br />}<br />public void setArgs(Object[] args) {<br />this.args = args;<br />}<br />public Throwable getException() {<br />return Exception;<br />}<br />public void setException(Throwable exception) {<br />Exception = exception;<br />}<br />public Method getMethod() {<br />return method;<br />}<br />public void setMethod(Method method) {<br />this.method = method;<br />}<br />public Object getProxy() {<br />return proxy;<br />}<br />SpringFrameWork Developer&rsquo;s Guide Version 0.6<br />October 8, 2004 So many open source projects. Why not Open your Documents?<br />public void setProxy(Object proxy) {<br />this.proxy = proxy;<br />}<br />}<br />AOPFactory.java:<br />public class AOPFactory {<br />private static Log logger = LogFactory.getLog(AOPFactory.class);<br />/**<br />* 根据类名创建类实例<br />* @param clzName<br />* @return<br />* @throws ClassNotFoundException<br />*/<br />public static Object getClassInstance(String clzName){<br />Class cls;<br />try {<br />cls = Class.forName(clzName);<br />return (Object)cls.newInstance();<br />} catch (ClassNotFoundException e) {<br />logger.debug(e);<br />throw new AOPRuntimeException(e);<br />} catch (InstantiationException e) {<br />logger.debug(e);<br />throw new AOPRuntimeException(e);<br />} catch (IllegalAccessException e) {<br />logger.debug(e);<br />throw new AOPRuntimeException(e);<br />}<br />}<br />/**<br />* 根据传入的类名，返回AOP代理对象<br />* @param clzName<br />* @return<br />*/<br />public static Object getAOPProxyedObject(String clzName){<br />SpringFrameWork Developer&rsquo;s Guide Version 0.6<br />October 8, 2004 So many open source projects. Why not Open your Documents?<br />AOPHandler txHandler = new AOPHandler();<br />Object obj = getClassInstance(clzName);<br />return txHandler.bind(obj);<br />}<br />}<br />MyInterceptor.java:<br />public class MyInterceptor implements Interceptor{<br />private static Log logger = LogFactory.getLog(MyInterceptor.class);<br />public void before(InvocationInfo invInfo) {<br />logger.debug("Pre-processing");<br />}<br />public void after(InvocationInfo invInfo) {<br />logger.debug("Post-processing");<br />}<br />public void exceptionThrow(InvocationInfo invInfo) {<br />logger.debug("Exception-processing");<br />}<br />}<br />Spring中Dynamic Proxy AOP实现类为：<br />org.springframework.aop.framework.JdkDynamicAopProxy<br />SpringFrameWork Developer&rsquo;s Guide Version 0.6<br />October 8, 2004 So many open source projects. Why not Open your Documents?<br />CGLib 与Spring AOP<br />上面曾经提过，Dynamic Proxy是面向接口的动态代理实现，其代理对象必须是某个<br />接口的实现。Dynamic Proxy通过在运行期构建一个此接口的动态实现类完成对目标对象<br />的代理（相当于在运行期动态构造一个UserDAOProxy，完成对UserDAOImp的代理任<br />务）。<br />而如果目标代理对象并未实现任何接口，那