﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-semovy-文章分类-struts</title><link>http://www.blogjava.net/WshmAndLily/category/10974.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 30 Dec 2007 01:47:59 GMT</lastBuildDate><pubDate>Sun, 30 Dec 2007 01:47:59 GMT</pubDate><ttl>60</ttl><item><title>用组件beanutils,dbutils简化JDBC操作 </title><link>http://www.blogjava.net/WshmAndLily/articles/171183.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 28 Dec 2007 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/171183.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/171183.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/171183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/171183.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/171183.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 虽然现在出现了很多ORM框架，可是还是有很多朋友也许还在使用JDBC，就像我现在一样，除了学习的时候在使用Hibernate、Spring类似这些优秀的框架，工作时一直都在使用JDBC。本文就简单介绍一下利用Jakarta Commons旗下beanutils、dbutils简化JDBC数据库操作，以抛砖引玉，希望对像我一样在使用JDBC的朋友有所帮助。</p>
<p>&nbsp;&nbsp;&nbsp; 下面就分两部分简单介绍beanutils、dbutils在基于JDBC API数据库存取操作中的运用。第一部分显介绍beanutils在JDBC数据库存取操作中的运用，第二部分介绍dbutils在JDBC数据库存取操作中的运用，最后看看他们的优缺点，谈谈本人在项目运用过程中对他们的一点心得体会，仅供参考，其中有错误的地方希望大虾不吝赐教，大家多多交流共同进步。</p>
<p>&nbsp;&nbsp;&nbsp; 一、Jakarta Commons beanutils</p>
<p>&nbsp;&nbsp;&nbsp; Beanutils是操作Bean的锐利武器，其提过的BeanUtils工具类可以简单方便的读取或设置Bean的属性，利用Dyna系列，还可以在运行期创建Bean，符合懒人的习惯，正如LazyDynaBean，LazyDynaClass一样，呵呵。这些用法已经有很多文章提及，也可以参考apache的官方文档。</p>
<p>&nbsp;&nbsp;&nbsp; 对于直接利用JDBC API访问数据库时（这里针对的是返回结果集ResultSet的查询select），大多数都是采用两种方式，一种是取出返回的结果集的数据存于Map中，另一种方式是Bean里。针对第二种方式，Beanutils里提供了ResultSetDynaClass结合DynaBean以及RowSetDynaClass结合DynaBean来简化操作。下面用以个简单的例子展示一下beanutils的这两个类在JDBC数据库操作中的运用。</p>
<p>&nbsp;&nbsp;&nbsp; 请在本机建立数据库publish，我用的是MySQL，在publish数据库中建立表book,脚本如下：</p>
<p>CREATE TABLE book(</p>
<p>&nbsp; id int(11) NOT NULL auto_increment,</p>
<p>&nbsp; title varchar(50) character set latin1 NOT NULL,</p>
<p>&nbsp; authors varchar(50) character set latin1 default NULL,</p>
<p>&nbsp; PRIMARY KEY&nbsp; (id)</p>
<p><br />
)</p>
<p>&nbsp;&nbsp;&nbsp; 然后用你喜欢的编辑器建立一个类BeanutilsJDBCTest，我们先用ResultSetDynaClass来处理，然后再用RowSetDynaClass来实现同样的类，之后看看他们之间有什么不同，用ResultSetDynaClass处理的源代码如下所示:</p>
<p>&nbsp;&nbsp;&nbsp; 然后用你喜欢的编辑器建立一个类BeanutilsJDBCTest，我们先用ResultSetDynaClass来处理，然后再用RowSetDynaClass来实现同样的类，之后看看他们之间有什么不同，用ResultSetDynaClass处理的源代码如下所示:</p>
<p>package cn.qtone.test;</p>
<p>import java.sql.Connection;</p>
<p>import java.sql.DriverManager;</p>
<p>import java.sql.ResultSet;</p>
<p>import java.sql.Statement;</p>
<p>import java.util.Iterator;</p>
<p>import org.apache.commons.beanutils.DynaBean;</p>
<p>import org.apache.commons.beanutils.PropertyUtils;</p>
<p>import org.apache.commons.beanutils.ResultSetDynaClass;</p>
<p>public class BeanutilsJDBCTest{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection con = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement st = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("com.mysql.jdbc.Driver");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&amp;characterEncoding=GBK";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con = DriverManager.getConnection(url, "root", "hyys");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st = con.createStatement();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = st.executeQuery("select * from book");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSetDynaClass rsDynaClass = new ResultSetDynaClass(rs);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator itr = rsDynaClass.iterator();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("title-------------authors");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (itr.hasNext()) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DynaBean dBean = (DynaBean) itr.next();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(PropertyUtils.getSimpleProperty(dBean,"title")</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "-------------"+ PropertyUtils.getSimpleProperty(dBean, "authors"));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rs != null) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (st != null) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st.close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (con != null) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>&nbsp;&nbsp;&nbsp; 用RowSetDynaClass处理的源代码如下所示:</p>
<p>package cn.qtone.test;</p>
<p>import java.sql.Connection;</p>
<p>import java.sql.DriverManager;</p>
<p>import java.sql.ResultSet;</p>
<p>import java.sql.Statement;</p>
<p>import java.util.Iterator;</p>
<p>import java.util.List;</p>
<p>import org.apache.commons.beanutils.DynaBean;</p>
<p>import org.apache.commons.beanutils.PropertyUtils;</p>
<p>import org.apache.commons.beanutils.RowSetDynaClass;</p>
<p>public class BeanutilsJDBCTest{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List rsDynaClass = rsTest();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("title ------------- authors ");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator itr = rsDynaClass.iterator();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (itr.hasNext()) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DynaBean dBean = (DynaBean) itr.next();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(PropertyUtils.getSimpleProperty(dBean,"name")</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "-------------"+ PropertyUtils.getSimpleProperty(dBean, "mobile"));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO 自动生成 catch 块</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static List rsTest() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection con = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement st = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("com.mysql.jdbc.Driver");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&amp;characterEncoding=GBK";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con = DriverManager.getConnection(url, "root", "hyys");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st = con.createStatement();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = st.executeQuery("select * from book");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RowSetDynaClass rsdc = new RowSetDynaClass(rs);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rsdc.getRows();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rs != null) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (st != null) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st.close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (con != null) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>&nbsp;&nbsp;&nbsp; 这两个方法输出的结果应该是一样的。但是很显然第二种方式比第一种方式要好，它把数据访问部分抽取出来放到一个方法中，显得简单清晰。</p>
<p>&nbsp;&nbsp;&nbsp; 其实在利用ResultSetDynaClass时，必须在ResultSet等数据库资源关闭之前，处理好那些数据，你不能在资源关闭之后使用DynaBean，否则就会抛出异常，异常就是说不能在ResultSet之后存取数据（具体的异常名我也忘了），当然你也可以采用以前的方式一个一个的把数据放到Map里，如果你一定要那样做，建议还是别用Beanutils，因为这没带给你什么好处。总之利用ResultSetDynaClass你的程序的扩展性非常部好。</p>
<p>&nbsp;&nbsp;&nbsp; 从第二中方式可以看出，利用RowSetDynaClass可以很好的解决上述ResultSetDynaClass遇到的问题，RowSetDynaClass的getRows()方法，把每一行封装在一个DynaBean对象里，然后，把说有的行放到一个List里，之后你就可以对返回的List里的每一个DynaBean进行处理，此外对于DynaBean你还可以采用标准的get/set方式处理，当然你也可以用PropertyUtils. getSimpleProperty(Object bean, String name)进行处理。</p>
<p>&nbsp;&nbsp;&nbsp; 从上面的分析中，你应该可以决定你应该使用ResultSetDynaClass还是RowSetDynaClass了。</p>
<p>&nbsp;&nbsp;&nbsp; 虽然现在出现了很多ORM框架，可是还是有很多朋友也许还在使用JDBC，就像我现在一样，除了学习的时候在使用Hibernate、Spring类似这些优秀的框架，工作时一直都在使用JDBC。本文就简单介绍一下利用Jakarta Commons旗下beanutils、dbutils简化JDBC数据库操作，以抛砖引玉，希望对像我一样在使用JDBC的朋友有所帮助。</p>
<p>&nbsp;&nbsp;&nbsp; 下面就分两部分简单介绍beanutils、dbutils在基于JDBC API数据库存取操作中的运用。第一部分显介绍beanutils在JDBC数据库存取操作中的运用，第二部分介绍dbutils在JDBC数据库存取操作中的运用，最后看看他们的优缺点，谈谈本人在项目运用过程中对他们的一点心得体会，仅供参考，其中有错误的地方希望大虾不吝赐教，大家多多交流共同进步。</p>
<p>&nbsp;&nbsp;&nbsp; 一、Jakarta Commons beanutils</p>
<p>&nbsp;&nbsp;&nbsp; Beanutils是操作Bean的锐利武器，其提过的BeanUtils工具类可以简单方便的读取或设置Bean的属性，利用Dyna系列，还可以在运行期创建Bean，符合懒人的习惯，正如LazyDynaBean，LazyDynaClass一样，呵呵。这些用法已经有很多文章提及，也可以参考apache的官方文档。</p>
<p>&nbsp;&nbsp;&nbsp; 对于直接利用JDBC API访问数据库时（这里针对的是返回结果集ResultSet的查询select），大多数都是采用两种方式，一种是取出返回的结果集的数据存于Map中，另一种方式是Bean里。针对第二种方式，Beanutils里提供了ResultSetDynaClass结合DynaBean以及RowSetDynaClass结合DynaBean来简化操作。下面用以个简单的例子展示一下beanutils的这两个类在JDBC数据库操作中的运用。</p>
<p>&nbsp;&nbsp;&nbsp; 请在本机建立数据库publish，我用的是MySQL，在publish数据库中建立表book,脚本如下：</p>
<p>CREATE TABLE book(<br />
&nbsp; id int(11) NOT NULL auto_increment,<br />
&nbsp; title varchar(50) character set latin1 NOT NULL,<br />
&nbsp; authors varchar(50) character set latin1 default NULL,<br />
&nbsp; PRIMARY KEY&nbsp; (id)<br />
)</p>
<p>&nbsp;&nbsp;&nbsp; 然后用你喜欢的编辑器建立一个类BeanutilsJDBCTest，我们先用ResultSetDynaClass来处理，然后再用RowSetDynaClass来实现同样的类，之后看看他们之间有什么不同，用ResultSetDynaClass处理的源代码如下所示:</p>
<p>&nbsp;&nbsp;&nbsp; 然后用你喜欢的编辑器建立一个类BeanutilsJDBCTest，我们先用ResultSetDynaClass来处理，然后再用RowSetDynaClass来实现同样的类，之后看看他们之间有什么不同，用ResultSetDynaClass处理的源代码如下所示:</p>
<p>package cn.qtone.test;<br />
import java.sql.Connection;<br />
import java.sql.DriverManager;<br />
import java.sql.ResultSet;<br />
import java.sql.Statement;<br />
import java.util.Iterator;<br />
import org.apache.commons.beanutils.DynaBean;<br />
import org.apache.commons.beanutils.PropertyUtils;<br />
import org.apache.commons.beanutils.ResultSetDynaClass;<br />
public class BeanutilsJDBCTest{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection con = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement st = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("com.mysql.jdbc.Driver");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&amp;characterEncoding=GBK";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con = DriverManager.getConnection(url, "root", "hyys");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st = con.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = st.executeQuery("select * from book");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSetDynaClass rsDynaClass = new ResultSetDynaClass(rs);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator itr = rsDynaClass.iterator();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("title-------------authors");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (itr.hasNext()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DynaBean dBean = (DynaBean) itr.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(PropertyUtils.getSimpleProperty(dBean,"title")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "-------------"+ PropertyUtils.getSimpleProperty(dBean, "authors"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rs != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (st != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (con != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>&nbsp;&nbsp;&nbsp; 用RowSetDynaClass处理的源代码如下所示:</p>
<p>package cn.qtone.test;<br />
import java.sql.Connection;<br />
import java.sql.DriverManager;<br />
import java.sql.ResultSet;<br />
import java.sql.Statement;<br />
import java.util.Iterator;<br />
import java.util.List;<br />
import org.apache.commons.beanutils.DynaBean;<br />
import org.apache.commons.beanutils.PropertyUtils;<br />
import org.apache.commons.beanutils.RowSetDynaClass;<br />
public class BeanutilsJDBCTest{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List rsDynaClass = rsTest();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("title ------------- authors ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator itr = rsDynaClass.iterator();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (itr.hasNext()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DynaBean dBean = (DynaBean) itr.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(PropertyUtils.getSimpleProperty(dBean,"name")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "-------------"+ PropertyUtils.getSimpleProperty(dBean, "mobile"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO 自动生成 catch 块<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static List rsTest() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection con = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement st = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("com.mysql.jdbc.Driver");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&amp;characterEncoding=GBK";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con = DriverManager.getConnection(url, "root", "hyys");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st = con.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs = st.executeQuery("select * from book");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RowSetDynaClass rsdc = new RowSetDynaClass(rs);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rsdc.getRows();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rs != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (st != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (con != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>&nbsp;&nbsp;&nbsp; 这两个方法输出的结果应该是一样的。但是很显然第二种方式比第一种方式要好，它把数据访问部分抽取出来放到一个方法中，显得简单清晰。</p>
<p>&nbsp;&nbsp;&nbsp; 其实在利用ResultSetDynaClass时，必须在ResultSet等数据库资源关闭之前，处理好那些数据，你不能在资源关闭之后使用DynaBean，否则就会抛出异常，异常就是说不能在ResultSet之后存取数据（具体的异常名我也忘了），当然你也可以采用以前的方式一个一个的把数据放到Map里，如果你一定要那样做，建议还是别用Beanutils，因为这没带给你什么好处。总之利用ResultSetDynaClass你的程序的扩展性非常部好。</p>
<p>&nbsp;&nbsp;&nbsp; 从第二中方式可以看出，利用RowSetDynaClass可以很好的解决上述ResultSetDynaClass遇到的问题，RowSetDynaClass的getRows()方法，把每一行封装在一个DynaBean对象里，然后，把说有的行放到一个List里，之后你就可以对返回的List里的每一个DynaBean进行处理，此外对于DynaBean你还可以采用标准的get/set方式处理，当然你也可以用PropertyUtils. getSimpleProperty(Object bean, String name)进行处理。</p>
<p>&nbsp;&nbsp;&nbsp; 从上面的分析中，你应该可以决定你应该使用ResultSetDynaClass还是RowSetDynaClass了。</p>
<p>&nbsp;&nbsp;&nbsp; 未完待续&#8230;&#8230;</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/171183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-12-28 14:33 <a href="http://www.blogjava.net/WshmAndLily/articles/171183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts中实现文件下载</title><link>http://www.blogjava.net/WshmAndLily/articles/134531.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 05 Aug 2007 10:06:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/134531.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/134531.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/134531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/134531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/134531.html</trackback:ping><description><![CDATA[<font size=2>struts中实现文件下载的主要代码：</font>
<p><font size=2>public ActionForward execute(ActionMapping mapping, ActionForm form,<br>&nbsp;&nbsp;&nbsp;HttpServletRequest request, HttpServletResponse response) {<br>&nbsp;&nbsp;String strFileName = "测试文件.rar";<br>&nbsp;&nbsp;File file = new File("具体路径" + strFileName);//<br>&nbsp;&nbsp;if(file.exists()){<br>&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));<br>&nbsp;&nbsp;&nbsp;&nbsp;byte[] buffer = new byte[1024];<br>&nbsp;&nbsp;&nbsp;&nbsp;strFileName = java.net.URLEncoder.encode(strFileName, "UTF-8");//处理中文文件名的问题<br>&nbsp;&nbsp;&nbsp;&nbsp;strFileName = new String(strFileName.getBytes("UTF-8"),"GBK");//处理中文文件名的问题<br>&nbsp;&nbsp;&nbsp;&nbsp;response.reset();<br>&nbsp;&nbsp;&nbsp;&nbsp;response.setCharacterEncoding("UTF-8");<br>&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType("application/x-rar-compressed");//不同类型的文件对应不同的MIME类型<br>&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader("Content-Disposition","attachment; filename=" + strFileName);<br>&nbsp;&nbsp;&nbsp;&nbsp;OutputStream os = response.getOutputStream();<br>&nbsp;&nbsp;&nbsp;&nbsp;while(bis.read(buffer) &gt; 0){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.write(buffer);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;bis.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;os.close();<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;catch(Exception e){<br>&nbsp;&nbsp;&nbsp;&nbsp;......<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return mapping.getInputForward();<br>&nbsp;}</font></p>
<p><font size=2>在Struts中的实现和在ASP.NET的实现类似，这段代码就是将服务器上的文件以流的方式发送到客户端浏览器，如果要是在线打开的方式的话还应将response.setHeader("Content-Disposition","attachment; filename=" + strFileName);改写为response.setHeader("Content-Disposition","inline; filename=" + strFileName);</font></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/134531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-08-05 18:06 <a href="http://www.blogjava.net/WshmAndLily/articles/134531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>commons fileupload</title><link>http://www.blogjava.net/WshmAndLily/articles/133866.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Wed, 01 Aug 2007 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/133866.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/133866.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/133866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/133866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/133866.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p class="cnt">jsp文件上传大多采用采用开源项目来简化处理，这里列出常用的两个jar包的实现，并进行比较，说明他们的优缺点和应该注意的问题。</p>
<p class="cnt">Commons FileUpload，可以在<a href="http://jakarta.apache.org/commons/fileupload/"><u><font color="#0000ff">http://jakarta.apache.org/commons/fileupload/</font></u></a>下载，这个包需要Commons IO的支持，可以在<a href="http://jakarta.apache.org/commons/io/"><u><font color="#800080">http://jakarta.apache.org/commons/io/</font></u></a>下载</p>
<p class="cnt">com.oreilly.servlet，可以在<a href="http://www.servlets.com/cos/"><u><font color="#0000ff">http://www.servlets.com/cos/</font></u></a>下载 <br />
Commons FileUpload提供三种文件上传处理方式，DiskFileUpload、ServletFileUpload和PortletFileUpload三种方式，其中DiskFileUpload已经在javadoc下已经被标记为过期的方法，建议用ServletFileUpload代替，而PortletFileUpload需要配合portlet-api来使用，所以这里我们只介绍ServletFileUpload，并且这个也是最常用的。</p>
<p class="cnt">com.oreilly.servlet也提供了三种文件上传的处理方式，MultipartWrapper、MultipartRequest和MultipartParser三种方式，其中MultipartWrapper和MultipartRequest的用法基本相同，并且没有MultipartRequest提供的操作多，所以这里介绍MultipartRequest，MultipartParser和前两者有些不同，可以用来处理某些特殊情况，例如表单中有两个同名的文件上传选择框。</p>
<p class="cnt">我们暂时称三面三种文件上传方式分别为：ServletFileUpload方式（MultipartTestServlet）、MultipartRequest方式（MultipartTestServlet2）、MultipartParser方式（MultipartTestServlet3）</p>
<p class="cnt">代码如下：<br />
test.html</p>
<p class="cnt">&lt;%@ page language="java" import="java.util.*" contentType="text/html;charset=gbk" pageEncoding="gbk"%&gt;<br />
&lt;html&gt;<br />
&nbsp;&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;form action="MultipartTestServlet" enctype="multipart/form-data" method="post"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="username" /&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;form action="MultipartTestServlet2" enctype="multipart/form-data" method="post"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="username" /&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;form action="MultipartTestServlet3" enctype="multipart/form-data" method="post"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="username" /&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&nbsp;&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;<br />
MultipartTestServlet.java</p>
<p class="cnt">package com.bug.servlet;</p>
<p class="cnt">import java.io.File;<br />
import java.io.IOException;<br />
import java.util.ArrayList;<br />
import java.util.Iterator;<br />
import java.util.List;</p>
<p class="cnt">import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServlet;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;</p>
<p class="cnt">import org.apache.commons.fileupload.FileItem;<br />
import org.apache.commons.fileupload.FileUpload;<br />
import org.apache.commons.fileupload.FileUploadException;<br />
import org.apache.commons.fileupload.RequestContext;<br />
import org.apache.commons.fileupload.disk.DiskFileItemFactory;<br />
import org.apache.commons.fileupload.servlet.ServletFileUpload;<br />
import org.apache.commons.fileupload.servlet.ServletRequestContext;</p>
<p class="cnt">public class MultipartTestServlet extends HttpServlet {</p>
<p class="cnt">public MultipartTestServlet() {<br />
&nbsp;&nbsp; super();<br />
}</p>
<p class="cnt">public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp; throws ServletException, IOException {</p>
<p class="cnt">&nbsp;&nbsp; request.setCharacterEncoding("gbk");<br />
&nbsp;&nbsp; RequestContext requestContext = new ServletRequestContext(request);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; if(FileUpload.isMultipartContent(requestContext)){<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; DiskFileItemFactory factory = new DiskFileItemFactory();<br />
&nbsp;&nbsp;&nbsp; factory.setRepository(new File("c:/tmp/"));<br />
&nbsp;&nbsp;&nbsp; ServletFileUpload upload = new ServletFileUpload(factory);<br />
&nbsp;&nbsp;&nbsp; //upload.setHeaderEncoding("gbk");<br />
&nbsp;&nbsp;&nbsp; upload.setSizeMax(2000000);<br />
&nbsp;&nbsp;&nbsp; List items = new ArrayList();<br />
&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; items = upload.parseRequest(request);<br />
&nbsp;&nbsp;&nbsp;&nbsp; } catch (FileUploadException e1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("文件上传发生错误" + e1.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p class="cnt">&nbsp;&nbsp;&nbsp; Iterator it = items.iterator();<br />
&nbsp;&nbsp;&nbsp; while(it.hasNext()){<br />
&nbsp;&nbsp;&nbsp;&nbsp; FileItem fileItem = (FileItem) it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(fileItem.isFormField()){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(fileItem.getFieldName() + "&nbsp;&nbsp;&nbsp; " + fileItem.getName() + "&nbsp;&nbsp;&nbsp; " + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));<br />
&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(fileItem.getFieldName() + "&nbsp;&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.getName() + "&nbsp;&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.isInMemory() + "&nbsp;&nbsp;&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.getContentType() + "&nbsp;&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.getSize());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(fileItem.getName()!=null &amp;&amp; fileItem.getSize()!=0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File fullFile = new File(fileItem.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File newFile = new File("c:/temp/" + fullFile.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.write(newFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("文件没有选择 或 文件内容为空");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</p>
<p class="cnt">}</p>
<p class="cnt">MultipartTestServlet2.java</p>
<p class="cnt">package com.bug.servlet;</p>
<p class="cnt">import java.io.IOException;<br />
import java.util.Enumeration;</p>
<p class="cnt">import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServlet;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;</p>
<p class="cnt">import com.oreilly.servlet.MultipartRequest;<br />
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;</p>
<p class="cnt">public class MultipartTestServlet2 extends HttpServlet {</p>
<p class="cnt">public MultipartTestServlet2() {<br />
&nbsp;&nbsp; super();<br />
}</p>
<p class="cnt">public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp; throws ServletException, IOException {</p>
<p class="cnt">&nbsp;&nbsp; //request.setCharacterEncoding("gbk");&nbsp;&nbsp; 不起作用<br />
&nbsp;&nbsp; System.out.println("start ");<br />
&nbsp;&nbsp; MultipartRequest multi = new MultipartRequest(request, "c:/tmp/", 2*1024*1024, "gbk", new DefaultFileRenamePolicy());<br />
&nbsp;&nbsp; System.out.println("start ");<br />
&nbsp;&nbsp; Enumeration filesName = multi.getFileNames();<br />
&nbsp;&nbsp; Enumeration paramsName = multi.getParameterNames();<br />
&nbsp;&nbsp; while(paramsName.hasMoreElements()){<br />
&nbsp;&nbsp;&nbsp; String paramName = (String) paramsName.nextElement();<br />
&nbsp;&nbsp;&nbsp; System.out.println(multi.getParameter(paramName));<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; while(filesName.hasMoreElements()){<br />
&nbsp;&nbsp;&nbsp; String fileName = (String) filesName.nextElement();<br />
&nbsp;&nbsp;&nbsp; System.out.println(multi.getFilesystemName(fileName) + "&nbsp;&nbsp; " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multi.getOriginalFileName(fileName) + "&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multi.getContentType(fileName) + "&nbsp;&nbsp; ");<br />
&nbsp;&nbsp;&nbsp; if(multi.getFilesystemName(fileName)!=null &amp;&amp; !multi.getFilesystemName(fileName).equals(""))<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(multi.getFile(fileName).toURI());<br />
&nbsp;&nbsp; }<br />
}<br />
<br />
}</p>
<p class="cnt">MultipartTestServlet3.java</p>
<p class="cnt">package com.bug.servlet;</p>
<p class="cnt">import java.io.File;<br />
import java.io.IOException;</p>
<p class="cnt">import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServlet;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;</p>
<p class="cnt">import com.oreilly.servlet.multipart.FilePart;<br />
import com.oreilly.servlet.multipart.MultipartParser;<br />
import com.oreilly.servlet.multipart.ParamPart;<br />
import com.oreilly.servlet.multipart.Part;</p>
<p class="cnt">public class MultipartTestServlet3 extends HttpServlet {</p>
<p class="cnt">public MultipartTestServlet3() {<br />
&nbsp;&nbsp; super();<br />
}</p>
<p class="cnt">public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp; throws ServletException, IOException {</p>
<p class="cnt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MultipartParser mp = new MultipartParser(request, 2*1024*1024, false, false, "gbk");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Part part;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((part = mp.readNextPart()) != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = part.getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (part.isParam()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ParamPart paramPart = (ParamPart) part;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String value = paramPart.getStringValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("param: name=" + name + "; value=" + value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (part.isFile()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // it's a file part<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FilePart filePart = (FilePart) part;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName = filePart.getFileName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fileName != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long size = filePart.writeTo(new File("c:/tmp/"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("file: name=" + name + "; fileName=" + fileName +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ", filePath=" + filePart.getFilePath() + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ", contentType=" + filePart.getContentType() + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ", size=" + size);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("file: name=" + name + "; EMPTY");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p class="cnt">}</p>
<p class="cnt">web.xml中加入</p>
<p class="cnt">&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.bug.servlet.MultipartTestServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp; &lt;/servlet&gt;<br />
&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet2&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.bug.servlet.MultipartTestServlet2&lt;/servlet-class&gt;<br />
&nbsp;&nbsp; &lt;/servlet&gt;<br />
&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet3&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.bug.servlet.MultipartTestServlet3&lt;/servlet-class&gt;<br />
&nbsp;&nbsp; &lt;/servlet&gt;<br />
&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/MultipartTestServlet&lt;/url-pattern&gt;<br />
&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br />
&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet2&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/MultipartTestServlet2&lt;/url-pattern&gt;<br />
&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br />
&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet3&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/MultipartTestServlet3&lt;/url-pattern&gt;<br />
&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br />
<br />
我用过第一个例子的:<br />
<br />
&lt;!--注意:<br />
<br />
<span style="color: red">1.当利用ServletUpload时&lt;input type="radio" checked="checked"&gt;的元素会被认为是文件元素&lt;input type="file"&gt;&nbsp; <br />
从而会被解析出几个空File出来<br />
<br />
2.当使用在struts的action时,action的name不要设置,否则解析不出文件控件存在.因为actionform之前被解析掉了.<br />
</span>--&gt;<br />
<br />
</p>
<p class="cnt">问题1、中文问题：<br />
三种凡是都可以通过自己的方法来设置encoding为gbk开处理和解决中文问题，包括初始化的时候传入gbk作为参数，或是是初始化后通过setEncoding的方式来实现。<br />
另外ServletFileUpload方式也可以通过request.setCharacterEncoding("gbk");的方式来实现，而其它两种方式不支持这种方式。</p>
<p class="cnt"><br />
问题2、文件大小限制<br />
ServletFileUpload方式可以设置文件大小限制，也可以不用设置，例子中的upload.setSizeMax(2000000)就可以注释掉。如果设置upload.setSizeMax(-1)，表明不限制上传的大小。文档中没有指明默认的限制的多少，我在不设置的情况下上传了一个9M的东西，可以上传，估计默认是不限制大小的。<br />
而MultipartRequest方式和MultipartParser方式是必须设置文件的上传文件的大小限制的，如果不设置，默认是1M的大小限制。</p>
<p class="cnt"><br />
问题3、文件上传发生错误<br />
如果文件上传过程中发生任何错误，或者是文件的大小超出了范围，系统都将抛出错误。<br />
ServletFileUpload方式在upload.parseRequest(request)时抛出错误<br />
MultipartRequest方式在new MultipartRequest(。。。)时抛出错误<br />
MultipartParser方式在new MultipartParser(。。。)时抛出错误</p>
<p class="cnt"><br />
问题4、上传同名文件时，他们保存到临时目录是的冲突问题<br />
ServletFileUpload方式，不会有冲突，系统会把上传得文件按照一定的规则重新命名，保证不会冲突<br />
MultipartParser方式，会产生冲突，系统会把文件按照上传时的文件名，保存到临时目录下，如果两个用会同时上传文件名相同的文件，那么就可能会产生冲突，一方把另一方的临时文件给替换了。<br />
MultipartRequest方式，在初始化时如果提供了一个名称转换策略，就不会有冲突，如果不提桶，就会有冲突。在上面的例子中我们提供了一个new DefaultFileRenamePolicy()保证了文件名不会有冲突发生。</p>
<p class="cnt"><br />
问题5：表单中有两个同名的文件上传选择框，就像我们例子中的myfile一样，每个表单中有两个name=&#8220;myfile&#8221;的上传框<br />
ServletFileUpload方式，可以处理，可以分别得到他们各自的文件，<br />
MultipartRequest方式，不可以处理，会发生冲突，会有一个上传框的文件覆盖了另外一个。<br />
MultipartParser方式，可以处理，可以分别得到他们各自的文件，</p>
<p class="cnt"><br />
备注：<br />
代码比较乱，主要是为了说明他们间的区别。他们的详细地使用说明还是要参考他的javadoc和domo。</p>
<p class="cnt">参考：<br />
1、<a href="http://www.servlets.com/cos/#classes"><u><font color="#0000ff">http://www.servlets.com/cos/#classes</font></u></a><br />
2、<a href="http://jakarta.apache.org/commons/fileupload/apidocs/index.html"><u><font color="#0000ff">http://jakarta.apache.org/commons/fileupload/apidocs/index.html</font></u></a><br />
3、<a href="http://jakarta.apache.org/commons/fileupload/using.html"><u><font color="#0000ff">http://jakarta.apache.org/commons/fileupload/using.html</font></u></a><br />
4、<a href="http://www.onjava.com/pub/a/onjava/2003/06/25/commons.html?page=3"><font color="#0000ff"><u>http://www.onjava.com/pub/a/onjava/2003/06/25/commons.html?page=3</u></font></a></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/133866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-08-01 21:08 <a href="http://www.blogjava.net/WshmAndLily/articles/133866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax struts 动态多文件上传</title><link>http://www.blogjava.net/WshmAndLily/articles/133251.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Mon, 30 Jul 2007 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/133251.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/133251.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/133251.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/133251.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/133251.html</trackback:ping><description><![CDATA[<p><span style="COLOR: red"><strong><em>index.jsp:</em></strong></span><br><br>&lt;%@ page language="java" pageEncoding="gbk"%&gt;</p>
<p>&lt;%@ taglib uri="<a href="http://struts.apache.org/tags-bean">http://struts.apache.org/tags-bean</a>" prefix="bean" %&gt;<br>&lt;%@ taglib uri="<a href="http://struts.apache.org/tags-html">http://struts.apache.org/tags-html</a>" prefix="html" %&gt;<br>&lt;%@ taglib uri="<a href="http://struts.apache.org/tags-logic">http://struts.apache.org/tags-logic</a>" prefix="logic" %&gt;<br>&lt;%@ taglib uri="<a href="http://struts.apache.org/tags-tiles">http://struts.apache.org/tags-tiles</a>" prefix="tiles" %&gt;</p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br>&lt;html:html&gt;<br>&lt;head&gt;<br>&lt;title&gt;<br>multiUploadDemo<br>&lt;/title&gt;<br>&lt;/head&gt;<br>&lt;script language="javascript"&gt;<br>&nbsp;&nbsp; var num = 0;<br>&nbsp; <br>&nbsp;function upload(){<br>&nbsp;&nbsp;document.getElementById("status").innerHTML = "文件上传中...";<br>&nbsp;&nbsp;&nbsp;&nbsp; multiUploadForm.submit();<br>&nbsp;&nbsp; }</p>
<p>function additem(id)<br>{<br>&nbsp;var row,cell,str;<br>&nbsp;row = eval("document.all["+'"'+id+'"'+"]").insertRow();<br>&nbsp;if(row != null )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell = row.insertCell();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str="&lt;input type="+'"'+"file"+'"'+" name=uploadFile["+ num +"].file&gt;&lt;input type="+'"'+"button"+'"'+" value="+'"'+"删除"+'"'+" onclick='deleteitem(this,"+'"'+"tb"+'"'+");'&gt;"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell.innerHTML=str;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;num++;<br>}<br>function deleteitem(obj,id)<br>{<br>&nbsp;var rowNum,curRow;<br>&nbsp;curRow = obj.parentNode.parentNode;<br>&nbsp;rowNum = eval("document.all."+id).rows.length - 1;<br>&nbsp;eval("document.all["+'"'+id+'"'+"]").deleteRow(curRow.rowIndex);<br>}<br><span style="COLOR: red">function callback(msg)<br>{<br>&nbsp;document.getElementById("status").innerHTML = "文件上传完成...&lt;br&gt;" + msg;<br>}<br></span>&lt;/script&gt;<br>&lt;body bgcolor="#ffffff"&gt;<br>&lt;div id="status"&gt;&lt;/div&gt;<br>&lt;html:form method="post" action="/multiUpload.do" enctype="multipart/form-data" target="hidden_frame"&gt;</p>
<p>&lt;table id="tb"&gt;<br>&lt;/table&gt;</p>
<p>&lt;/html:form&gt;<br><span style="COLOR: red">&lt;iframe name='hidden_frame' id="hidden_frame" style="display:none"&gt;&lt;/iframe&gt;<br></span>&lt;input type="button" name="btnAddFile" value="Add File" onclick="additem('tb')"/&gt;<br>&lt;input type="button" name="btnUpload" value="upload" onclick="upload()"/&gt;<br>&lt;/body&gt;<br>&lt;/html:html&gt;</p>
<p><strong><em><span style="COLOR: red">Struts config.xml:</span><br></em></strong><br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "<a href="http://struts.apache.org/dtds/struts-config_1_2.dtd">http://struts.apache.org/dtds/struts-config_1_2.dtd</a>"&gt;</p>
<p>&lt;struts-config&gt;<br>&nbsp; &lt;data-sources /&gt;<br>&nbsp; &lt;form-beans &gt;<br>&nbsp;&nbsp;&nbsp; &lt;form-bean name="multiUploadForm" type="com.yourcompany.struts.MultiUploadForm" /&gt;</p>
<p>&nbsp; &lt;/form-beans&gt;</p>
<p>&nbsp; &lt;global-exceptions /&gt;<br>&nbsp; &lt;global-forwards /&gt;<br>&nbsp; &lt;action-mappings &gt;<br>&nbsp;&nbsp;&nbsp; &lt;action<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attribute="multiUploadForm"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="multiUploadForm"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path="/multiUpload"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope="request"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="com.yourcompany.struts.MultiUploadAction"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validate="false" /&gt;</p>
<p>&nbsp; &lt;/action-mappings&gt;</p>
<p>&nbsp; &lt;message-resources parameter="com.yourcompany.struts.ApplicationResources" /&gt;<br>&lt;/struts-config&gt;</p>
<p><span style="COLOR: red"><strong><em>Form bean:&nbsp; MultiUploadForm.java</em></strong></span><br><br><br>package com.yourcompany.struts;</p>
<p>import java.util.ArrayList;<br>import java.util.List;</p>
<p>import org.apache.struts.action.ActionForm;</p>
<p>public class MultiUploadForm extends ActionForm {<br>&nbsp;private&nbsp; List&nbsp; myFiles;&nbsp; <br>&nbsp;&nbsp;&nbsp; public&nbsp; MultiUploadForm(){&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myFiles&nbsp; =&nbsp; new&nbsp; ArrayList();&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //为了能够在页面初始显示一个file&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myFiles.add(new&nbsp; UploadFile());&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp; <br>&nbsp;&nbsp;&nbsp; public&nbsp; List&nbsp; getMyFiles()&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; myFiles;&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>//注意这个方法的定义&nbsp; </p>
<p>&nbsp; public&nbsp; UploadFile&nbsp; getUploadFile(int&nbsp; index){&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp; size&nbsp; =&nbsp; myFiles.size();&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(index&gt;size-1){&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myFiles.add(new&nbsp; UploadFile());&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; (UploadFile)myFiles.get(index);&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp; <br>&nbsp;&nbsp;&nbsp; public&nbsp; void&nbsp; setMyFiles(List&nbsp; myFiles)&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.myFiles&nbsp; =&nbsp; myFiles;&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp; </p>
<p>}<br><br><br><span style="COLOR: red"><strong><em>ActionBean :MultiUploadAction.java<br></em></strong></span><br>package com.yourcompany.struts;</p>
<p>import java.io.IOException;<br>import java.io.PrintWriter;<br>import java.util.List;</p>
<p>import javax.servlet.http.HttpServletRequest;<br>import javax.servlet.http.HttpServletResponse;</p>
<p>import org.apache.struts.action.Action;<br>import org.apache.struts.action.ActionForm;<br>import org.apache.struts.action.ActionForward;<br>import org.apache.struts.action.ActionMapping;<br>import org.apache.struts.upload.FormFile;</p>
<p>public class MultiUploadAction extends Action {<br>&nbsp;public ActionForward execute(ActionMapping mapping, ActionForm form,<br>&nbsp;&nbsp;&nbsp;HttpServletRequest request, HttpServletResponse response) {<br>&nbsp;&nbsp;MultiUploadForm multiUploadForm = (MultiUploadForm) form;<br>&nbsp;&nbsp;List myFiles = multiUploadForm.getMyFiles();<br>&nbsp;&nbsp;String fileStr = "";<br>&nbsp;&nbsp;for (int i = 0; i &lt; myFiles.size(); i++) {<br>&nbsp;&nbsp;&nbsp;UploadFile uploadFile = (UploadFile) myFiles.get(i);<br>&nbsp;&nbsp;&nbsp;FormFile file = uploadFile.getFile();</p>
<p>&nbsp;&nbsp;&nbsp;if (file == null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("file&nbsp; is&nbsp; null");<br>&nbsp;&nbsp;&nbsp;} else {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;// 能运行到这里，就可以使用单个文件上传的方法进行上传了。循环而已<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("filename:::" + file.getFileName());<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("file&nbsp; size:::" + file.getFileSize());<br>&nbsp;&nbsp;&nbsp;&nbsp;fileStr += "filename:::" + file.getFileName() + "file&nbsp; size:::" + file.getFileSize() ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;//返回文本<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;response.setHeader("ContentType", "text/html;charset=gbk");<br>&nbsp;&nbsp;&nbsp;PrintWriter out = response.getWriter();<br>&nbsp;&nbsp;&nbsp;out.write("&lt;script&gt;parent.callback('upload file success" + fileStr + "')&lt;/script&gt;");<br>&nbsp;&nbsp;}catch(IOException e)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;return null;<br>&nbsp;}</p>
<p>}<br><br><br><span style="COLOR: red"><strong><em>Bean: UploadFile.java<br></em></strong></span><br>package com.yourcompany.struts;</p>
<p>import java.io.Serializable;</p>
<p>import org.apache.struts.upload.FormFile;</p>
<p>public class UploadFile implements Serializable {<br>&nbsp; private&nbsp; FormFile&nbsp; file;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp; FormFile&nbsp; getFile()&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("run&nbsp; in&nbsp; uploadFile.getFile()");&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; file;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp; void&nbsp; setFile(FormFile&nbsp; file)&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.file&nbsp; =&nbsp; file;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>}<br><br></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/133251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-07-30 10:01 <a href="http://www.blogjava.net/WshmAndLily/articles/133251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax struts url stream</title><link>http://www.blogjava.net/WshmAndLily/articles/128059.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Wed, 04 Jul 2007 03:54:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/128059.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/128059.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/128059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/128059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/128059.html</trackback:ping><description><![CDATA[<p>public class Example7Action extends Action {</p>
<p><br>&nbsp; public ActionForward execute(ActionMapping mapping, ActionForm inForm, HttpServletRequest request, HttpServletResponse response) throws Exception {</p>
<p>&nbsp;&nbsp;&nbsp; String feedURL = (String)request.getParameter("feedURL");</p>
<p>&nbsp;&nbsp;&nbsp; if (feedURL == null || feedURL.equalsIgnoreCase("")) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null; // Trivial error handling... if no URL sent in, essentially do nothing<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; feedURL = new URLCodec().decode(feedURL);</p>
<p>&nbsp;&nbsp;&nbsp; // Go get the feed<br>&nbsp;&nbsp;&nbsp; StringBuffer xml = new StringBuffer(4096);<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u&nbsp;&nbsp; = new URL(feedURL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in&nbsp; = u.openStream();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStreamReader isr = new InputStreamReader(in);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader&nbsp;&nbsp;&nbsp; br&nbsp; = new BufferedReader(isr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String theLine;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((theLine = br.readLine()) != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xml.append(theLine);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Example7Action Exception: " + e);<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; // Write the XML to response<br>&nbsp;&nbsp;&nbsp; response.setContentType("text/xml");<br>&nbsp;&nbsp;&nbsp; PrintWriter out = response.getWriter();<br>&nbsp;&nbsp;&nbsp; out.println(xml);<br>&nbsp;&nbsp;&nbsp; out.flush();</p>
<p>&nbsp;&nbsp;&nbsp; return null;</p>
<p>&nbsp; } // End execute()</p>
<p><br>}</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/128059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-07-04 11:54 <a href="http://www.blogjava.net/WshmAndLily/articles/128059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts实现动态（不定数量）多个文件上传[转载]</title><link>http://www.blogjava.net/WshmAndLily/articles/114083.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 27 Apr 2007 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/114083.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/114083.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/114083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/114083.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/114083.html</trackback:ping><description><![CDATA[<p>主要代码如下 &nbsp;<br>&nbsp;<br>Form部分： &nbsp;<br>&nbsp;<br>public &nbsp;class &nbsp;MultiUploadForm &nbsp;extends &nbsp;ActionForm &nbsp;{ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;private &nbsp;List &nbsp;myFiles; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;public &nbsp;MultiUploadForm(){ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;myFiles &nbsp;= &nbsp;new &nbsp;ArrayList(); &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//为了能够在页面初始显示一个file &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;myFiles.add(new &nbsp;UploadFile()); &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;public &nbsp;List &nbsp;getMyFiles() &nbsp;{ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return &nbsp;myFiles; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br>&nbsp;<br>&nbsp; &nbsp;//注意这个方法的定义 &nbsp;<br>&nbsp;<br>&nbsp; &nbsp; &nbsp;public &nbsp;UploadFile &nbsp;getUploadFile(int &nbsp;index){ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int &nbsp;size &nbsp;= &nbsp;myFiles.size(); &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(index&gt;size-1){ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;myFiles.add(new &nbsp;UploadFile()); &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return &nbsp;(UploadFile)myFiles.get(index); &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;public &nbsp;void &nbsp;setMyFiles(List &nbsp;myFiles) &nbsp;{ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.myFiles &nbsp;= &nbsp;myFiles; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br>} &nbsp;<br>&nbsp;<br>Dataset部分： &nbsp;<br>public &nbsp;class &nbsp;UploadFile &nbsp;implements &nbsp;Serializable &nbsp;{ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;private &nbsp;FormFile &nbsp;file; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;public &nbsp;FormFile &nbsp;getFile() &nbsp;{ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("run &nbsp;in &nbsp;uploadFile.getFile()"); &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return &nbsp;file; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;public &nbsp;void &nbsp;setFile(FormFile &nbsp;file) &nbsp;{ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.file &nbsp;= &nbsp;file; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br>} &nbsp;<br>Action部分： &nbsp;<br>public &nbsp;class &nbsp;MultiUploadAction &nbsp;extends &nbsp;Action &nbsp;{ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;public &nbsp;ActionForward &nbsp;execute(ActionMapping &nbsp;mapping, &nbsp;ActionForm &nbsp;form, &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HttpServletRequest &nbsp;request, &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HttpServletResponse &nbsp;response) &nbsp;{ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MultiUploadForm &nbsp;multiUploadForm &nbsp;= &nbsp;(MultiUploadForm) &nbsp;form; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;List &nbsp;myFiles &nbsp;= &nbsp;multiUploadForm.getMyFiles(); &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for(int &nbsp;i &nbsp;=0;i&lt;myFiles.size();i++){ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UploadFile &nbsp;uploadFile &nbsp;= &nbsp;(UploadFile)myFiles.get(i); &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FormFile &nbsp;file &nbsp;= &nbsp;uploadFile.getFile(); &nbsp;<br>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(file==null){ &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("file &nbsp;is &nbsp;null"); &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else{ &nbsp;<br>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//能运行到这里，就可以使用单个文件上传的方法进行上传了。循环而已 &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("filename:::" &nbsp;+ &nbsp;file.getFileName()); &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("file &nbsp;size:::" &nbsp;+ &nbsp;file.getFileSize()); &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return &nbsp;null; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br>} &nbsp;<br>&nbsp;<br>JSP部分： &nbsp;<br>&nbsp;<br>&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br>&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt;<br>&lt;%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %&gt;</p>
<p>&lt;html:html&gt;<br>&lt;head&gt;<br>&lt;title&gt;<br>multiUploadDemo<br>&lt;/title&gt;<br>&lt;/head&gt;<br>&lt;script language="javascript" type=""&gt;<br>&nbsp;&nbsp; var num = 0;<br>&nbsp; <br>&nbsp;function upload(){<br>&nbsp;&nbsp;&nbsp;&nbsp; multiUploadForm.submit();<br>&nbsp;&nbsp; }</p>
<p>function additem(id)<br>{<br>&nbsp;var row,cell,str;<br>&nbsp;row = eval("document.all["+'"'+id+'"'+"]").insertRow();<br>&nbsp;if(row != null )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell = row.insertCell();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str="&lt;input type="+'"'+"file"+'"'+" name=uploadFile["+ num +"].file&gt;&lt;input type="+'"'+"button"+'"'+" value="+'"'+"删除"+'"'+" onclick='deleteitem(this,"+'"'+"tb"+'"'+");'&gt;"<br>&nbsp; &nbsp;&nbsp;&nbsp; cell.innerHTML=str;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;num++;<br>}<br>function deleteitem(obj,id)<br>{<br>&nbsp;var rowNum,curRow;<br>&nbsp;curRow = obj.parentNode.parentNode;<br>&nbsp;rowNum = eval("document.all."+id).rows.length - 1;<br>&nbsp;eval("document.all["+'"'+id+'"'+"]").deleteRow(curRow.rowIndex);<br>}</p>
<p>&lt;/script&gt;<br>&lt;body bgcolor="#ffffff"&gt;<br>&lt;html:form method="post" action="/multiUploadAction.do" enctype="multipart/form-data"&gt;</p>
<p>&lt;table id="tb"&gt;<br>&lt;/table&gt;</p>
<p>&lt;/html:form&gt;<br>&lt;input type="button" name="btnAddFile" value="Add File" onclick="additem('tb')"/&gt;<br>&lt;input type="button" name="btnUpload" value="upload" onclick="upload()"/&gt;<br>&lt;/body&gt;<br>&lt;/html:html&gt;&nbsp;<br>&nbsp;struts-config.xml部分： &nbsp;<br>&nbsp;<br>&nbsp; &nbsp;&lt;form-beans&gt; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;&lt;form-bean &nbsp;name="multiUploadForm" &nbsp;type="MultiUploadForm" &nbsp;/&gt; &nbsp;<br>&nbsp; &nbsp;&lt;/form-beans&gt; &nbsp;<br>&nbsp;<br>&lt;action &nbsp;name="multiUploadForm" &nbsp;path="/multiUploadAction" &nbsp;type="MultiUploadAction" &nbsp;/&gt; &nbsp;<br>&nbsp;<br>以上只是对动态多文件上传部分进行了描述，只是一个Demo。大家可以根据自己的需求变通的调整一下。&nbsp;&nbsp;<br></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/114083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-04-27 14:52 <a href="http://www.blogjava.net/WshmAndLily/articles/114083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>logic:equal,logic:present用法</title><link>http://www.blogjava.net/WshmAndLily/articles/96727.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 30 Jan 2007 06:23:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/96727.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/96727.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/96727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/96727.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/96727.html</trackback:ping><description><![CDATA[1.<br />&lt;logic:equal name="DeliverProveForm" property="userAction" value="create"&gt;<br />如果DeliverProveForm里的属性userAction的值等于create就执行这儿。<br />&lt;/logic:equal&gt;<br /><br />2.<br />&lt;logic:present name="tipmsg"&gt;<br />如果在你的action中设置了tipmsg就执行到这儿。如：request.setAttribute("tipmsg","提示信息")或session.setAttribute("tipmsg","提示信息")<br />&lt;bean:write name="tipmsg"/&gt;<br />&lt;/logic:present&gt; <img src ="http://www.blogjava.net/WshmAndLily/aggbug/96727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-01-30 14:23 <a href="http://www.blogjava.net/WshmAndLily/articles/96727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StrutsFileDownload-----DownloadAction</title><link>http://www.blogjava.net/WshmAndLily/articles/91528.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Wed, 03 Jan 2007 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/91528.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/91528.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/91528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/91528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/91528.html</trackback:ping><description><![CDATA[
		<h1 id="title">
				<a title="Click to do a full-text search for this title" href="http://wiki.apache.org/struts/StrutsFileDownload?action=fullsearch&amp;value=linkto%3A%22StrutsFileDownload%22&amp;context=180">StrutsFileDownload</a>
		</h1>
		<div lang="en" id="content" dir="ltr">
				<a id="top">
				</a>
				<p>A new <a class="nonexistent" href="http://wiki.apache.org/struts/DownloadAction">DownloadAction</a> was added in Struts 1.2.6 (see the <a class="external" href="http://struts.apache.org/struts-extras/apidocs/org/apache/struts/actions/DownloadAction.html" rel="nofollow"><img height="11" alt="[WWW]" src="http://wiki.apache.org/wiki/modern/img/moin-www.png" width="11" /> JavaDoc</a>). This page is to show how to use it and has the following structure: </p>
				<ol>
						<li>
								<a href="http://wiki.apache.org/struts/StrutsFileDownload#head-5f381aad527ae37711f4780b03f1b2a68f72c2bc">Implementing a DownloadAction</a>
								<ol>
										<li>
												<a href="http://wiki.apache.org/struts/StrutsFileDownload#head-f866c7d2ee68e091eddeb53665d52b1eb3e210c0">Implement the getStreamInfo() Method</a>
										</li>
										<li>
												<a href="http://wiki.apache.org/struts/StrutsFileDownload#head-86b805db50666ff88c9ce06c40c450bb3d23f142">Implement the getBufferSize() Method</a>
										</li>
								</ol>
						</li>
						<li>
								<a href="http://wiki.apache.org/struts/StrutsFileDownload#head-84cca5ec9cad414da5e32c8e882f408815d4bed3">Examples</a>
								<ol>
										<li>
												<a href="http://wiki.apache.org/struts/StrutsFileDownload#head-687d10c9b9b09757507c567c704df75c55f1821f">FileStreamInfo Example</a>
										</li>
										<li>
												<a href="http://wiki.apache.org/struts/StrutsFileDownload#head-5fc42cd97b45ca0869337e623c2840a599fdcb13">ResourceStreamInfo Example</a>
										</li>
										<li>
												<a href="http://wiki.apache.org/struts/StrutsFileDownload#head-acd0b07d921d559b510889500be220a9b969674d">Byte Array Example</a>
										</li>
								</ol>
						</li>
						<li>
								<a href="http://wiki.apache.org/struts/StrutsFileDownload#head-efeb5921db1179a81493341a56564181202a7235">Using the DownloadAction in your Web Pages</a>
						</li>
						<li>
								<a href="http://wiki.apache.org/struts/StrutsFileDownload#head-54368bb2778429bd6d32b4ea42b2a15ca111f19a">Content Disposition</a>
								<ol>
										<li>
												<a href="http://wiki.apache.org/struts/StrutsFileDownload#head-188719b69a6e7f2c42d6cafef3ffab61e6129539">Setting the Content Disposition</a>
										</li>
										<li>
												<a href="http://wiki.apache.org/struts/StrutsFileDownload#head-81b31f93158feae32a7a48ba5c440d1e0b4a0e1c">Content Disposition Values</a>
										</li>
								</ol>
						</li>
				</ol>
				<p>
				</p>
				<p>
						<img height="15" alt="(!)" src="http://wiki.apache.org/wiki/modern/img/idea.png" width="15" /> FrankZ: Here is the sample webapp... <a href="http://wiki.apache.org/struts-data/attachments/StrutsFileDownload/attachments/downloadapp.zip">downloadapp.zip</a> Please note that this is my first ever attempt at editing a Wiki entry, so if I screwed anything up, I apologize in advance! Lastly, I skimmed through the content of this entry and didn't see anything blatantly wrong. I will try and proof it more thoroughly as time allows, but for now, in addition to the sample app, it should get anyone going in the right direction. </p>
				<p>
						<img height="15" alt="&lt;!&gt;" src="http://wiki.apache.org/wiki/modern/img/attention.png" width="15" /> niallp: Since I haven't actually used this class myself, I'm hoping that Martin, Frank or anyone else involved in the discussion/creation of this would take a look here to see if its OK. </p>
				<p>
						<img height="15" alt="(!)" src="http://wiki.apache.org/wiki/modern/img/idea.png" width="15" /> Details from this thread: <a class="external" href="http://www.mail-archive.com/dev@struts.apache.org/msg04600.html" rel="nofollow"><img height="11" alt="[WWW]" src="http://wiki.apache.org/wiki/modern/img/moin-www.png" width="11" /> Mail Archive</a> - Note that the link to the sample app at omnytex.com referenced in this thread is no longer valid. The sample app is attached to this Wiki page only, so download it from here <a href="http://wiki.apache.org/struts-data/attachments/StrutsFileDownload/attachments/downloadapp.zip">downloadapp.zip</a></p>
				<h3 id="head-5f381aad527ae37711f4780b03f1b2a68f72c2bc">Implementing a DownloadAction</h3>
				<p>You need to extend org.apache.struts.actions.<a class="nonexistent" href="http://wiki.apache.org/struts/DownloadAction">DownloadAction</a> and implement the getStreamInfo() method. Optionally you can also override the getBufferSize() method if you require a different buffer size from the default. </p>
				<h4 id="head-f866c7d2ee68e091eddeb53665d52b1eb3e210c0">Implement the getStreamInfo() Method</h4>
				<p>The getStreamInfo() method returns a <a class="nonexistent" href="http://wiki.apache.org/struts/StreamInfo">StreamInfo</a> object - which is an inner interface of the <a class="nonexistent" href="http://wiki.apache.org/struts/DownloadAction">DownloadAction</a>. The <a class="nonexistent" href="http://wiki.apache.org/struts/DownloadAction">DownloadAction</a> provides two concrete implementations (static inner classes) of the <a class="nonexistent" href="http://wiki.apache.org/struts/StreamInfo">StreamInfo</a> interface: </p>
				<ul>
						<li>
								<p>
										<a class="nonexistent" href="http://wiki.apache.org/struts/FileStreamInfo">FileStreamInfo</a> - Simplifies downloading of a file from disk - need to pass a java.io.File object to the constructor along with the content type. </p>
						</li>
						<li>
								<p>
										<a class="nonexistent" href="http://wiki.apache.org/struts/ResourceStreamInfo">ResourceStreamInfo</a> - simplifies downloading of a web application resource - need to pass the <a class="nonexistent" href="http://wiki.apache.org/struts/ServletContext">ServletContext</a>, path and content type to its constructor. </p>
						</li>
				</ul>
				<p>In the examples below, I have also provided a Byte array implementation of the <a class="nonexistent" href="http://wiki.apache.org/struts/StreamInfo">StreamInfo</a> interface. </p>
				<h4 id="head-86b805db50666ff88c9ce06c40c450bb3d23f142">Implement the getBufferSize() Method</h4>
				<p>The <a class="nonexistent" href="http://wiki.apache.org/struts/DownloadAction">DownloadAction</a>, by default, returns a buffer size of 4096. Optionally, this may be overriden to customize the size of the buffer used to transfer the file. </p>
				<h3 id="head-84cca5ec9cad414da5e32c8e882f408815d4bed3">Examples</h3>
				<p>Below are three examples: </p>
				<ul>
						<li>
								<p>using a File </p>
						</li>
						<li>
								<p>using a web application resource </p>
						</li>
						<li>
								<p>using a byte array. </p>
						</li>
				</ul>
				<h4 id="head-687d10c9b9b09757507c567c704df75c55f1821f">FileStreamInfo Example</h4>
				<p>Example of using the <a class="nonexistent" href="http://wiki.apache.org/struts/DownloadAction">DownloadAction</a> with a file. This example picks up the file name from the <em>parameter</em> attribute in the strust-config.xml action mapping. </p>
				<pre>import java.io.File;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DownloadAction;

public class ExampleFileDownload extends DownloadAction{

    protected StreamInfo getStreamInfo(ActionMapping mapping, 
                                       ActionForm form,
                                       HttpServletRequest request, 
                                       HttpServletResponse response)
            throws Exception {
        
        // Download a "pdf" file - gets the file name from the
        // Action Mapping's parameter
        String contentType = "application/pdf";
        File file          = new File(mapping.getParameter());

        return new FileStreamInfo(contentType, file);
        
    }

}

</pre>
				<h4 id="head-5fc42cd97b45ca0869337e623c2840a599fdcb13">ResourceStreamInfo Example</h4>
				<p>Example of using the <a class="nonexistent" href="http://wiki.apache.org/struts/DownloadAction">DownloadAction</a> with a web application resource. This example picks up the web application resource path from the <em>parameter</em> attribute in the strust-config.xml action mapping. </p>
				<pre>import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DownloadAction;

public class ExampleResourceDownload extends DownloadAction {

    protected StreamInfo getStreamInfo(ActionMapping mapping, 
                                       ActionForm form,
                                       HttpServletRequest request, 
                                       HttpServletResponse response)
            throws Exception {
        
        // Download a "jpeg" file - gets the file name from the
        // Action Mapping's parameter
        String contentType         = "image/jpeg";
        String path                = mapping.getParameter();
        ServletContext application = servlet.getServletContext();
        
        
        return new ResourceStreamInfo(contentType, application, path);
        
    }

}


</pre>
				<h4 id="head-acd0b07d921d559b510889500be220a9b969674d">Byte Array Example</h4>
				<p>Example of using the <a class="nonexistent" href="http://wiki.apache.org/struts/DownloadAction">DownloadAction</a> with a Byte Array. </p>
				<p>This example creates a <a class="nonexistent" href="http://wiki.apache.org/struts/ByteArrayStreamInfo">ByteArrayStreamInfo</a> inner class which implements the <a class="nonexistent" href="http://wiki.apache.org/struts/StreamInfo">StreamInfo</a> interface. </p>
				<p>(niallp: IMO we should include this <a class="nonexistent" href="http://wiki.apache.org/struts/ByteArrayStreamInfo">ByteArrayStreamInfo</a> in the implementation) </p>
				<pre>import java.io.IOException;
import java.io.InputStream;
import java.io.ByteArrayInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DownloadAction;

public class ExampleByteArrayDownload extends DownloadAction {

    protected StreamInfo getStreamInfo(ActionMapping mapping, 
                                       ActionForm form,
                                       HttpServletRequest request, 
                                       HttpServletResponse response)
            throws Exception {
        
        // Download a "pdf" file
        String contentType = "application/pdf";
        byte[] myPdfBytes  = null;              // Get the bytes from somewhere

        return new ByteArrayStreamInfo(contentType, myPdfBytes);
        
    }

    protected class ByteArrayStreamInfo implements StreamInfo {
        
        protected String contentType;
        protected byte[] bytes;
        
        public ByteArrayStreamInfo(String contentType, byte[] bytes) {
            this.contentType = contentType;
            this.bytes = bytes;
        }
        
        public String getContentType() {
            return contentType;
        }

        public InputStream getInputStream() throws IOException {
            return new ByteArrayInputStream(bytes);
        }
    }
}

</pre>
				<h3 id="head-efeb5921db1179a81493341a56564181202a7235">Using the DownloadAction in your Web Pages</h3>
				<p>The last bit of the puzzle is how do I use this action? </p>
				<p>You need to do two things: </p>
				<ul>
						<li>
								<p>As with any Struts action, you need to configure it in the struts-config.xml </p>
						</li>
						<li>
								<p>Use it on your web page like any other link to a file </p>
						</li>
				</ul>
				<p>So for example you might have something like the following in your struts-config.xml: </p>
				<pre>    &lt;action path="/downloadMyPdfFile" type="myPackage.ExampleFileDownload" parameter="/foo/bar.pdf"&gt;
    &lt;action path="/downloadMyImage"   type="myPackage.ExampleResourceDownload" parameter="/images/myImage.jpeg"&gt;

</pre>
				<p>The on your jsp page, you might use these in the following way: </p>
				<pre>    &lt;html:img action="downloadMyImage" alt="My Image" height="400" width="400"/&gt;

    &lt;html:link action="downloadMyPdfFile"&gt;Click Here to See the PDF&lt;/html:link&gt;

</pre>
				<p>Note you may need to set the nocache value to false in the controller section of your struts config file. Nocache set to true prevented me from being able to use Internet Explorer to download the file succesfully; Firefox and Safari worked fine. </p>
				<pre>    &lt;controller contentType="text/html;charset=UTF-8" locale="true" nocache="false" /&gt;
</pre>
				<h3 id="head-54368bb2778429bd6d32b4ea42b2a15ca111f19a">Content Disposition</h3>
				<h4 id="head-188719b69a6e7f2c42d6cafef3ffab61e6129539">Setting the Content Disposition</h4>
				<p>
						<a class="nonexistent" href="http://wiki.apache.org/struts/DownloadAction">DownloadAction</a> doesn't cater for setting the content dispositon header. The easiest way is set it in the getStreamInfo() method, for example... </p>
				<pre>public class ExampleFileDownload extends DownloadAction{


    protected StreamInfo getStreamInfo(ActionMapping mapping, 
                                       ActionForm form,
                                       HttpServletRequest request, 
                                       HttpServletResponse response)
            throws Exception {

        // File Name
        String fileName = mapping.getParameter();

        // Set the content disposition
        response.setHeader("Content-disposition", 
                           "attachment; filename=" + fileName);
        
        // Download a "pdf" file - gets the file name from the
        // Action Mapping's parameter
        String contentType = "application/pdf";
        File file          = new File(fileName);

        return new FileStreamInfo(contentType, file);
        
    }
}

</pre>
				<p>Probably would want to play with the file name, to remove any path info first. </p>
				<h4 id="head-81b31f93158feae32a7a48ba5c440d1e0b4a0e1c">Content Disposition Values</h4>
				<p>You can set the content disposition to either download the file or open up in the browser: </p>
				<ul>
						<li>
								<p>To open up in the browser: "inline; filename=myFile.pdf" </p>
						</li>
						<li>
								<p>To download: "attachment; filename=myFile.pdf" </p>
						</li>
				</ul>
				<p>Displaying images I always set the content disposition to the "inline" option. </p>
				<p>
						<strong>NOTE:</strong> I'm not expert at this, just got it working by trial and error. I had problems and I'm seem to remember I had to play with setting the response headers to get it to work properly. There may also be browser issues - my app only has to work with IE. Anyone who knows more about this, feel free to amend this page. </p>
				<p>
						<strong>FIX for IE:</strong> Content-Disposition Attachment Header Does Not Save File <a class="external" href="http://support.microsoft.com/kb/q279667/" rel="nofollow"><img height="11" alt="[WWW]" src="http://wiki.apache.org/wiki/modern/img/moin-www.png" width="11" /> link</a></p>
				<a id="bottom">
				</a>
		</div>
		<p class="info" lang="en" id="pageinfo" dir="ltr">last edited 2006-01-25 18:40:18 by <span title="wsmoak.vpia.asu.edu">WendySmoak</span></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/91528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-01-03 14:05 <a href="http://www.blogjava.net/WshmAndLily/articles/91528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts+MySQL实现图片的存储与显示</title><link>http://www.blogjava.net/WshmAndLily/articles/88347.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 17 Dec 2006 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/88347.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/88347.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/88347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/88347.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/88347.html</trackback:ping><description><![CDATA[
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">人事信息管理系统中，需要管理用户的个人身份照片。通常这种格式的照片只有几</span>
				<span lang="EN-US">K</span>
				<span style="FONT-FAMILY: 宋体">到几十</span>
				<span lang="EN-US">K</span>
				<span style="FONT-FAMILY: 宋体">大小，保存在数据库中易于进行管理和维护（如果放在文件夹下容易发生误操作而引起数据被修改或丢失）。</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 27.85pt">
				<span class="Alt2Char">
						<span style="FONT-FAMILY: 黑体">功能设计：</span>
				</span>
				<span style="FONT-FAMILY: 宋体">给用户提供一个上传的界面，并设定上传文件的尺寸上限。用户上传的照片先统一保存在一个临时文件夹中，之后可以用</span>
				<span lang="EN-US">&lt;img&gt;</span>
				<span style="FONT-FAMILY: 宋体">指向临时文件夹中的这个图片，让用户可以预览自己上传的照片。当所有的用户信息都收集完成后，将图片和其他信息一并提交，保存到数据库中。保存成功以后，删除临时文件夹中的图片。</span>
		</p>
		<p class="Alt2" style="TEXT-INDENT: 27.85pt">
				<span style="FONT-FAMILY: 黑体">实现步骤：</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">我使用的是从</span>
				<span lang="EN-US">struts</span>
				<span style="FONT-FAMILY: 宋体">主页上下载的</span>
				<span lang="EN-US">struts-<?XML:NAMESPACE PREFIX = ST1 /?><st1:chsdate isrocdate="False" islunardate="False" day="30" month="12" year="1899" w:st="on">1.2.8</st1:chsdate>-src</span>
				<span style="FONT-FAMILY: 宋体">，其中</span>
				<span lang="EN-US">web/examples/</span>
				<span style="FONT-FAMILY: 宋体">目录下有一个</span>
				<span lang="EN-US">upload</span>
				<span style="FONT-FAMILY: 宋体">的例子，稍微修改了一下就直接拿过来用了。这是一个</span>
				<span lang="EN-US">JSP</span>
				<span style="FONT-FAMILY: 宋体">页面、</span>
				<span lang="EN-US">ActionForm</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">Action</span>
				<span style="FONT-FAMILY: 宋体">的组合。下面分别列出各自的代码。</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span lang="EN-US">upload.jsp</span>
				<span style="FONT-FAMILY: 宋体">的部分源代码：</span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">&lt;html:form action="/UploadSubmit" enctype="multipart/form-data"&gt;<span>      </span></span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">
						<span>      </span>
				</span>
				<span style="BACKGROUND: white 0% 50%; FONT-FAMILY: 宋体; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">请选择需要上传的照片</span>
				<span lang="EN-US" style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">: </span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">
						<span>     </span>&lt;html:file property="theFile"/&gt;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">
						<span>     </span>&lt;html:submit value="</span>
				<span style="BACKGROUND: white 0% 50%; FONT-FAMILY: 宋体; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">上传</span>
				<span lang="EN-US" style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">"/&gt;<span>      </span></span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">&lt;/html:form&gt;</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">接下来需要在</span>
				<span lang="EN-US">ActionForm</span>
				<span style="FONT-FAMILY: 宋体">中声明这个属性，并设置</span>
				<span lang="EN-US">getter</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">setter</span>
				<span style="FONT-FAMILY: 宋体">方法，这部分源代码如下：</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">public class UploadForm extends ActionForm {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>    </span>protected FormFile theFile;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>    </span>public FormFile getTheFile() {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>return theFile;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>    </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>    </span>public void setTheFile(FormFile theFile) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>this.theFile = theFile;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>    </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">}</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">这个表单的</span>
				<span lang="EN-US">theFile</span>
				<span style="FONT-FAMILY: 宋体">属性不是</span>
				<span lang="EN-US">String</span>
				<span style="FONT-FAMILY: 宋体">或</span>
				<span lang="EN-US">boolean</span>
				<span style="FONT-FAMILY: 宋体">，而是</span>
				<span lang="EN-US">org.apache.struts.upload.FormFile</span>
				<span style="FONT-FAMILY: 宋体">。因为用户上传的是一个二进制文件，而</span>
				<span lang="EN-US">HTTP</span>
				<span style="FONT-FAMILY: 宋体">协议是以文本形式传输数据的，这就需要进行转换。打个比方，一辆汽车需要从甲地送到乙地，但是两地之间只有一条索道，汽车没法开，所以就想个办法在甲地把汽车先拆了，把零件送到乙地再重新组装成一辆汽车。</span>
				<span lang="EN-US">FormFile</span>
				<span style="FONT-FAMILY: 宋体">起的就是拆卸和组装的作用，只不过它把拆卸、传输和组装的过程都封装起来了，我们看到的是一辆汽车从甲地开进</span>
				<span lang="EN-US">FormFile</span>
				<span style="FONT-FAMILY: 宋体">，过一会它就从乙地开出来了</span>
				<span lang="EN-US" style="FONT-FAMILY: Wingdings">
						<span>J</span>
				</span>
				<span style="FONT-FAMILY: 宋体">我们要决定的只是把它停到什么地方，这就是</span>
				<span lang="EN-US">Action</span>
				<span style="FONT-FAMILY: 宋体">的活了。</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">按照功能设计，</span>
				<span lang="EN-US">Action</span>
				<span style="FONT-FAMILY: 宋体">要把这部车停到一个临时文件夹下面，这部分源代码如下：</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">public ActionForward execute(ActionMapping mapping,</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                                 </span>ActionForm form,</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                                 </span>HttpServletRequest request,</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                                 </span>HttpServletResponse response)</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>throws Exception {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>if (form instanceof UploadForm) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>UploadForm theForm = (UploadForm) form;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>      </span>
						<span>      </span>
						<span style="COLOR: green">//</span>
				</span>
				<span style="COLOR: green; FONT-FAMILY: 宋体">获取上传的数据文件</span>
				<span lang="EN-US" style="COLOR: green">
						<?XML:NAMESPACE PREFIX = O /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>FormFile file = theForm.getTheFile();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="COLOR: green">
						<span>            </span>//</span>
				<span style="COLOR: green; FONT-FAMILY: 宋体">获取文件名</span>
				<span lang="EN-US" style="COLOR: green">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>String filename= file.getFileName();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="COLOR: green">
						<span>            </span>//</span>
				<span style="COLOR: green; FONT-FAMILY: 宋体">设置图片文件临时存放的路径</span>
				<span lang="EN-US" style="COLOR: green">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>HttpSession session = request.getSession();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>String path = session.getServletContext().getRealPath("/") + "temp\\" + filename;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>try {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="COLOR: green">
						<span>                </span>//</span>
				<span style="COLOR: green; FONT-FAMILY: 宋体">读取文件中的数据，获取二进制的数据流</span>
				<span lang="EN-US" style="COLOR: green">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>InputStream stream = file.getInputStream();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="COLOR: green">
						<span>             </span>// </span>
				<span style="COLOR: green; FONT-FAMILY: 宋体">把数据写到指定路径</span>
				<span lang="EN-US" style="COLOR: green">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>OutputStream bos = new FileOutputStream(path);</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>int bytesRead = 0;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>byte[] buffer = new byte[8192];</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>while ((bytesRead = stream.read(buffer, 0, 8192)) != -1) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                 </span>bos.write(buffer, 0, bytesRead);</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>bos.close();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>logger.info("The file has been written to \""</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                     </span>
						<span>  </span>+ path + "\"");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="COLOR: green">
						<span>                </span>//</span>
				<span style="COLOR: green; FONT-FAMILY: 宋体">设计一个标记，说明用户已经上传过照片了。</span>
				<span lang="EN-US">
						<span>               </span>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>session.setAttribute("imageuploaded","true");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>session.setAttribute("filename",filename);</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="COLOR: green">
						<span>             </span>// close the stream<o:p></o:p></span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>stream.close();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>bos.flush();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>bos.close();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>}catch (FileNotFoundException fnfe) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                </span>return null;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>}catch (IOException ioe) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                </span>return null;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="COLOR: green">
						<span>            </span>//destroy the temporary file created<o:p></o:p></span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>file.destroy();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="COLOR: green">
						<span>            </span>//</span>
				<span style="COLOR: green; FONT-FAMILY: 宋体">转向下一个页面</span>
				<span lang="EN-US" style="COLOR: green">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>return mapping.findForward("next");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>      </span>
						<span>  </span>//this shouldn't happen in this example</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>return null;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>    </span>}</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">这样图片就被放在</span>
				<span lang="EN-US">temp</span>
				<span style="FONT-FAMILY: 宋体">的临时文件夹下，显示的时候，只需要先检查一下标记，看看用户是否上传了照片，如果已经上传，就用一个</span>
				<span lang="EN-US">&lt;img src=””&gt;</span>
				<span style="FONT-FAMILY: 宋体">引用这个图片。还有一个小地方需要修改，因为限定上传的是身份照片，需要限定一个尺寸上限，这个在</span>
				<span lang="EN-US">struts</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">upload</span>
				<span style="FONT-FAMILY: 宋体">里面有现成的例子。先在</span>
				<span lang="EN-US">struts-config.xml</span>
				<span style="FONT-FAMILY: 宋体">中配置这个</span>
				<span lang="EN-US">ActionForm</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">Action</span>
				<span style="FONT-FAMILY: 宋体">：</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">&lt;form-bean name="uploadForm"</span>
		</p>
		<p class="AltL" style="MARGIN-LEFT: 8.5pt; TEXT-INDENT: 80.1pt">
				<span lang="EN-US">
						<span> </span>type="org.apache.struts.webapp.upload.UploadForm"/&gt;</span>
		</p>
		<p class="AltL">
				<span style="FONT-FAMILY: 宋体">……</span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">&lt;action input="/pages/hr/error.jsp" name="uploadForm"<o:p></o:p></span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">
						<span> </span>
						<span>        </span>path="/UploadSubmit" scope="request" <o:p></o:p></span>
		</p>
		<p class="AltL" style="MARGIN-LEFT: 75.3pt; TEXT-INDENT: 0cm">
				<span lang="EN-US" style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">type="org.apache.struts.webapp.upload.UploadAction" validate="true"&gt;</span>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">
						<span>   </span>&lt;forward name="next" path="/pages/hr/input.jsp"/&gt;</span>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US" style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">&lt;/action&gt;</span>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span style="FONT-FAMILY: 宋体">……</span>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">&lt;controller maxFileSize="<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="2" unitname="m">2M</st1:chmetcnv>" inputForward="true" /&gt;<o:p></o:p></span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">在配置文件中已经看到</span>
				<span lang="EN-US">&lt;action&gt;</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">validate</span>
				<span style="FONT-FAMILY: 宋体">属性被设置成“</span>
				<span lang="EN-US">true</span>
				<span style="FONT-FAMILY: 宋体">”，这就是说表单提交之前先要对其内容进行验证，这里我们要验证的就是</span>
				<span lang="EN-US">theFile</span>
				<span style="FONT-FAMILY: 宋体">是否超出了</span>
				<span lang="EN-US">controller</span>
				<span style="FONT-FAMILY: 宋体">中设定的最大尺寸</span>
				<span lang="EN-US">”<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="2" unitname="m">2M</st1:chmetcnv>”</span>
				<span style="FONT-FAMILY: 宋体">。这个验证是通过</span>
				<span lang="EN-US">ActionForm</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">validate</span>
				<span style="FONT-FAMILY: 宋体">方法来实现的：</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">/**</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>* Check to make sure the client hasn't exceeded the maximum allowed upload size inside of this validate method.</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">**/</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>    </span>public ActionErrors validate(ActionMapping mapping,</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>HttpServletRequest request) {<span>            </span></span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>ActionErrors errors = null;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>//has the maximum length been exceeded?</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>Boolean maxLengthExceeded =</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>(Boolean) request.getAttribute(</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                </span>MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED);<span>                </span></span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>if ((maxLengthExceeded != null) &amp;&amp; (maxLengthExceeded.booleanValue())) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>errors = new ActionErrors();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>errors.add(</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                </span>ActionMessages.GLOBAL_MESSAGE ,</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                </span>new ActionMessage("maxLengthExceeded"));</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>            </span>errors.add(</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                </span>ActionMessages.GLOBAL_MESSAGE ,</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                </span>new ActionMessage("maxLengthExplanation"));</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>return errors;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>    </span>}</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">这里我估计有个</span>
				<span lang="EN-US">hook</span>
				<span style="FONT-FAMILY: 宋体">之类的东西先截获了表单（应该和</span>
				<span lang="EN-US">controller</span>
				<span style="FONT-FAMILY: 宋体">有关），对</span>
				<span lang="EN-US">theFile</span>
				<span style="FONT-FAMILY: 宋体">的尺寸进行校验，然后把结果保存在</span>
				<span lang="EN-US">request scope</span>
				<span style="FONT-FAMILY: 宋体">中。</span>
				<span lang="EN-US">Validate</span>
				<span style="FONT-FAMILY: 宋体">方法只要检查一下这个结果就可以了，如果尺寸超标，表单就不会被提交给</span>
				<span lang="EN-US">Action</span>
				<span style="FONT-FAMILY: 宋体">。</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">以上算是完成了第一步，从用户那里拿到照片，并保存在临时文件夹当中。接下来要做的就是把照片保存到</span>
				<span lang="EN-US">MySQL</span>
				<span style="FONT-FAMILY: 宋体">数据库中，这个字段我用的是</span>
				<span lang="EN-US">MEDIUMBLOB</span>
				<span style="FONT-FAMILY: 宋体">，因为</span>
				<span lang="EN-US">BLOB</span>
				<span style="FONT-FAMILY: 宋体">最大长度是</span>
				<span lang="EN-US">2<sup>16</sup>-1</span>
				<span style="FONT-FAMILY: 宋体">字节，大约</span>
				<span lang="EN-US">64K</span>
				<span style="FONT-FAMILY: 宋体">；</span>
				<span lang="EN-US">MEDIUMBLOB</span>
				<span style="FONT-FAMILY: 宋体">是</span>
				<span lang="EN-US">2<sup>24</sup>-1</span>
				<span style="FONT-FAMILY: 宋体">字节，约</span>
				<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="16" unitname="m">
						<span lang="EN-US">16M</span>
				</st1:chmetcnv>
				<span style="FONT-FAMILY: 宋体">，足够用了。保存图片的主要代码如下：</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">/**</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>
						</span>
						<span> </span>* </span>
				<span style="FONT-FAMILY: 宋体">将用户的照片保存在数据表中，添加成功后，删除临时文件夹中的图片。</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>
						</span>
						<span> </span>* @param id </span>
				<span style="FONT-FAMILY: 宋体">用户的身份号，作为图片的标识码</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>
						</span>
						<span> </span>* @param path </span>
				<span style="FONT-FAMILY: 宋体">图片存放的路径。一般存放在一个临时文件夹中。</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>
						</span>
						<span> </span>* @return</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>
						</span>
						<span> </span>*/</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>
						</span>public static void saveImage(int id, String path) throws SQLException{</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>String time = new java.util.Date().toString();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>Connection conn = null;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>PreparedStatement pstmt = null;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>boolean flag = false;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>// </span>
				<span style="FONT-FAMILY: 宋体">获取连接</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>try {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>conn = DbManager.getConnection();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>logger.info(time + ":saveImage() </span>
				<span style="FONT-FAMILY: 宋体">从</span>
				<span lang="EN-US">DbManager</span>
				<span style="FONT-FAMILY: 宋体">数据库连接池获取一个连接。</span>
				<span lang="EN-US">");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>} catch (SQLException e) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>// </span>
				<span style="FONT-FAMILY: 宋体">如果没有能够从</span>
				<span lang="EN-US">DbManager</span>
				<span style="FONT-FAMILY: 宋体">获取连接，此次查询操作失败</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>logger.error(time + ": saveImage()</span>
				<span style="FONT-FAMILY: 宋体">不能获取数据库连接，无法保存图片！</span>
				<span lang="EN-US">");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>throw new SQLException(":saveImage()</span>
				<span style="FONT-FAMILY: 宋体">不能获取数据库连接，无法保存图片！</span>
				<span lang="EN-US">");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>//</span>
				<span style="FONT-FAMILY: 宋体">执行查询</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>try {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>pstmt = conn.prepareStatement("UPDATE hr01 SET hr01_photo=? where hr01_id=?");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>FileInputStream in = new FileInputStream(path);</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>pstmt.setBinaryStream(1,in,in.available());</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>pstmt.setInt(2,id);<span>     </span><span>    </span></span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>pstmt.executeUpdate();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>pstmt.executeUpdate("COMMIT");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>logger.info("</span>
				<span style="FONT-FAMILY: 宋体">图片</span>
				<span lang="EN-US">" + path + " </span>
				<span style="FONT-FAMILY: 宋体">被添加到数据库中！</span>
				<span lang="EN-US">");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>flag = true;<span>            </span></span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>}catch(IOException e){</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>logger.error("</span>
				<span style="FONT-FAMILY: 宋体">图片</span>
				<span lang="EN-US">" + path + "</span>
				<span style="FONT-FAMILY: 宋体">文件读写错误！请检查文件路径是否正确</span>
				<span lang="EN-US">");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>throw new SQLException("</span>
				<span style="FONT-FAMILY: 宋体">无法保存图片！</span>
				<span lang="EN-US">");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>}catch (SQLException ex) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>logger.error(new java.util.Date() + "Error:Insert into table."</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                 </span>+ ex.getMessage());<span>         </span></span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>logger.error("</span>
				<span style="FONT-FAMILY: 宋体">图片</span>
				<span lang="EN-US">" + path +"</span>
				<span style="FONT-FAMILY: 宋体">没有被保存到数据库</span>
				<span lang="EN-US">.");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>throw new SQLException("</span>
				<span style="FONT-FAMILY: 宋体">图片</span>
				<span lang="EN-US">" + path +"</span>
				<span style="FONT-FAMILY: 宋体">没有被保存到数据库</span>
				<span lang="EN-US">.");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>} finally {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>try {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>pstmt.close();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>conn.close();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>logger.info("DbHrinfo saveImage() closed the connection created at " + time);</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>} catch (SQLException e) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>}<br />&gt;<span>     </span></span>
		</p>
		<p>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>//</span>
				<span style="FONT-FAMILY: 宋体">图片添加成功以后就删除临时文件夹中的图片数据</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>if(flag == true){</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>File file = new File(path);</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>if(file.exists()){</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>file.delete();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>
						</span>}</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">需要注意的是</span>
				<span lang="EN-US">pstmt.executeUpdate("COMMIT");</span>
				<span style="FONT-FAMILY: 宋体">这行代码，最初我并没有写这行，程序能顺利执行，日志中也显示“图片××被添加到数据库中”，但是到库里一查询，什么都没有。</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体">语句被提交，但是数据库里面没有即时的显示，估计是缓冲区的作用，它把我的</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体">语句缓存起来而不是立即提交给数据库。后来我在</span>
				<span lang="EN-US">textpad</span>
				<span style="FONT-FAMILY: 宋体">里面单独执行这段代码，发现不用“</span>
				<span lang="EN-US">COMMIT</span>
				<span style="FONT-FAMILY: 宋体">”</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体">语句就立即被提交了。这个地方还没有弄清楚，以后需要继续研究。</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">功能上做一点小改进，用户提交了照片以后，浏览了一下觉得不满意，只要还没有最终提交数据，当然允许他重新上传一个照片。我们只需要在</span>
				<span lang="EN-US">&lt;img src=””&gt;</span>
				<span style="FONT-FAMILY: 宋体">下面提供一个“重新提交”的链接就可以了。这个链接指向一个</span>
				<span lang="EN-US">AlterImageAction</span>
				<span style="FONT-FAMILY: 宋体">，它的功能就是清除</span>
				<span lang="EN-US">session</span>
				<span style="FONT-FAMILY: 宋体">中用户已经上传照片的标记，并把刚才保存到临时文件夹中的照片删掉，等待用户重新上传。这部分代码如下：</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">public ActionForward execute(ActionMapping mapping,</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>ActionForm form,HttpServletRequest request,</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>HttpServletResponse response) </span>
		</p>
		<p class="AltL" style="MARGIN-LEFT: 8.5pt; TEXT-INDENT: 93.6pt">
				<span lang="EN-US">throws IOException,ServletException{</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>HttpSession session = request.getSession();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>        </span>//1.</span>
				<span style="FONT-FAMILY: 宋体">从临时文件夹中删除图片</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>String filename = (String)session.getAttribute("filename");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>String path = session.getServletContext().getRealPath("/") </span>
		</p>
		<p class="AltL" style="MARGIN-LEFT: 8.5pt; TEXT-INDENT: 125.1pt">
				<span lang="EN-US">+ "temp\\" + filename;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>File file = new File(path);</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>if(file.exists()){</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>file.delete();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>logger.info("</span>
				<span style="FONT-FAMILY: 宋体">文件</span>
				<span lang="EN-US"> " + path + "</span>
				<span style="FONT-FAMILY: 宋体">已经被删除</span>
				<span lang="EN-US">");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>//2.</span>
				<span style="FONT-FAMILY: 宋体">从</span>
				<span lang="EN-US">session</span>
				<span style="FONT-FAMILY: 宋体">中清除上传图片的标记</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>session.removeAttribute("imageuploaded");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>session.removeAttribute("filename");<span>        </span></span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>return mapping.findForward("next");<span>     </span></span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>
						</span>}</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">提交和保存到此功德圆满。下次用户想要查询自己的信息的时候，因为临时文件夹中已经没有用户照片，需要从数据库中读取。用一个</span>
				<span lang="EN-US">ShowImageAction</span>
				<span style="FONT-FAMILY: 宋体">来实现这个功能：</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">public ActionForward execute(ActionMapping mapping,</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>ActionForm form, HttpServletRequest request,</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>HttpServletResponse response) </span>
		</p>
		<p class="AltL" style="MARGIN-LEFT: 8.5pt; TEXT-INDENT: 84.6pt">
				<span lang="EN-US">throws IOException,ServletException{</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>//</span>
				<span style="FONT-FAMILY: 宋体">需要的情况下设置数据源</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>if (!DbManager.hasSetDataSource()) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>javax.sql.DataSource dataSource;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>try {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>dataSource = getDataSource(request);</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>DbManager.setDataSource(dataSource);</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>} catch (Exception e) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>logger.error(e.getMessage());</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>mapping.findForward("error");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>String photo_no = request.getParameter("photo_no");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>Connection conn = null;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>Statement stmt = null;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>// </span>
				<span style="FONT-FAMILY: 宋体">获取连接</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>try {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>conn = DbManager.getConnection();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>logger.info("showimage.jsp </span>
				<span style="FONT-FAMILY: 宋体">从</span>
				<span lang="EN-US">DbManager</span>
				<span style="FONT-FAMILY: 宋体">数据库连接池获取一个连接。</span>
				<span lang="EN-US">");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>} catch (SQLException e) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>// </span>
				<span style="FONT-FAMILY: 宋体">如果没有能够从</span>
				<span lang="EN-US">DbManager</span>
				<span style="FONT-FAMILY: 宋体">获取连接，此次查询操作失败</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>
						</span>
						<span>        </span>logger.error(" showimage.jsp </span>
				<span style="FONT-FAMILY: 宋体">不能获取数据库连接，无法读取图片！</span>
				<span lang="EN-US">");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>try {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>// </span>
				<span style="FONT-FAMILY: 宋体">准备语句执行对象</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>stmt = conn.createStatement();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>String sql = " SELECT hr01_photo FROM hr01 WHERE hr01_id='" + photo_no + "'";</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>ResultSet rs = stmt.executeQuery(sql);</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>if (rs.next()) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>InputStream in = rs.getBinaryStream("hr01_photo");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>int bytesRead = 0;</span>
		</p>
		<p class="AltL" style="MARGIN-LEFT: 8.5pt; TEXT-INDENT: 98.1pt">
				<span lang="EN-US">byte[] buffer = new byte[8192];</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>response.setContentType("image/jpeg");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>response.setContentLength(in.available());</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>OutputStream outs = response.getOutputStream();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>
						<span>                        </span>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>while ((bytesRead = in.read(buffer, 0, 8192)) != -1) {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>                 </span>outs.write(buffer, 0, bytesRead);</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>outs.flush();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>in.close();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>rs.close();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>} else {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>rs.close();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>response.sendRedirect("error.jsp");</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>}catch(SQLException e){</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>}finally {</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>try{</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>stmt.close();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>conn.close();</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>}catch(SQLException ex){</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>             </span>
				</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>         </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>}</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>     </span>return null;</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">
						<span>
						</span>}</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">以前一直不清楚</span>
				<span lang="EN-US">execute</span>
				<span style="FONT-FAMILY: 宋体">方法中的</span>
				<span lang="EN-US">response</span>
				<span style="FONT-FAMILY: 宋体">参数的用法，因为处理完以后总要</span>
				<span lang="EN-US">redirect</span>
				<span style="FONT-FAMILY: 宋体">到另外一个页面，所以用的最多的就是把数据保存在</span>
				<span lang="EN-US">session</span>
				<span style="FONT-FAMILY: 宋体">中，在另一个页面里再取出来用。这次纯粹是试验性地在</span>
				<span lang="EN-US">response</span>
				<span style="FONT-FAMILY: 宋体">中写入</span>
				<span lang="EN-US">image/jpeg</span>
				<span style="FONT-FAMILY: 宋体">内容，然后返回一个</span>
				<span lang="EN-US">null</span>
				<span style="FONT-FAMILY: 宋体">值。最后的执行结果跟我预期的一样，在浏览器中直接显示从数据库中读出的图片。那么接下来就很好做了，只需要在</span>
				<span lang="EN-US">JSP</span>
				<span style="FONT-FAMILY: 宋体">页面中设置一个</span>
				<span lang="EN-US">&lt;image&gt;</span>
				<span style="FONT-FAMILY: 宋体">标签，指向这个</span>
				<span lang="EN-US">Action</span>
				<span style="FONT-FAMILY: 宋体">就可以，当然，在这之前需要在</span>
				<span lang="EN-US">struts-config.xml</span>
				<span style="FONT-FAMILY: 宋体">中先部署这个</span>
				<span lang="EN-US">Action</span>
				<span style="FONT-FAMILY: 宋体">：</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">&lt;action path="/ShowImage"<o:p></o:p></span>
		</p>
		<p class="AltL" style="MARGIN-LEFT: 8.5pt; TEXT-INDENT: 62.1pt">
				<span lang="EN-US">
						<span> </span>type="software.action.ShowImageAction"&gt;&lt;/action&gt;</span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span style="FONT-FAMILY: 宋体">然后在</span>
				<span lang="EN-US">JSP</span>
				<span style="FONT-FAMILY: 宋体">页面中引用这个</span>
				<span lang="EN-US">Action</span>
				<span style="FONT-FAMILY: 宋体">来显示图像</span>
				<span lang="EN-US">:</span>
		</p>
		<p class="AltL">
				<span lang="EN-US">&lt;img src="/tibet/ShowImage.do?photo_no=666542"&gt;<o:p></o:p></span>
		</p>
		<p class="altq" style="TEXT-INDENT: 26pt">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<br />&lt; p&gt;<img src ="http://www.blogjava.net/WshmAndLily/aggbug/88347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2006-12-17 16:30 <a href="http://www.blogjava.net/WshmAndLily/articles/88347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>html:messages与html:errors</title><link>http://www.blogjava.net/WshmAndLily/articles/82531.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 21 Nov 2006 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/82531.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/82531.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/82531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/82531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/82531.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#0000ff" size="4">
						<strong>1. 简介</strong>
				</font>     <br />    &lt;html:messages&gt; 标签和 &lt;html:errors&gt; 标签有些相似之处, 也能够在网页上输出消息, 不过两者的使用方法有些差别.<br /><font color="#0000ff" size="4"><strong>2. 实例</strong></font><br />    &lt;html:messages id="message" message="true"&gt;<br />        &lt;bean:write name="message"/&gt;<br />    &lt;/html:messages&gt;</p>
		<p>
				<strong>
						<font color="#0000ff" size="4">3. 属性</font>
				</strong>
				<br />
				<strong>(1) name:</strong> 指定ActionMessages 对象存放在 request 或 session 范围内的属性 key(即上面实例中的message). 标签处理类将根据这一属性key 来检索request 或 session 范围的 ActionMessages 对象.</p>
		<p>
				<strong>(2) message:</strong> 指定消息的来源. 如果为true , 则从request 或 session 范围内检索出属性 key为 Globals.MESSAGE_KEY 的 ActionMessages 对象, 此时 name 属性无效; 如果为false ,则根据name 属性来检索ActionMessages 对象, 如果此时没有设置name 属性, 将采用默认值Globals.ERROR_KEY. message 属性的默认值为false.<br /><strong>(3) id:</strong> 用来命名从消息集合中检索出的每个 ActionMessage 对象, 它和&lt;bean:write&gt;标签的name 属性匹配. 在上例中, &lt;html:messages&gt; 标签的处理类每次从消息集合中取出一个 ActionMessages 对象, 就把它命名为 "message", &lt;bean:write&gt; 标签接着把这个名为"message" 的ActionMessage 对象的消息输出到网页上.<br /><font color="#0000ff" size="4"><strong>4. 创建ActionMessages 集合, 存入request 中</strong></font><br />    ActionMessages actionMessages = new ActionMessages();<br />    actionMessages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("record.inserted"));<br />    saveMessages(request, actionMessages);<br /></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/82531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2006-11-21 14:33 <a href="http://www.blogjava.net/WshmAndLily/articles/82531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>