﻿<?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-小菜毛毛技术分享-文章分类-J2EE相关技术与框架</title><link>http://www.blogjava.net/caizh2009/category/39394.html</link><description>与大家共同成长</description><language>zh-cn</language><lastBuildDate>Mon, 01 Mar 2010 21:36:41 GMT</lastBuildDate><pubDate>Mon, 01 Mar 2010 21:36:41 GMT</pubDate><ttl>60</ttl><item><title>web.xml配置属性获取</title><link>http://www.blogjava.net/caizh2009/articles/314160.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Mon, 01 Mar 2010 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/314160.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/314160.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/314160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/314160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/314160.html</trackback:ping><description><![CDATA[&lt;context-param&gt;<br />
&nbsp;&nbsp;&lt;param-name&gt;linux_direct&lt;/param-name&gt;<br />
&nbsp;&nbsp;&lt;param-value&gt;/u01/app/bea/user_project/domains/upload&lt;/param-value&gt;<br />
&nbsp;&lt;/context-param&gt;<br />
&nbsp;&lt;!--批量工单 window存放目录&nbsp; --&gt;<br />
&nbsp;&lt;context-param&gt;<br />
&nbsp;&nbsp;&lt;param-name&gt;window_direct&lt;/param-name&gt;<br />
&nbsp;&nbsp;&lt;param-value&gt;d:\\upload&lt;/param-value&gt;<br />
&nbsp;&lt;/context-param&gt;<br />
<br />
servlet中获取<br />
String linuxDirect=this.getServlet().getServletConfig().getServletContext().getInitParameter("linux_direct");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String windowDirect=this.getServlet().getServletConfig().getServletContext().getInitParameter("window_direct");
<img src ="http://www.blogjava.net/caizh2009/aggbug/314160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-03-01 14:49 <a href="http://www.blogjava.net/caizh2009/articles/314160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jxl的API</title><link>http://www.blogjava.net/caizh2009/articles/313871.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Thu, 25 Feb 2010 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/313871.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/313871.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/313871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/313871.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/313871.html</trackback:ping><description><![CDATA[使用Windows操作系统的朋友对Excel（电子表格）一定不会陌生，但是要使用Java语言来操纵Excel文件并不是一件容易的事。在Web应用日益盛行的今天，通过Web来操作Excel文件的需求越来越强烈，目前较为流行的操作是在JSP或Servlet 中创建一个CSV （comma separated values）文件，并将这个文件以MIME，text/csv类型返回给浏览器，接着浏览器调用Excel并且显示CSV文件。这样只是说可以访问到Excel文件，但是还不能真正的操纵Excel文件，本文将给大家一个惊喜，向大家介绍一个开放源码项目——Java Excel <span class="hilite2">API</span>，使用它大家就可以方便地操纵Excel文件了。 <br />
<br />
<br />
JAVA EXCEL <span class="hilite2">API</span>简介 <br />
Java Excel是一开放源码项目，通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该<span class="hilite2">API</span>非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的，所以我们在Web应用中可以通过JSP、Servlet来调用<span class="hilite2">API</span>实现对Excel数据表的访问。 <br />
<br />
现在发布的稳定版本是V2.0，提供以下功能： <br />
<br />
&#183; 从Excel 95、97、2000等格式的文件中读取数据； <br />
<br />
&#183; 读取Excel公式（可以读取Excel 97以后的公式）； <br />
<br />
&#183; 生成Excel数据表（格式为Excel 97）； <br />
<br />
&#183; 支持字体、数字、日期的格式化； <br />
<br />
&#183; 支持单元格的阴影操作，以及颜色操作； <br />
<br />
&#183; 修改已经存在的数据表； <br />
<br />
&#183; 现在还不支持以下功能，但不久就会提供了： <br />
<br />
&#183; 不能够读取图表信息； <br />
<br />
可以读，但是不能生成公式，任何类型公式最后的计算值都可以读出； <br />
<br />
<br />
应用示例 <br />
从Excel文件读取数据表 <br />
<br />
Java Excel <span class="hilite2">API</span>既可以从本地文件系统的一个文件(.xls)，也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术语：工作薄)，下面的代码片段举例说明了应该如何操作：(完整代码见ExcelReading.java) <br />
<br />
import java.io.*; <br />
import <span class="hilite1">jxl</span>.*; <br />
&#8230; &#8230; &#8230; &#8230; <br />
try <br />
{ <br />
//构建Workbook对象, 只读Workbook对象 <br />
//直接从本地文件创建Workbook <br />
//从输入流创建Workbook <br />
&nbsp;&nbsp;&nbsp; InputStream is = new FileInputStream(sourcefile); <br />
&nbsp;&nbsp;&nbsp; <span class="hilite1">jxl</span>.Workbook rwb = Workbook.getWorkbook(is); <br />
} <br />
catch (Exception e) <br />
{ <br />
e.printStackTrace(); <br />
} <br />
<br />
<br />
一旦创建了Workbook，我们就可以通过它来访问Excel Sheet(术语：工作表)。参考下面的代码片段： <br />
<br />
//获取第一张Sheet表 <br />
Sheet rs = rwb.getSheet(0); <br />
<br />
<br />
我们既可能通过Sheet的名称来访问它，也可以通过下标来访问它。如果通过下标来访问的话，要注意的一点是下标从0开始，就像数组一样。 <br />
<br />
一旦得到了Sheet，我们就可以通过它来访问Excel Cell(术语：单元格)。参考下面的代码片段： <br />
<br />
//获取第一行，第一列的值 <br />
Cell c00 = rs.getCell(0, 0); <br />
String strc00 = c00.getContents(); <br />
//获取第一行，第二列的值 <br />
Cell c10 = rs.getCell(1, 0); <br />
String strc10 = c10.getContents(); <br />
//获取第二行，第二列的值 <br />
Cell c11 = rs.getCell(1, 1); <br />
String strc11 = c11.getContents(); <br />
System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + <br />
c00.getType()); <br />
System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + <br />
c10.getType()); <br />
System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + <br />
c11.getType()); <br />
<br />
<br />
如果仅仅是取得Cell的值，我们可以方便地通过getContents()方法，它可以将任何类型的Cell值都作为一个字符串返回。示例代码中Cell(0, 0)是文本型，Cell(1, 0)是数字型，Cell(1,1)是日期型，通过getContents()，三种类型的返回值都是字符型。 <br />
<br />
如果有需要知道Cell内容的确切类型，<span class="hilite2">API</span>也提供了一系列的方法。参考下面的代码片段： <br />
<br />
String strc00 = null; <br />
double strc10 = 0.00; <br />
Date strc11 = null; <br />
Cell c00 = rs.getCell(0, 0); <br />
Cell c10 = rs.getCell(1, 0); <br />
Cell c11 = rs.getCell(1, 1); <br />
if(c00.getType() == CellType.LABEL) <br />
{ <br />
LabelCell labelc00 = (LabelCell)c00; <br />
strc00 = labelc00.getString(); <br />
} <br />
if(c10.getType() == CellType.NUMBER) <br />
{ <br />
NmberCell numc10 = (NumberCell)c10; <br />
strc10 = numc10.getValue(); <br />
} <br />
if(c11.getType() == CellType.DATE) <br />
{ <br />
DateCell datec11 = (DateCell)c11; <br />
strc11 = datec11.getDate(); <br />
} <br />
System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + <br />
c00.getType()); <br />
System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + <br />
c10.getType()); <br />
System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + <br />
c11.getType()); <br />
<br />
<br />
在得到Cell对象后，通过getType()方法可以获得该单元格的类型，然后与<span class="hilite2">API</span>提供的基本类型相匹配，强制转换成相应的类型，最后调用相应的取值方法getXXX()，就可以得到确定类型的值。<span class="hilite2">API</span>提供了以下基本类型，与Excel的数据格式相对应，如下图所示： <br />
<br />
<br />
<br />
每种类型的具体意义，请参见Java Excel <span class="hilite2">API</span> Document。 <br />
<br />
当你完成对Excel电子表格数据的处理后，一定要使用close()方法来关闭先前创建的对象，以释放读取数据表的过程中所占用的内存空间，在读取大量数据时显得尤为重要。参考如下代码片段： <br />
<br />
//操作完成时，关闭对象，释放占用的内存空间 <br />
rwb.close(); <br />
<br />
<br />
Java Excel <span class="hilite2">API</span>提供了许多访问Excel数据表的方法，在这里我只简要地介绍几个常用的方法，其它的方法请参考附录中的Java Excel <span class="hilite2">API</span> Document。 <br />
<br />
&#183; Workbook类提供的方法 <br />
<br />
1. int getNumberOfSheets() <br />
<br />
获得工作薄（Workbook）中工作表（Sheet）的个数，示例： <br />
<br />
<span class="hilite1">jxl</span>.Workbook rwb = <span class="hilite1">jxl</span>.Workbook.getWorkbook(new File(sourcefile)); <br />
int sheets = rwb.getNumberOfSheets(); <br />
<br />
<br />
2. Sheet[] getSheets() <br />
<br />
返回工作薄（Workbook）中工作表（Sheet）对象数组，示例： <br />
<br />
<span class="hilite1">jxl</span>.Workbook rwb = <span class="hilite1">jxl</span>.Workbook.getWorkbook(new File(sourcefile)); <br />
Sheet[] sheets = rwb.getSheets(); <br />
<br />
<br />
3. String getVersion() <br />
<br />
返回正在使用的<span class="hilite2">API</span>的版本号，好像是没什么太大的作用。 <br />
<br />
<span class="hilite1">jxl</span>.Workbook rwb = <span class="hilite1">jxl</span>.Workbook.getWorkbook(new File(sourcefile)); <br />
String apiVersion = rwb.getVersion(); <br />
<br />
<br />
&#183; Sheet接口提供的方法 <br />
<br />
1. String getName() <br />
<br />
获取Sheet的名称，示例： <br />
<br />
<span class="hilite1">jxl</span>.Workbook rwb = <span class="hilite1">jxl</span>.Workbook.getWorkbook(new File(sourcefile)); <br />
<span class="hilite1">jxl</span>.Sheet rs = rwb.getSheet(0); <br />
String sheetName = rs.getName(); <br />
<br />
<br />
2. int getColumns() <br />
<br />
获取Sheet表中所包含的总列数，示例： <br />
<br />
<span class="hilite1">jxl</span>.Workbook rwb = <span class="hilite1">jxl</span>.Workbook.getWorkbook(new File(sourcefile)); <br />
<span class="hilite1">jxl</span>.Sheet rs = rwb.getSheet(0); <br />
int rsColumns = rs.getColumns(); <br />
<br />
<br />
3. Cell[] getColumn(int column) <br />
<br />
获取某一列的所有单元格，返回的是单元格对象数组，示例： <br />
<br />
<span class="hilite1">jxl</span>.Workbook rwb = <span class="hilite1">jxl</span>.Workbook.getWorkbook(new File(sourcefile)); <br />
<span class="hilite1">jxl</span>.Sheet rs = rwb.getSheet(0); <br />
Cell[] cell = rs.getColumn(0); <br />
<br />
<br />
4. int getRows() <br />
<br />
获取Sheet表中所包含的总行数，示例： <br />
<br />
<span class="hilite1">jxl</span>.Workbook rwb = <span class="hilite1">jxl</span>.Workbook.getWorkbook(new File(sourcefile)); <br />
<span class="hilite1">jxl</span>.Sheet rs = rwb.getSheet(0); <br />
int rsRows = rs.getRows(); <br />
<br />
<br />
5. Cell[] getRow(int row) <br />
<br />
获取某一行的所有单元格，返回的是单元格对象数组，示例子： <br />
<br />
<span class="hilite1">jxl</span>.Workbook rwb = <span class="hilite1">jxl</span>.Workbook.getWorkbook(new File(sourcefile)); <br />
<span class="hilite1">jxl</span>.Sheet rs = rwb.getSheet(0); <br />
Cell[] cell = rs.getRow(0); <br />
<br />
<br />
6. Cell getCell(int column, int row) <br />
<br />
获取指定单元格的对象引用，需要注意的是它的两个参数，第一个是列数，第二个是行数，这与通常的行、列组合有些不同。 <br />
<br />
<span class="hilite1">jxl</span>.Workbook rwb = <span class="hilite1">jxl</span>.Workbook.getWorkbook(new File(sourcefile)); <br />
<span class="hilite1">jxl</span>.Sheet rs = rwb.getSheet(0); <br />
Cell cell = rs.getCell(0, 0); <br />
<br />
<br />
生成新的Excel工作薄 <br />
<br />
下面的代码主要是向大家介绍如何生成简单的Excel工作表，在这里单元格的内容是不带任何修饰的(如：字体，颜色等等)，所有的内容都作为字符串写入。(完整代码见ExcelWriting.java) <br />
<br />
与读取Excel工作表相似，首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象，这里要注意的是，只能通过<span class="hilite2">API</span>提供的工厂方法来创建Workbook，而不能使用WritableWorkbook的构造函数，因为类WritableWorkbook的构造函数为protected类型。示例代码片段如下： <br />
<br />
import java.io.*; <br />
import <span class="hilite1">jxl</span>.*; <br />
import <span class="hilite1">jxl</span>.write.*; <br />
&#8230; &#8230; &#8230; &#8230; <br />
try <br />
{ <br />
//构建Workbook对象, 只读Workbook对象 <br />
//Method 1：创建可写入的Excel工作薄 <br />
<span class="hilite1">jxl</span>.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile)); <br />
//Method 2：将WritableWorkbook直接写入到输出流 <br />
/* <br />
&nbsp;&nbsp;&nbsp; OutputStream os = new FileOutputStream(targetfile); <br />
&nbsp;&nbsp;&nbsp; <span class="hilite1">jxl</span>.write.WritableWorkbook wwb = Workbook.createWorkbook(os); <br />
*/ <br />
} <br />
catch (Exception e) <br />
{ <br />
e.printStackTrace(); <br />
} <br />
<br />
<br />
<span class="hilite2">API</span>提供了两种方式来处理可写入的输出流，一种是直接生成本地文件，如果文件名不带全路径的话，缺省的文件会定位在当前目录，如果文件名带有全路径的话，则生成的Excel文件则会定位在相应的目录；另外一种是将Excel对象直接写入到输出流，例如：用户通过浏览器来访问Web服务器，如果HTTP头设置正确的话，浏览器自动调用客户端的Excel应用程序，来显示动态生成的Excel电子表格。 <br />
<br />
接下来就是要创建工作表，创建工作表的方法与创建工作薄的方法几乎一样，同样是通过工厂模式方法获得相应的对象，该方法需要两个参数，一个是工作表的名称，另一个是工作表在工作薄中的位置，参考下面的代码片段： <br />
<br />
//创建Excel工作表 <br />
<span class="hilite1">jxl</span>.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0); <br />
<br />
<br />
"这锅也支好了，材料也准备齐全了，可以开始下锅了！"，现在要做的只是实例化<span class="hilite2">API</span>所提供的Excel基本数据类型，并将它们添加到工作表中就可以了，参考下面的代码片段： <br />
<br />
//1.添加Label对象 <br />
<span class="hilite1">jxl</span>.write.Label labelC = new <span class="hilite1">jxl</span>.write.Label(0, 0, "This is a Label cell"); <br />
ws.addCell(labelC); <br />
//添加带有字型Formatting的对象 <br />
<span class="hilite1">jxl</span>.write.WritableFont wf = new <span class="hilite1">jxl</span>.write.WritableFont(WritableFont.TIMES, 18, <br />
WritableFont.BOLD, true); <br />
<span class="hilite1">jxl</span>.write.WritableCellFormat wcfF = new <span class="hilite1">jxl</span>.write.WritableCellFormat(wf); <br />
<span class="hilite1">jxl</span>.write.Label labelCF = new <span class="hilite1">jxl</span>.write.Label(1, 0, "This is a Label Cell", <br />
wcfF); <br />
ws.addCell(labelCF); <br />
//添加带有字体颜色Formatting的对象 <br />
<span class="hilite1">jxl</span>.write.WritableFont wfc = new <span class="hilite1">jxl</span>.write.WritableFont(WritableFont.ARIAL, 10, <br />
WritableFont.NO_BOLD, false, <br />
UnderlineStyle.NO_UNDERLINE, <span class="hilite1">jxl</span>.format.Colour.RED); <br />
<span class="hilite1">jxl</span>.write.WritableCellFormat wcfFC = new <span class="hilite1">jxl</span>.write.WritableCellFormat(wfc); <br />
<span class="hilite1">jxl</span>.write.Label labelCFC = new <span class="hilite1">jxl</span>.write.Label(1, 0, "This is a Label Cell", <br />
wcfFC); <br />
ws.addCell(labelCF); <br />
//2.添加Number对象 <br />
<span class="hilite1">jxl</span>.write.Number labelN = new <span class="hilite1">jxl</span>.write.Number(0, 1, 3.1415926); <br />
ws.addCell(labelN); <br />
//添加带有formatting的Number对象 <br />
<span class="hilite1">jxl</span>.write.NumberFormat nf = new <span class="hilite1">jxl</span>.write.NumberFormat("#.##"); <br />
<span class="hilite1">jxl</span>.write.WritableCellFormat wcfN = new <span class="hilite1">jxl</span>.write.WritableCellFormat(nf); <br />
<span class="hilite1">jxl</span>.write.Number labelNF = new <span class="hilite1">jxl</span>.write.Number(1, 1, 3.1415926, wcfN); <br />
ws.addCell(labelNF); <br />
//3.添加Boolean对象 <br />
<span class="hilite1">jxl</span>.write.Boolean labelB = new <span class="hilite1">jxl</span>.write.Boolean(0, 2, false); <br />
ws.addCell(labelB); <br />
//4.添加DateTime对象 <br />
<span class="hilite1">jxl</span>.write.DateTime labelDT = new <span class="hilite1">jxl</span>.write.DateTime(0, 3, new java.util.Date()); <br />
ws.addCell(labelDT); <br />
//添加带有formatting的DateFormat对象 <br />
<span class="hilite1">jxl</span>.write.DateFormat df = new <span class="hilite1">jxl</span>.write.DateFormat("dd MM yyyy hh:mm:ss"); <br />
<span class="hilite1">jxl</span>.write.WritableCellFormat wcfDF = new <span class="hilite1">jxl</span>.write.WritableCellFormat(df); <br />
<span class="hilite1">jxl</span>.write.DateTime labelDTF = new <span class="hilite1">jxl</span>.write.DateTime(1, 3, new java.util.Date(), <br />
wcfDF); <br />
ws.addCell(labelDTF); <br />
<br />
<br />
这里有两点大家要引起大家的注意。第一点，在构造单元格时，单元格在工作表中的位置就已经确定了。一旦创建后，单元格的位置是不能够变更的，尽管单元格的内容是可以改变的。第二点，单元格的定位是按照下面这样的规律(column, row)，而且下标都是从0开始，例如，A1被存储在(0, 0)，B1被存储在(1, 0)。 <br />
<br />
最后，不要忘记关闭打开的Excel工作薄对象，以释放占用的内存，参见下面的代码片段： <br />
<br />
//写入Exel工作表 <br />
wwb.write(); <br />
//关闭Excel工作薄对象 <br />
wwb.close(); <br />
<br />
<br />
这可能与读取Excel文件的操作有少少不同，在关闭Excel对象之前，你必须要先调用write()方法，因为先前的操作都是存储在缓存中的，所以要通过该方法将操作的内容保存在文件中。如果你先关闭了Excel对象，那么只能得到一张空的工作薄了。 <br />
<br />
拷贝、更新Excel工作薄 <br />
<br />
接下来简要介绍一下如何更新一个已经存在的工作薄，主要是下面二步操作，第一步是构造只读的Excel工作薄，第二步是利用已经创建的Excel工作薄创建新的可写入的Excel工作薄，参考下面的代码片段：(完整代码见ExcelModifying.java) <br />
<br />
//创建只读的Excel工作薄的对象 <br />
<span class="hilite1">jxl</span>.Workbook rw = <span class="hilite1">jxl</span>.Workbook.getWorkbook(new File(sourcefile)); <br />
//创建可写入的Excel工作薄对象 <br />
<span class="hilite1">jxl</span>.write.WritableWorkbook&nbsp; wwb = Workbook.createWorkbook(new File(targetfile), <br />
rw); <br />
//读取第一张工作表 <br />
<span class="hilite1">jxl</span>.write.WritableSheet ws = wwb.getSheet(0); <br />
//获得第一个单元格对象 <br />
<span class="hilite1">jxl</span>.write.WritableCell wc = ws.getWritableCell(0, 0); <br />
//判断单元格的类型, 做出相应的转化 <br />
if(wc.getType() == CellType.LABEL) <br />
{ <br />
Label l = (Label)wc; <br />
&nbsp;&nbsp;&nbsp; l.setString("The value has been modified."); <br />
} <br />
//写入Excel对象 <br />
wwb.write(); <br />
//关闭可写入的Excel对象 <br />
wwb.close(); <br />
//关闭只读的Excel对象 <br />
rw.close(); <br />
<br />
<br />
之所以使用这种方式构建Excel对象，完全是因为效率的原因，因为上面的示例才是<span class="hilite2">API</span>的主要应用。为了提高性能，在读取工作表时，与数据相关的一些输出信息，所有的格式信息，如：字体、颜色等等，是不被处理的，因为我们的目的是获得行数据的值，既使没有了修饰，也不会对行数据的值产生什么影响。唯一的不利之处就是，在内存中会同时保存两个同样的工作表，这样当工作表体积比较大时，会占用相当大的内存，但现在好像内存的大小并不是什么关键因素了。 <br />
<br />
一旦获得了可写入的工作表对象，我们就可以对单元格对象进行更新的操作了，在这里我们不必调用<span class="hilite2">API</span>提供的add()方法，因为单元格已经于工作表当中，所以我们只需要调用相应的setXXX()方法，就可以完成更新的操作了。 <br />
<br />
尽单元格原有的格式化修饰是不能去掉的，我们还是可以将新的单元格修饰加上去，以使单元格的内容以不同的形式表现。 <br />
<br />
新生成的工作表对象是可写入的，我们除了更新原有的单元格外，还可以添加新的单元格到工作表中，这与示例2的操作是完全一样的。 <br />
<br />
最后，不要忘记调用write()方法，将更新的内容写入到文件中，然后关闭工作薄对象，这里有两个工作薄对象要关闭，一个是只读的，另外一个是可写入的。 <br />
<br />
<br />
小结 <br />
本文只是对Java Excel <span class="hilite2">API</span>中常用的方法作了介绍，要想更详尽地了解<span class="hilite2">API</span>，请大家参考<span class="hilite2">API</span>文档，或源代码。Java Excel <span class="hilite2">API</span>是一个开放源码项目，请大家关注它的最新进展，有兴趣的朋友也可以申请加入这个项目，或者是提出宝贵的意见。 <br />
<br />
参考资料 <br />
<br />
Java Excel <span class="hilite2">API</span> 文档 <br />
<br />
http://www.andykhan.com/jexcelapi/ <br />
<img src ="http://www.blogjava.net/caizh2009/aggbug/313871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-02-25 11:31 <a href="http://www.blogjava.net/caizh2009/articles/313871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC,连接池 代码模拟</title><link>http://www.blogjava.net/caizh2009/articles/313724.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 23 Feb 2010 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/313724.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/313724.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/313724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/313724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/313724.html</trackback:ping><description><![CDATA[在JSP中连接到Oracle一般有2种方式：<br />
　　1、Oracle JDBC的oci8方式<br />
　　2、Oracle JDBC的thin方式 <br />
<br />
　　我比较喜欢第2种，因为WEB发布服务器与数据库服务器一般都不会放在同一台电脑中，而在使用thin方式连接时，WEB服务器端无须安装oracle的客户端。<br />
<br />
　　在动手先代码之前，我们先把环境配置妥善。先从安装了Oracle的数据库服务器中，找到Oracle安装目录，然后将该目录下的jdbc\lib\classes12.jar文件拷贝到WEB发布服务器的某个目录。假设就直接放在C:\根目录下吧，然后把该路径添加到&#8216;系统--高级--环境变量&#8217;中变量名为&#8216;CLASSPATH&#8217;的值中，如：D:\Program Files\SQLLIB\java\db2java.zip;D:\Program Files\SQLLIB\java\runtime.zip;c:classes12.jar; 也就是让java能够找到这个包。<br />
<br />
　　配置好环境后，我们就开始开始动手写代码了。关于数据库连接的代码，应该写个专门的连接类来调用，没必要想网络上有些文章那样，直接写到JSP的代码中。<br />
<br />
　　关于连接的代码很简单<br />
<br />
<table width="100%" bgcolor="#ffffff">
    <tbody>
        <tr>
            <td>private Connection newConnection(String user,String password) {<br />
            Connection con = null; <br />
            try { <br />
            Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <br />
            con = DriverManager.getConnection (&#8220;jdbc:oracle:thin:@192.168.96.1:1521:oracle9i&#8221;,user,password); <br />
            } <br />
            catch (SQLException e) { <br />
            return null; <br />
            } <br />
            return con; <br />
            } </td>
        </tr>
    </tbody>
</table>
<br />
　　如果帐号密码没有错，那这个函数就应该能返回个可用的连接。但如此简单的连接在一个项目中使用，是远远达不到效果的。我们可以在这个数据库连接类中加入更多的功能，如连接池等等。下面我就把该数据库连接类的代码详细的列出来，大家可以参考参考。<br />
<br />
<table width="100%" bgcolor="#ffffff">
    <tbody>
        <tr>
            <td>/*<br />
            * @Title 公司网站<br />
            * @Author: zf<br />
            * @Version 1.0<br />
            * @Memo:定义数据库连接及其数据库连接池等<br />
            */<br />
            package com.kingson.db;<br />
            <br />
            import java.io.*;<br />
            import java.sql.*;<br />
            import java.util.*;<br />
            import java.util.Date;<br />
            <br />
            public class DBConnectionManager {<br />
            static private DBConnectionManager instance; // 唯一实例<br />
            static private int clients;<br />
            <br />
            private Vector drivers = new Vector();<br />
            private PrintWriter log;<br />
            private Hashtable pools = new Hashtable();<br />
            <br />
            /**<br />
            * 返回唯一实例.如果是第一次调用此方法,则创建实例<br />
            *<br />
            * @return DBConnectionManager 唯一实例<br />
            */<br />
            static synchronized public DBConnectionManager getInstance() {<br />
            if (instance == null) {<br />
            instance = new DBConnectionManager();<br />
            }<br />
            clients++;<br />
            return instance;<br />
            }<br />
            <br />
            /**<br />
            * 建构函数私有以防止其它对象创建本类实例<br />
            */<br />
            private DBConnectionManager() {<br />
            init();<br />
            }<br />
            <br />
            /**<br />
            * 将连接对象返回给由名字指定的连接池<br />
            *<br />
            * @param name 在属性文件中定义的连接池名字<br />
            * @param con 连接对象<br />
            */<br />
            public void freeConnection(String name, Connection con) {<br />
            DBConnectionPool pool = (DBConnectionPool) pools.get(name);<br />
            if (pool != null) {<br />
            pool.freeConnection(con);<br />
            }<br />
            }<br />
            <br />
            /**<br />
            * 获得一个可用的(空闲的)连接.如果没有可用连接,且已有连接数小于最大连接数<br />
            * 限制,则创建并返回新连接<br />
            *<br />
            * @param name 在属性文件中定义的连接池名字<br />
            * @return Connection 可用连接或null<br />
            */<br />
            public Connection getConnection(String name) {<br />
            DBConnectionPool pool = (DBConnectionPool) pools.get(name);<br />
            if (pool != null) {<br />
            return pool.getConnection();<br />
            }<br />
            return null;<br />
            }<br />
            <br />
            /**<br />
            * 获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制,<br />
            * 则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接.<br />
            *<br />
            * @param name 连接池名字<br />
            * @param time 以毫秒计的等待时间<br />
            * @return Connection 可用连接或null<br />
            */<br />
            public Connection getConnection(String name, long time) {<br />
            DBConnectionPool pool = (DBConnectionPool) pools.get(name);<br />
            if (pool != null) {<br />
            return pool.getConnection(time);<br />
            }<br />
            return null;<br />
            }<br />
            <br />
            /**<br />
            * 关闭所有连接,撤销驱动程序的注册<br />
            */<br />
            public synchronized void release() {<br />
            // 等待直到最后一个客户程序调用<br />
            if (--clients != 0) {<br />
            return;<br />
            }<br />
            <br />
            Enumeration allPools = pools.elements();<br />
            while (allPools.hasMoreElements()) {<br />
            DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();<br />
            pool.release();<br />
            }<br />
            Enumeration allDrivers = drivers.elements();<br />
            while (allDrivers.hasMoreElements()) {<br />
            Driver driver = (Driver) allDrivers.nextElement();<br />
            try {<br />
            DriverManager.deregisterDriver(driver);<br />
            log("撤销JDBC驱动程序 " + driver.getClass().getName()+"的注册");<br />
            }<br />
            catch (SQLException e) {<br />
            log(e, "无法撤销下列JDBC驱动程序的注册: " + driver.getClass().getName());<br />
            }<br />
            }<br />
            }<br />
            <br />
            /**<br />
            * 根据指定属性创建连接池实例.<br />
            *<br />
            * @param props 连接池属性<br />
            */<br />
            private void createPools(Properties props) {<br />
            Enumeration propNames = props.propertyNames();<br />
            while (propNames.hasMoreElements()) {<br />
            String name = (String) propNames.nextElement();<br />
            if (name.endsWith(".url")) {<br />
            String poolName = name.substring(0, name.lastIndexOf("."));<br />
            String url = props.getProperty(poolName + ".url");<br />
            if (url == null) {<br />
            log("没有为连接池" + poolName + "指定URL");<br />
            continue;<br />
            }<br />
            String user = props.getProperty(poolName + ".user");<br />
            String password = props.getProperty(poolName + ".password");<br />
            String dbip = props.getProperty(poolName + ".db_ip", "192.168.96.1");<br />
            String dbport = props.getProperty(poolName + ".db_port", "1521");<br />
            String dbuid = props.getProperty(poolName + ".db_uid", "ORACLE9I");<br />
            String maxconn = props.getProperty(poolName + ".maxconn", "0");<br />
            //连接信息<br />
            String dbInfo = user + "/" + password + "@" + dbip + ":" + dbport + ":" + dbuid;<br />
            int max;<br />
            try {<br />
            max = Integer.valueOf(maxconn).intValue();<br />
            }<br />
            catch (NumberFormatException e) {<br />
            log("错误的最大连接数限制: " + maxconn + " .连接池: " + poolName);<br />
            max = 0;<br />
            }<br />
            DBConnectionPool pool = new DBConnectionPool(poolName, url,dbInfo, max);<br />
            pools.put(poolName, pool);<br />
            log("成功创建连接池" + poolName);<br />
            }<br />
            }<br />
            }<br />
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/caizh2009/aggbug/313724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-02-23 15:40 <a href="http://www.blogjava.net/caizh2009/articles/313724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache Commons fileUpload实现文件上传</title><link>http://www.blogjava.net/caizh2009/articles/310149.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 19 Jan 2010 15:26:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/310149.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/310149.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/310149.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/310149.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/310149.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 版权声明：原创作品，允许转载，转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhangjunhd.blog.51cto.com/113473/18331                                                    Apache的commons-fileupload.jar可方便的实现文...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/articles/310149.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/310149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-19 23:26 <a href="http://www.blogjava.net/caizh2009/articles/310149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache Commons工具集简介</title><link>http://www.blogjava.net/caizh2009/articles/310146.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 19 Jan 2010 15:03:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/310146.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/310146.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/310146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/310146.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/310146.html</trackback:ping><description><![CDATA[<p>Commons BeanUtils<br />
http://jakarta.apache.org/commons/beanutils/index.html<br />
说明：针对Bean的一个工具集。由于Bean往往是有一堆get和set组成，所以BeanUtils也是在此基础上进行一些包装。<br />
使用示例：功能有很多，网站上有详细介绍。一个比较常用的功能是Bean Copy，也就是copy bean的属性。如果做分层架构开发的话就会用到，比如从PO（Persistent Object）拷贝数据到VO（Value Object）。<br />
传统方法如下：<br />
//得到TeacherForm<br />
TeacherForm teacherForm=(TeacherForm)form;<br />
//构造Teacher对象<br />
Teacher teacher=new Teacher();<br />
//赋值<br />
teacher.setName(teacherForm.getName());<br />
teacher.setAge(teacherForm.getAge());<br />
teacher.setGender(teacherForm.getGender());<br />
teacher.setMajor(teacherForm.getMajor());<br />
teacher.setDepartment(teacherForm.getDepartment());<br />
&nbsp; <br />
//持久化Teacher对象到数据库<br />
HibernateDAO= ;<br />
HibernateDAO.save(teacher);<br />
<br />
使用BeanUtils后，代码就大大改观了，如下所示：<br />
//得到TeacherForm<br />
TeacherForm teacherForm=(TeacherForm)form;<br />
//构造Teacher对象<br />
Teacher teacher=new Teacher();<br />
//赋值<br />
BeanUtils.copyProperties(teacher,teacherForm);<br />
//持久化Teacher对象到数据库<br />
HibernateDAO= ;<br />
HibernateDAO.save(teacher);<br />
<br />
Commons CLI<br />
http://jakarta.apache.org/commons/cli/index.html<br />
说明：这是一个处理命令的工具。比如main方法输入的string[]需要解析。你可以预先定义好参数的规则，然后就可以调用CLI来解析。<br />
使用示例：<br />
// create Options object<br />
Options options = new Options();<br />
// add t option, option is the command parameter, false indicates that <br />
// this parameter is not required.<br />
options.addOption(&#8220;t&#8221;, false, &#8220;display current time&#8221;);<br />
options.addOption("c", true, "country code");<br />
CommandLineParser parser = new PosixParser();<br />
CommandLine cmd = parser.parse( options, args);<br />
if(cmd.hasOption("t")) {<br />
&nbsp;&nbsp;&nbsp; // print the date and time<br />
}<br />
else {<br />
&nbsp;&nbsp;&nbsp; // print the date<br />
}<br />
// get c option value<br />
String countryCode = cmd.getOptionValue("c");<br />
<br />
if(countryCode == null) {<br />
&nbsp;&nbsp;&nbsp; // print default date<br />
}<br />
else {<br />
&nbsp;&nbsp;&nbsp; // print date for country specified by countryCode<br />
}<br />
<br />
Commons Codec<br />
http://jakarta.apache.org/commons/codec/index.html<br />
说明：这个工具是用来编码和解码的，包括Base64，URL，Soundx等等。用这个工具的人应该很清楚这些，我就不多介绍了。<br />
<br />
Commons Collections<br />
http://jakarta.apache.org/commons/collections/<br />
说明：你可以把这个工具看成是java.util的扩展。<br />
使用示例：举一个简单的例子<br />
OrderedMap map = new LinkedMap();<br />
map.put("FIVE", "5");<br />
map.put("SIX", "6");<br />
map.put("SEVEN", "7");<br />
map.firstKey();&nbsp; // returns "FIVE"<br />
map.nextKey("FIVE");&nbsp; // returns "SIX"<br />
map.nextKey("SIX");&nbsp; // returns "SEVEN"<br />
<br />
Commons Configuration<br />
http://jakarta.apache.org/commons/configuration/<br />
说明：这个工具是用来帮助处理配置文件的，支持很多种存储方式<br />
1.&nbsp;&nbsp;&nbsp; Properties files<br />
2.&nbsp;&nbsp;&nbsp; XML documents<br />
3.&nbsp;&nbsp;&nbsp; Property list files (.plist)<br />
4.&nbsp;&nbsp;&nbsp; JNDI<br />
5.&nbsp;&nbsp;&nbsp; JDBC Datasource<br />
6.&nbsp;&nbsp;&nbsp; System properties<br />
7.&nbsp;&nbsp;&nbsp; Applet parameters<br />
8.&nbsp;&nbsp;&nbsp; Servlet parameters<br />
使用示例：举一个Properties的简单例子<br />
# usergui.properties, definining the GUI,<br />
colors.background = #FFFFFF<br />
colors.foreground = #000080<br />
<br />
window.width = 500<br />
window.height = 300<br />
<br />
PropertiesConfiguration config = new PropertiesConfiguration("usergui.properties");<br />
config.setProperty("colors.background", "#000000);<br />
config.save();<br />
config.save("usergui.backup.properties);//save a copy<br />
Integer integer = config.getInteger("window.width");<br />
<br />
Commons DBCP<br />
http://jakarta.apache.org/commons/dbcp/<br />
说明：Database Connection pool, Tomcat就是用的这个，不用我多说了吧，要用的自己去网站上看说明。<br />
<br />
Commons DbUtils<br />
http://jakarta.apache.org/commons/dbutils/<br />
说明：我以前在写数据库程序的时候，往往把数据库操作单独做一个包。DbUtils就是这样一个工具，以后开发不用再重复这样的工作了。值得一体的是，这个工具并不是现在流行的OR-Mapping工具（比如Hibernate），只是简化数据库操作，比如<br />
QueryRunner run = new QueryRunner(dataSource);<br />
// Execute the query and get the results back from the handler<br />
Object[] result = (Object[]) run.query(<br />
&nbsp;&nbsp;&nbsp; "SELECT * FROM Person WHERE name=?", "John Doe");<br />
<br />
Commons FileUpload<br />
http://jakarta.apache.org/commons/fileupload/<br />
说明：jsp的上传文件功能怎么做呢？<br />
使用示例：<br />
// Create a factory for disk-based file items<br />
FileItemFactory factory = new DiskFileItemFactory();<br />
<br />
// Create a new file upload handler<br />
ServletFileUpload upload = new ServletFileUpload(factory);<br />
<br />
// Parse the request<br />
List /* FileItem */ items = upload.parseRequest(request);<br />
// Process the uploaded items<br />
Iterator iter = items.iterator();<br />
while (iter.hasNext()) {<br />
&nbsp;&nbsp;&nbsp; FileItem item = (FileItem) iter.next();<br />
<br />
&nbsp;&nbsp;&nbsp; if (item.isFormField()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processFormField(item);<br />
&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processUploadedFile(item);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
Commons HttpClient<br />
http://jakarta.apache.org/commons/httpclient/<br />
说明：这个工具可以方便通过编程的方式去访问网站。<br />
使用示例：最简单的Get操作<br />
GetMethod get = new GetMethod("http://jakarta.apache.org");<br />
// execute method and handle any error responses.<br />
&nbsp; ...<br />
InputStream in = get.getResponseBodyAsStream();<br />
// Process the data from the input stream.<br />
get.releaseConnection();<br />
<br />
Commons IO<br />
http://jakarta.apache.org/commons/io/<br />
说明：可以看成是java.io的扩展，我觉得用起来非常方便。<br />
使用示例：<br />
1．读取Stream<br />
标准代码：<br />
InputStream in = new URL( "http://jakarta.apache.org" ).openStream();<br />
try {<br />
&nbsp;&nbsp; InputStreamReader inR = new InputStreamReader( in );<br />
&nbsp;&nbsp; BufferedReader buf = new BufferedReader( inR );<br />
&nbsp;&nbsp; String line;<br />
&nbsp;&nbsp; while ( ( line = buf.readLine() ) != null ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( line );<br />
&nbsp;&nbsp; }<br />
} finally {<br />
&nbsp;&nbsp; in.close();<br />
}<br />
使用IOUtils<br />
InputStream in = new URL( "http://jakarta.apache.org" ).openStream();<br />
try {<br />
&nbsp;&nbsp; System.out.println( IOUtils.toString( in ) );<br />
} finally {<br />
&nbsp;&nbsp; IOUtils.closeQuietly(in);<br />
}<br />
<br />
2．读取文件<br />
File file = new File("/commons/io/project.properties");<br />
List lines = FileUtils.readLines(file, "UTF-8");<br />
<br />
3．察看剩余空间<br />
long freeSpace = FileSystemUtils.freeSpace("C:/");<br />
<br />
<br />
Commons JXPath<br />
http://jakarta.apache.org/commons/jxpath/<br />
说明：Xpath你知道吧，那么JXpath就是基于Java对象的Xpath，也就是用Xpath对Java对象进行查询。这个东西还是很有想像力的。<br />
使用示例：<br />
Address address = (Address)JXPathContext.newContext(vendor).<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getValue("locations[address/zipCode='90210']/address");<br />
上述代码等同于<br />
Address address = null;<br />
Collection locations = vendor.getLocations();<br />
Iterator it = locations.iterator();<br />
while (it.hasNext()){<br />
&nbsp;&nbsp;&nbsp; Location location = (Location)it.next();<br />
&nbsp;&nbsp;&nbsp; String zipCode = location.getAddress().getZipCode();<br />
&nbsp;&nbsp;&nbsp; if (zipCode.equals("90210")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address = location.getAddress();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
<br />
Commons Lang<br />
http://jakarta.apache.org/commons/lang/<br />
说明：这个工具包可以看成是对java.lang的扩展。提供了诸如StringUtils, StringEscapeUtils, RandomStringUtils, Tokenizer, WordUtils等工具类。<br />
<br />
Commons Logging<br />
http://jakarta.apache.org/commons/logging/<br />
说明：你知道Log4j吗？<br />
<br />
Commons Math<br />
http://jakarta.apache.org/commons/math/<br />
说明：看名字你就应该知道这个包是用来干嘛的了吧。这个包提供的功能有些和Commons Lang重复了，但是这个包更专注于做数学工具，功能更强大。<br />
<br />
Commons Net<br />
http://jakarta.apache.org/commons/net/<br />
说明：这个包还是很实用的，封装了很多网络协议。<br />
1.&nbsp;&nbsp;&nbsp; FTP<br />
2.&nbsp;&nbsp;&nbsp; NNTP<br />
3.&nbsp;&nbsp;&nbsp; SMTP<br />
4.&nbsp;&nbsp;&nbsp; POP3<br />
5.&nbsp;&nbsp;&nbsp; Telnet<br />
6.&nbsp;&nbsp;&nbsp; TFTP<br />
7.&nbsp;&nbsp;&nbsp; Finger<br />
8.&nbsp;&nbsp;&nbsp; Whois<br />
9.&nbsp;&nbsp;&nbsp; rexec/rcmd/rlogin<br />
10.&nbsp;&nbsp;&nbsp; Time (rdate) and Daytime<br />
11.&nbsp;&nbsp;&nbsp; Echo<br />
12.&nbsp;&nbsp;&nbsp; Discard<br />
13.&nbsp;&nbsp;&nbsp; NTP/SNTP<br />
使用示例：<br />
TelnetClient telnet = new TelnetClient();<br />
telnet.connect( "192.168.1.99", 23 );<br />
InputStream in = telnet.getInputStream();<br />
PrintStream out = new PrintStream( telnet.getOutputStream() );<br />
...<br />
telnet.close();<br />
<br />
Commons Validator<br />
http://jakarta.apache.org/commons/validator/<br />
说明：用来帮助进行验证的工具。比如验证Email字符串，日期字符串等是否合法。<br />
使用示例：<br />
// Get the Date validator<br />
DateValidator validator = DateValidator.getInstance();<br />
// Validate/Convert the date<br />
Date fooDate = validator.validate(fooString, "dd/MM/yyyy");<br />
if (fooDate == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; // error...not a valid date<br />
&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
}<br />
<br />
Commons Virtual File System<br />
http://jakarta.apache.org/commons/vfs/<br />
说明：提供对各种资源的访问接口。支持的资源类型包括<br />
1.&nbsp;&nbsp;&nbsp; CIFS <br />
2.&nbsp;&nbsp;&nbsp; FTP <br />
3.&nbsp;&nbsp;&nbsp; Local Files <br />
4.&nbsp;&nbsp;&nbsp; HTTP and HTTPS <br />
5.&nbsp;&nbsp;&nbsp; SFTP <br />
6.&nbsp;&nbsp;&nbsp; Temporary Files <br />
7.&nbsp;&nbsp;&nbsp; WebDAV <br />
8.&nbsp;&nbsp;&nbsp; Zip, Jar and Tar (uncompressed, tgz or tbz2) <br />
9.&nbsp;&nbsp;&nbsp; gzip and bzip2 <br />
10.&nbsp;&nbsp;&nbsp; res <br />
11.&nbsp;&nbsp;&nbsp; ram <br />
这个包的功能很强大，极大的简化了程序对资源的访问。<br />
使用示例：<br />
从jar中读取文件<br />
// Locate the Jar file<br />
FileSystemManager fsManager = VFS.getManager();<br />
FileObject jarFile = fsManager.resolveFile( "jar:lib/aJarFile.jar" );<br />
<br />
// List the children of the Jar file<br />
FileObject[] children = jarFile.getChildren();<br />
System.out.println( "Children of " + jarFile.getName().getURI() );<br />
for ( int i = 0; i &lt; children.length; i++ )<br />
{<br />
&nbsp;&nbsp;&nbsp; System.out.println( children[ i ].getName().getBaseName() );<br />
}<br />
从smb读取文件<br />
StaticUserAuthenticator auth = new StaticUserAuthenticator("username", "password", null);<br />
FileSystemOptions opts = new FileSystemOptions();<br />
DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth); <br />
FileObject fo = VFS.getManager().resolveFile("smb://host/anyshare/dir", opts);</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/310146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-19 23:03 <a href="http://www.blogjava.net/caizh2009/articles/310146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>纯jsp的单个文件上载代码</title><link>http://www.blogjava.net/caizh2009/articles/310132.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 19 Jan 2010 13:27:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/310132.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/310132.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/310132.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/310132.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/310132.html</trackback:ping><description><![CDATA[<p>上传文件选取页面：upload.html</p>
<p>&lt;html&gt; <br />
&lt;head&gt; <br />
&lt;title&gt;文件上传&lt;/title&gt; <br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <br />
&lt;/head&gt; <br />
&lt;body&gt; <br />
&lt;b&gt;文件上传&lt;/b&gt;&lt;/font&gt;&lt;/p&gt; <br />
<br />
&lt;form name="UploadForm" enctype="multipart/form-data" method="post" action="upload.jsp"&gt; <br />
&lt;input type="file" name="File1" size="20" maxlength="20"&gt; &lt;br&gt; <br />
&lt;input type="submit"value="上传"&gt; <br />
&lt;/form&gt; <br />
<br />
&lt;/body&gt; <br />
&lt;/html&gt; <br />
</p>
<p>上传处理：upload.jsp </p>
<p>&lt;%@ page contentType="text/html; charset=GBK" %&gt; <br />
&lt;%@ page import="java.io.*"%&gt; <br />
&lt;%@ page import="java.util.*"%&gt; <br />
&lt;%@ page import="javax.servlet.*"%&gt; <br />
&lt;%@ page import="javax.servlet.http.*"%&gt; <br />
&lt;html&gt; <br />
&lt;head&gt; <br />
&lt;title&gt; upFile &lt;/title&gt; <br />
&lt;/head&gt; <br />
&lt;body bgcolor="#ffffff"&gt; <br />
&lt;center&gt; <br />
&lt;% <br />
//定义上载文件的最大字节 <br />
int MAX_SIZE = 102400 * 102400; <br />
// 创建根路径的保存变量 <br />
String rootPath; </p>
<p>//声明文件读入类 <br />
DataInputStream in = null; <br />
FileOutputStream fileOut = null; <br />
//取得客户端的网络地址 <br />
String remoteAddr = request.getRemoteAddr(); <br />
out.print("request.getRemoteAddr()"+remoteAddr+"&lt;br&gt;"); <br />
//获得服务器的名字 <br />
String serverName = request.getServerName(); <br />
out.print("request.getServerName()="+serverName+"&lt;br&gt;"); <br />
//取得jsp文件相对与根地址的地址 <br />
out.print("request.getServletPath()="+request.getServletPath()+"&lt;br&gt;"); <br />
//取得互联网程序的绝对地址 <br />
String realPath = request.getRealPath(serverName); <br />
out.println("request.getRealPath(serverName)="+realPath+"&lt;br&gt;"); <br />
out.println("OK&lt;br&gt;");<br />
realPath = realPath.substring(0,realPath.lastIndexOf("\\")); <br />
//创建文件的保存目录 <br />
rootPath = realPath + "\\upload\\"; <br />
//out.println(rootPath); <br />
//取得客户端上传的数据类型 <br />
String contentType = request.getContentType(); <br />
//out.println("&lt;p&gt;客户端上传的数据类型 = " + contentType + "&lt;/p&gt;"); <br />
try{ <br />
if(contentType.indexOf("multipart/form-data") &gt;= 0){ <br />
//读入上传的数据 <br />
in = new DataInputStream(request.getInputStream()); <br />
int formDataLength = request.getContentLength(); <br />
if(formDataLength &gt; MAX_SIZE){ <br />
out.println("&lt;P&gt;上传的文件字节数不可以超过" + MAX_SIZE + "&lt;/p&gt;"); <br />
return; <br />
} <br />
//保存上传文件的数据 <br />
byte dataBytes[] = new byte[formDataLength]; <br />
int byteRead = 0; <br />
int totalBytesRead = 0; <br />
//上传的数据保存在byte数组 <br />
while(totalBytesRead &lt; formDataLength){ <br />
byteRead = in.read(dataBytes,totalBytesRead,formDataLength); <br />
totalBytesRead += byteRead; <br />
} <br />
//根据byte数组创建字符串 <br />
String file = new String(dataBytes); <br />
//out.println(file); <br />
//取得上传的数据的文件名 <br />
String saveFile = file.substring(file.indexOf("filename=\"") + 10); <br />
saveFile = saveFile.substring(0,saveFile.indexOf("\n")); <br />
saveFile = saveFile.substring(saveFile.lastIndexOf("\\") + 1,saveFile.indexOf("\"")); <br />
int lastIndex = contentType.lastIndexOf("="); <br />
//取得数据的分隔字符串 <br />
String boundary = contentType.substring(lastIndex + 1,contentType.length()); <br />
//创建保存路径的文件名 <br />
String fileName = rootPath + saveFile; <br />
//out.print(fileName); <br />
int pos; <br />
pos = file.indexOf("filename=\""); <br />
pos = file.indexOf("\n",pos) + 1; <br />
pos = file.indexOf("\n",pos) + 1; <br />
pos = file.indexOf("\n",pos) + 1; <br />
int boundaryLocation = file.indexOf(boundary,pos) - 4; <br />
//out.println(boundaryLocation); <br />
//取得文件数据的开始的位置 <br />
int startPos = ((file.substring(0,pos)).getBytes()).length; <br />
//out.println(startPos); <br />
//取得文件数据的结束的位置 <br />
int endPos = ((file.substring(0,boundaryLocation)).getBytes()).length; <br />
//out.println(endPos); <br />
//检查上载文件是否存在 <br />
File checkFile = new File(fileName); <br />
if(checkFile.exists()){ <br />
out.println("&lt;p&gt;" + saveFile + "文件已经存在.&lt;/p&gt;"); <br />
return;<br />
} <br />
//检查上载文件的目录是否存在 <br />
File fileDir = new File(rootPath); <br />
if(!fileDir.exists()){ <br />
fileDir.mkdirs(); <br />
} <br />
//创建文件的写出类 <br />
fileOut = new FileOutputStream(fileName); <br />
//保存文件的数据 <br />
fileOut.write(dataBytes,startPos,(endPos - startPos)); <br />
fileOut.close(); <br />
out.println("&lt;P&gt;" + saveFile + "文件成功上载.&lt;/p&gt;"); <br />
}else{ <br />
String content = request.getContentType(); <br />
out.println("&lt;p&gt;上传的数据类型不是是multipart/form-data&lt;/p&gt;"); <br />
} <br />
}catch(Exception ex){ <br />
throw new ServletException(ex.getMessage()); <br />
} <br />
%&gt; <br />
&lt;/center&gt; <br />
&lt;/body&gt; <br />
&lt;/html&gt; <br />
</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/310132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-19 21:27 <a href="http://www.blogjava.net/caizh2009/articles/310132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中文问题及最优解决方法</title><link>http://www.blogjava.net/caizh2009/articles/310131.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 19 Jan 2010 13:22:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/310131.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/310131.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/310131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/310131.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/310131.html</trackback:ping><description><![CDATA[由于Java编程中的中文问题是一个老生常谈的问题，在阅读了许多关于Java中文问题解决方法之后，结合作者的编程实践，我发现过去谈的许多方法都不能清晰地说明问题及解决问题，尤其是跨平台时的中文问题。于是我给出此篇文章，内容包括对控制台运行的class、Servelets、JSP及EJB类中的中文问题我剖析和建议解决办法。希望大家指教。&nbsp;&nbsp; <br />
　　Abstract：本文深入分析了Java程序设计中Java编译器对java源文件和JVM对class类文件的编码/解码过程，通过此过程的解析透视出了Java编程中中文问题产生的根本原因，最后给出了建议的最优化的解决Java中文问题的方法。&nbsp;&nbsp; <br />
<br />
　　1、中文问题的来源&nbsp;&nbsp; <br />
<br />
计算机最初的操作系统支持的编码是单字节的字符编码，于是，在计算机中一切处理程序最初都是以单字节编码的英文为准进行处理。随着计算机的发展，为了适应世界其它民族的语言（当然包括我们的汉字），人们提出了UNICODE编码，它采用双字节编码，兼容英文字符和其它民族的双字节字符编码，所以，目前，大多数国际性的软件内部均采用UNICODE编码，在软件运行时，它获得本地支持系统（多数时间是操作系统）默认支持的编码格式，然后再将软件内部的UNICODE转化为本地系统默认支持的格式显示出来。Java的JDK和JVM即是如此，我这里说的JDK是指国际版的JDK，我们大多数程序员使用的是国际化的JDK版本，以下所有的JDK均指国际化的JDK版本。我们的汉字是双字节编码语言，为了能让计算机处理中文，我们自己制定的gb2312、GBK、GBK2K等标准以适应计算机处理的需求。所以，大部分的操作系统为了适应我们处理中文的需求，均定制有中文操作系统，它们采用的是GBK,GB2312编码格式以正确显示我们的汉字。如：中文Win2K默认采用的是GBK编码显示，在中文WIN2k中保存文件时默认采用的保存文件的编码格式也是GBK的，即，所有在中文WIN2K中保存的文件它的内部编码默认均采用GBK编码，注意：GBK是在GB2312基础上扩充来的。&nbsp; <br />
<br />
由于Java语言内部采用UNICODE编码，所以在JAVA程序运行时，就存在着一个从UNICODE编码和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题，这个转换过程有着一系列的步骤，如果其中任何一步出错，则显示出来的汉字就会出是乱码，这就是我们常见的JAVA中文问题。&nbsp; <br />
<br />
同时，Java是一个跨平台的编程语言，也即我们编写的程序不仅能在中文windows上运行，也能在中文Linux等系统上运行，同时也要求能在英文等系统上运行（我们经常看到有人把在中文win2k上编写的JAVA程序，移植到英文Linux上运行）。这种移植操作也会带来中文问题。&nbsp; <br />
<br />
还有，有人使用英文的操作系统和英文的IE等浏览器，来运行带中文字符的程序和浏览中文网页，它们本身就不支持中文，也会带来中文问题。&nbsp; <br />
<br />
几乎所有的浏览器默认在传递参数时都是以UTF-8编码格式来传递，而不是按中文编码传递，所以，传递中文参数时也会有问题，从而带来乱码现象。&nbsp; <br />
<br />
总之，以上几个方面是JAVA中的中文问题的主要来源，我们把以上原因造成的程序不能正确运行而产生的问题称作：JAVA中文问题。&nbsp; <br />
<br />
　　2、JAVA编码转换的详细过程&nbsp;&nbsp; <br />
<br />
我们常见的JAVA程序包括以下类别：&nbsp; <br />
*直接在console上运行的类(包括可视化界面的类)&nbsp; <br />
*JSP代码类（注：JSP是Servlets类的变型）&nbsp; <br />
*Servelets类&nbsp; <br />
*EJB类&nbsp; <br />
*其它不可以直接运行的支持类&nbsp; <br />
<br />
这些类文件中，都有可能含有中文字符串，并且我们常用前三类JAVA程序和用户直接交互，用于输出和输入字符，如：我们在JSP和Servlet中得到客户端送来的字符，这些字符也包括中文字符。无论这些JAVA类的作用如何，这些JAVA程序的生命周期都是这样的：&nbsp; <br />
<br />
*编程人员在一定的操作系统上选择一个合适的编辑软件来实现源程序代码并以.java扩展名保存在操作系统中，例如我们在中文win2k中用记事本编辑一个java源程序；&nbsp; <br />
*编程人员用JDK中的javac.exe来编译这些源代码，形成.class类(JSP文件是由容器调用JDK来编译的)；&nbsp; <br />
*直接运行这些类或将这些类布署到WEB容器中去运行，并输出结果。&nbsp; <br />
那么，在这些过程中，JDK和JVM是如何将这些文件如何编码和解码并运行的呢？&nbsp; <br />
<br />
这里，我们以中文win2k操作系统为例说明JAVA类是如何来编码和被解码的。&nbsp;&nbsp; <br />
<br />
<br />
第一步，我们在中文win2k中用编辑软件如记事本编写一个Java源程序文件(包括以上五类JAVA程序)，程序文件在保存时默认采用了操作系统默认支持GBK编码格式(操作系统默认支持的格式为file.encoding格式)形成了一个.java文件，也即，java程序在被编译前，我们的JAVA源程序文件是采用操作系统默认支持的file.encoding编码格式保存的，java源程序中含有中文信息字符和英文程序代码；要查看系统的file.encoding参数，可以用以下代码：&nbsp; <br />
　　public&nbsp;class&nbsp;ShowSystemDefaultEncoding&nbsp;{&nbsp; <br />
　　public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp; <br />
　　String&nbsp;encoding&nbsp;=&nbsp;System.getProperty("file.encoding");&nbsp; <br />
　　System.out.println(encoding);&nbsp; <br />
　　}}&nbsp; <br />
<br />
第二步，我们用JDK的javac.exe文件编译我们的Java源程序，由于JDK是国际版的，在编译的时候，如果我们没有用-encoding参数指定我们的JAVA源程序的编码格式，则javac.exe首先获得我们操作系统默认采用的编码格式，也即在编译java程序时，若我们不指定源程序文件的编码格式，JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式，如WIN2k，它的值为GBK)，然后JDK就把我们的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放入内存中。然后，javac把转换后的unicode格式的文件进行编译成.class类文件，此时.class文件是UNICODE编码的，它暂放在内存中，紧接着，JDK将此以UNICODE编码的编译后的class文件保存到我们的操作系统中形成我们见到的.class文件。对我们来说，我们最终获得的.class文件是内容以UNICODE编码格式保存的类文件，它内部包含我们源程序中的中文字符串，只不过此时它己经由file.encoding格式转化为UNICODE格式了。&nbsp; <br />
<br />
这一步中，对于JSP源程序文件是不同的，对于JSP，这个过程是这样的：即WEB容器调用JSP编译器，JSP编译器先查看JSP文件中是否设置有文件编码格式，如果JSP文件中没有设置JSP文件的编码格式，则JSP编译器调用JDK先把JSP文件用JVM默认的字符编码格式(也即WEB容器所在的操作系统的默认的file.encoding)转化为临时的Servlet类，然后再把它编译成UNICODE格式的class类，并保存在临时文件夹中。如：在中文win2k上，WEB容器就把JSP文件从GBK编码格式转化为UNICODE格式，然后编译成临时保存的Servlet类，以响应用户的请求。&nbsp; <br />
<br />
第三步，运行第二步编译出来的类，分为三种情况：&nbsp; <br />
<br />
A、&nbsp;直接在console上运行的类&nbsp; <br />
B、&nbsp;EJB类和不可以直接运行的支持类(如JavaBean类)&nbsp; <br />
C、&nbsp;JSP代码和Servlet类&nbsp; <br />
D、&nbsp;JAVA程序和数据库之间&nbsp; <br />
下面我们分这四种情况来看。&nbsp; <br />
A、直接在console上运行的类&nbsp; <br />
<br />
这种情况，运行该类首先需要JVM支持，即操作系统中必须安装有JRE。运行过程是这样的：首先java启动JVM，此时JVM读出操作系统中保存的class文件并把内容读入内存中，此时内存中为UNICODE格式的class类，然后JVM运行它，如果此时此类需要接收用户输入，则类会默认用file.encoding编码格式对用户输入的串进行编码并转化为unicode保存入内存（用户可以设置输入流的编码格式）。程序运行后，产生的字符串（UNICODE编码的）再回交给JVM，最后JRE把此字符串再转化为file.encoding格式(用户可以设置输出流的编码格式)传递给操作系统显示接口并输出到界面上。&nbsp; <br />
<br />
对于这种直接在console上运行的类，它的转化过程可用图1更加明确的表示出来：&nbsp; <br />
<br />
（不好意思，图传不上来，只好让大家自己去想像图的样子了，我想看了上文是可以想来图来的。）&nbsp; <br />
以上每一步的转化都需要正确的编码格式转化，才能最终不出现乱码现象。&nbsp; <br />
<br />
B、EJB类和不可以直接运行的支持类(如JavaBean类)&nbsp; <br />
<br />
由于EJB类和不可以直接运行的支持类，它们一般不与用户直接交互输入和输出，它们常常与其它的类进行交互输入和输出，所以它们在第二步被编译后，就形成了内容是UNICODE编码的类保存在操作系统中了，以后只要它与其它的类之间的交互在参数传递过程中没有丢失，则它就会正确的运行。&nbsp; <br />
这种EJB类和不可以直接运行的支持类,&nbsp;它的转化过程可用图2更加明确的表示出来：&nbsp;&nbsp; <br />
<br />
<br />
图2&nbsp; <br />
（不好意思，图传不上来，只好让大家自己去想像图的样子了，我想看了上文是可以想来图来的。）&nbsp; <br />
C、JSP代码和Servlet类&nbsp; <br />
<br />
经过第二步后，JSP文件也被转化为Servlets类文件，只不过它不像标准的Servlets一校存在于classes目录中，它存在于WEB容器的临时目录中，故这一步中我们也把它做为Servlets来看。&nbsp; <br />
<br />
对于Servlets，客户端请求它时，WEB容器调用它的JVM来运行Servlet，首先，JVM把Servlet的class类从系统中读出并装入内存中，内存中是以UNICODE编码的Servlet类的代码，然后JVM在内存中运行该Servlet类，如果Servlet在运行的过程中，需要接受从客户端传来的字符如：表单输入的值和URL中传入的值，此时如果程序中没有设定接受参数时采用的编码格式，则WEB容器会默认采用ISO-8859-1编码格式来接受传入的值并在JVM中转化为UNICODE格式的保存在WEB容器的内存中。Servlet运行后生成输出，输出的字符串是UNICODE格式的，紧接着，容器将Servlet运行产生的UNICODE格式的串（如html语法，用户输出的串等）直接发送到客户端浏览器上并输出给用户，如果此时指定了发送时输出的编码格式，则按指定的编码格式输出到浏览器上，如果没有指定，则默认按ISO-8859-1编码发送到客户的浏览器上。这种JSP代码和Servlet类，它的转化过程可用图3更加明确地表示出来：&nbsp; <br />
<br />
（不好意思，图传不上来，只好让大家自己去想像图的样子了，我想看了上文是可以想来图来的。）&nbsp; <br />
D、Java程序和数据库之间&nbsp;&nbsp; <br />
<br />
<br />
对于几乎所有数据库的JDBC驱动程序，默认的在JAVA程序和数据库之间传递数据都是以ISO-8859-1为默认编码格式的，所以，我们的程序在向数据库内存储包含中文的数据时，JDBC首先是把程序内部的UNICODE编码格式的数据转化为ISO-8859-1的格式，然后传递到数据库中，在数据库保存数据时，它默认即以ISO-8859-1保存，所以，这是为什么我们常常在数据库中读出的中文数据是乱码。&nbsp; <br />
对于JAVA程序和数据库之间的数据传递，我们可以用图4清晰地表示出来&nbsp; <br />
<br />
图4（不好意思，图传不上来，只好让大家自己去想像图的样子了，我想看了上文是可以想来图来的。）&nbsp; <br />
<br />
3、分析常见的JAVA中文问题几个必须清楚的原则&nbsp; <br />
<br />
首先，经过上面的详细分析，我们可以清晰地看到，任何JAVA程序的生命期中，其编码转换的关键过程是在于：最初编译成class文件的转码和最终向用户输出的转码过程。&nbsp; <br />
其次，我们必须了解JAVA在编译时支持的、常用的编码格式有以下几种：&nbsp; <br />
*ISO-8859-1，8-bit,&nbsp;同8859_1,ISO-8859-1,ISO_8859_1等编码&nbsp; <br />
*Cp1252，美国英语编码，同ANSI标准编码&nbsp; <br />
*UTF-8，同unicode编码&nbsp; <br />
*GB2312，同gb2312-80,gb2312-1980等编码&nbsp; <br />
*GBK&nbsp;,&nbsp;同MS936，它是gb2312的扩充&nbsp; <br />
及其它的编码，如韩文、日文、繁体中文等。同时，我们要注意这些编码间的兼容关体系如下：&nbsp; <br />
unicode和UTF-8编码是一一对应的关系。GB2312可以认为是GBK的子集，即GBK编码是在gb2312上扩展来的。同时，GBK编码包含了20902个汉字，编码范围为：0x8140-0xfefe，所有的字符可以一一对应到UNICODE2.0中来。&nbsp; <br />
<br />
再次，对于放在操作系统中的.java源程序文件，在编译时，我们可以指定它内容的编码格式，具体来说用-encoding来指定。注意：如果源程序中含有中文字符，而你用-encoding指定为其它的编码字符，显然是要出错的。用-encoding指定源文件的编码方式为GBK或gb2312，无论我们在什么系统上编译含有中文字符的JAVA源程序都不会有问题，它都会正确地将中文转化为UNICODE存储在class文件中。&nbsp; <br />
<br />
然后，我们必须清楚，几乎所有的WEB容器在其内部默认的字符编码格式都是以ISO-8859-1为默认值的，同时，几乎所有的浏览器在传递参数时都是默认以UTF-8的方式来传递参数的。所以，虽然我们的Java源文件在出入口的地方指定了正确的编码方式，但其在容器内部运行时还是以ISO-8859-1来处理的。&nbsp; <br />
<br />
4、中文问题的分类及其建议最优解决办法&nbsp; <br />
<br />
了解以上JAVA处理文件的原理之后，我们就可以提出了一套建议最优的解决汉字问题的办法。&nbsp; <br />
我们的目标是：我们在中文系统中编辑的含有中文字符串或进行中文处理的JAVA源程序经编译后可以移值到任何其它的操作系统中正确运行，或拿到其它操作系统中编译后能正确运行，能正确地传递中文和英文参数，能正确地和数据库交流中英文字符串。&nbsp; <br />
我们的具体思路是：在JAVA程序转码的入口和出口及JAVA程序同用户有输入输出转换的地方限制编码方法使之正确即可。&nbsp; <br />
<br />
具体解决办法如下：&nbsp; <br />
<br />
1、&nbsp;针对直接在console上运行的类&nbsp; <br />
对于这种情况，我们建议在程序编写时，如果需要从用户端接收用户的可能含有中文的输入或含有中文的输出，程序中应该采用字符流来处理输入和输出，具体来说，应用以下面向字符型节点流类型：&nbsp; <br />
对文件：FileReader，FileWrieter&nbsp;&nbsp; <br />
其字节型节点流类型为：FileInputStream，FileOutputStream&nbsp; <br />
对内存（数组）：CharArrayReader，CharArrayWriter&nbsp; <br />
其字节型节点流类型为：ByteArrayInputStream，ByteArrayOutputStream&nbsp; <br />
对内存（字符串）：StringReader，StringWriter&nbsp; <br />
对管道：PipedReader，PipedWriter&nbsp; <br />
其字节型节点流类型为：PipedInputStream，PipedOutputStream&nbsp; <br />
同时，应该用以下面向字符型处理流来处理输入和输出：&nbsp; <br />
BufferedWriter，BufferedReader&nbsp; <br />
其字节型的处理流为：BufferedInputeStream，BufferedOutputStream&nbsp; <br />
InputStreamReader，OutputStreamWriter&nbsp; <br />
其字节型的处理流为：DataInputStream，DataOutputStream&nbsp; <br />
其中InputStreamReader和InputStreamWriter用于将字节流按照指定的字符编码集转换到字符流，如：&nbsp; <br />
InputStreamReader&nbsp;in&nbsp;=&nbsp;new&nbsp;InputStreamReader(System.in，"GB2312")；&nbsp; <br />
OutputStreamWriter&nbsp;out&nbsp;=&nbsp;new&nbsp;OutputStreamWriter&nbsp;(System.out，"GB2312")；&nbsp; <br />
例如：采用如下的示例JAVA编码就达到了要求：&nbsp; <br />
<br />
//Read.java&nbsp; <br />
import&nbsp;java.io.*;&nbsp; <br />
public&nbsp;class&nbsp;Read&nbsp;{&nbsp; <br />
public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;IOException&nbsp;{&nbsp; <br />
String&nbsp;str&nbsp;=&nbsp;"\n中文测试，这是内部硬编码的串"+"\ntest&nbsp;english&nbsp;character";&nbsp; <br />
String&nbsp;strin=&nbsp;"";&nbsp; <br />
BufferedReader&nbsp;stdin&nbsp;=&nbsp;new&nbsp;BufferedReader(new&nbsp;InputStreamReader(System.in,"gb2312"));&nbsp;//设置输入接口按中文编码&nbsp; <br />
BufferedWriter&nbsp;stdout&nbsp;=&nbsp;new&nbsp;BufferedWriter(new&nbsp;OutputStreamWriter(System.out,"gb2312"));&nbsp;//设置输出接口按中文编码&nbsp; <br />
stdout.write("请输入:");&nbsp; <br />
stdout.flush();&nbsp; <br />
strin&nbsp;=&nbsp;stdin.readLine();&nbsp; <br />
stdout.write("这是从用户输入的串："+strin);&nbsp; <br />
stdout.write(str);&nbsp; <br />
stdout.flush();&nbsp; <br />
}}&nbsp; <br />
同时，在编译程序时，我们用以下方式来进行：&nbsp; <br />
javac&nbsp;-encoding&nbsp;gb2312&nbsp;Read.java&nbsp; <br />
其运行结果如图5所示：&nbsp; <br />
<br />
<br />
<br />
<br />
图5（不好意思，图传不上来，只好让大家自己去想像图的样子了，我想看了上文是可以想来图来的。）&nbsp; <br />
<br />
2、&nbsp;针对EJB类和不可以直接运行的支持类(如JavaBean类)&nbsp; <br />
<br />
由于这种类它们本身被其它的类调用，不直接与用户交互，故对这种类来说，我们的建议的处理方式是内部程序中应该采用字符流来处理程序内部的中文字符串（具体如上面一节中一样），同时，在编译类时用-encoding&nbsp;gb2312参数指示源文件是中文格式编码的即可。&nbsp; <br />
<br />
<br />
3、&nbsp;针对Servlet类&nbsp; <br />
<br />
针对Servlet，我们建议用以下方法：&nbsp; <br />
<br />
在编译Servlet类的源程序时，用-encoding指定编码为GBK或GB2312，且在向用户输出时的编码部分用response对象的setContentType("text/html;charset=GBK");或gb2312来设置输出编码格式，同样在接收用户输入时，我们用request.setCharacterEncoding("GB2312")；这样无论我们的servlet类移植到什么操作系统中，只有客户端的浏览器支持中文显示，就可以正确显示。如下是一个正确的示例：&nbsp; <br />
<br />
//HelloWorld.java&nbsp; <br />
package&nbsp;hello;&nbsp; <br />
import&nbsp;java.io.*;&nbsp; <br />
import&nbsp;javax.servlet.*;&nbsp; <br />
import&nbsp;javax.servlet.http.*;&nbsp; <br />
public&nbsp;class&nbsp;HelloWorld&nbsp;extends&nbsp;HttpServlet&nbsp; <br />
{&nbsp; <br />
public&nbsp;void&nbsp;init()&nbsp;throws&nbsp;ServletException&nbsp;{&nbsp;}&nbsp; <br />
public&nbsp;void&nbsp;doGet(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;throws&nbsp;IOException,&nbsp;ServletException&nbsp; <br />
{&nbsp; <br />
request.setCharacterEncoding("GB2312");&nbsp;//设置输入编码格式&nbsp; <br />
response.setContentType("text/html;charset=GB2312");&nbsp;//设置输出编码格式&nbsp; <br />
PrintWriter&nbsp;out&nbsp;=&nbsp;response.getWriter();&nbsp;//建议使用PrintWriter输出&nbsp; <br />
out.println("&lt;hr&gt;");&nbsp; <br />
out.println("Hello&nbsp;World!&nbsp;This&nbsp;is&nbsp;created&nbsp;by&nbsp;Servlet!测试中文!");&nbsp; <br />
out.println("&lt;hr&gt;");&nbsp; <br />
}&nbsp; <br />
public&nbsp;void&nbsp;doPost(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;throws&nbsp;IOException,&nbsp;ServletException&nbsp; <br />
{&nbsp; <br />
request.setCharacterEncoding("GB2312");&nbsp;//设置输入编码格式&nbsp; <br />
response.setContentType("text/html;charset=GB2312");&nbsp;//设置输出编码格式&nbsp; <br />
String&nbsp;name&nbsp;=&nbsp;request.getParameter("name");&nbsp; <br />
String&nbsp;id&nbsp;=&nbsp;request.getParameter("id");&nbsp; <br />
if(name==null)&nbsp;name="";&nbsp; <br />
if(id==null)&nbsp;id="";&nbsp; <br />
PrintWriter&nbsp;out&nbsp;=&nbsp;response.getWriter();&nbsp;//建议使用PrintWriter输出&nbsp; <br />
out.println("&lt;hr&gt;");&nbsp; <br />
out.println("你传入的中文字串是："&nbsp;+&nbsp;name);&nbsp; <br />
out.println("&lt;hr&gt;你输入的id是："&nbsp;+&nbsp;id);&nbsp; <br />
out.println("&lt;hr&gt;");&nbsp; <br />
}&nbsp; <br />
public&nbsp;void&nbsp;destroy()&nbsp;{&nbsp;}&nbsp; <br />
}&nbsp; <br />
请用javac&nbsp;-encoding&nbsp;gb2312&nbsp;HelloWorld.java来编译此程序。&nbsp; <br />
测试此Servlet的程序如下所示：&nbsp; <br />
&lt;%@page&nbsp;contentType="text/html;&nbsp;charset=gb2312"%&gt;&nbsp; <br />
&lt;%request.setCharacterEncoding("GB2312");%&gt;&nbsp; <br />
&lt;html&gt;&lt;head&gt;&lt;title&gt;&lt;/title&gt;&nbsp; <br />
&lt;Script&nbsp;language="JavaScript"&gt;&nbsp; <br />
function&nbsp;Submit()&nbsp;{&nbsp; <br />
//通过URL传递中文字符串值给Servlet&nbsp; <br />
document.base.action&nbsp;=&nbsp;"./HelloWorld?name=中文";&nbsp; <br />
document.base.method&nbsp;=&nbsp;"POST";&nbsp; <br />
document.base.submit();&nbsp; <br />
}&nbsp; <br />
&lt;/Script&gt;&nbsp; <br />
&lt;/head&gt;&nbsp; <br />
<br />
&lt;body&nbsp;bgcolor="#FFFFFF"&nbsp;text="#000000"&nbsp;topmargin="5"&gt;&nbsp; <br />
&lt;form&nbsp;name="base"&nbsp;method&nbsp;=&nbsp;"POST"&nbsp;target="_self"&gt;&nbsp; <br />
&lt;input&nbsp;name="id"&nbsp;type="text"&nbsp;value=""&nbsp;size="30"&gt;&nbsp; <br />
&lt;a&nbsp;href&nbsp;=&nbsp;"JavaScript:Submit()"&gt;传给Servlet&lt;/a&gt;&nbsp; <br />
&lt;/form&gt;&lt;/body&gt;&lt;/html&gt;&nbsp; <br />
其运行结果如图6所示：&nbsp; <br />
<br />
<br />
<br />
<br />
图6（不好意思，图传不上来，只好让大家自己去想像图的样子了，我想看了上文是可以想来图来的。）&nbsp; <br />
<br />
4、&nbsp;JAVA程序和数据库之间&nbsp; <br />
<br />
为避免JAVA程序和数据库之间数据传递出现乱码现象，我们建议采用以下最优方法来处理：&nbsp; <br />
1、&nbsp;对于JAVA程序的处理方法按我们指定的方法处理。&nbsp; <br />
2、&nbsp;把数据库默认支持的编码格式改为GBK或GB2312的。&nbsp; <br />
<br />
如：在mysql中，我们可以在配置文件my.ini中加入以下语句实现：&nbsp; <br />
在[mysqld]区增加：&nbsp; <br />
default-character-set=gbk&nbsp; <br />
并增加：&nbsp; <br />
[client]&nbsp; <br />
default-character-set=gbk&nbsp; <br />
在SQL&nbsp;Server2K中，我们可以将数据库默认的语言设置为Simplified&nbsp;Chinese来达到目的。&nbsp; <br />
<br />
5、&nbsp;针对JSP代码&nbsp; <br />
<br />
由于JSP是在运行时，由WEB容器进行动态编译的，如果我们没有指定JSP源文件的编码格式，则JSP编译器会获得服务器操作系统的file.encoding值来对JSP文件编译的，它在移植时最容易出问题，如在中文win2k中可以很好运行的jsp文件拿到英文linux中就不行，尽管客户端都是一样的，那是因为容器在编译JSP文件时获取的操作系统的编码不同造成的（在中文wink中的file.encoding和在英文Linux中file.encoding是不同的，且英文Linux的file.encoding对中文不支持，所以编译出来的JSP类就会有问题）。网络上讨论的大多数是此类问题，多是因为JSP文件移植平台时不能正确显示的问题，对于这类问题，我们了解了JAVA中程序编码转换的原理，解决起来就容易多了。我们建议的解决办法如下：&nbsp; <br />
<br />
1、我们要保证JSP向客户端输出时是采用中文编码方式输出的，即无论如何我们首先在我们的JSP源代编中加入以下一行：&nbsp; <br />
<br />
&lt;%@page&nbsp;contentType="text/html;&nbsp;charset=gb2312"%&gt;&nbsp; <br />
2、为了让JSP能正确获得传入的参数，我们在JSP源文件头加入下面一句：&nbsp; <br />
&lt;%request.setCharacterEncoding("GB2312");%&gt;&nbsp; <br />
3、为了让JSP编译器能正确地解码我们的含有中文字符的JSP文件，我们需要在JSP源文件中指定我们的JSP源文件的编码格式，具体来说，我们在JSP源文件头上加入下面的一句即可：&nbsp; <br />
&lt;%@page&nbsp;pageEncoding="GB2312"%&gt;或&lt;%@page&nbsp;pageEncoding="GBK"%&gt;&nbsp; <br />
这是JSP规范2.0新增加的指令。&nbsp; <br />
我们建议使用此方法来解JSP文件中的中文问题，下面的代码是一个正确做法的JSP文件的测试程序：&nbsp; <br />
<br />
//testchinese.jsp&nbsp; <br />
&lt;%@page&nbsp;pageEncoding="GB2312"%&gt;&nbsp; <br />
&lt;%@page&nbsp;contentType="text/html;&nbsp;charset=gb2312"%&gt;&nbsp; <br />
&lt;%request.setCharacterEncoding("GB2312");%&gt;&nbsp; <br />
&lt;%&nbsp; <br />
String&nbsp;action&nbsp;=&nbsp;request.getParameter("ACTION");&nbsp; <br />
String&nbsp;name&nbsp;=&nbsp;"";&nbsp; <br />
String&nbsp;str&nbsp;=&nbsp;"";&nbsp; <br />
if(action!=null&nbsp;&amp;&amp;&nbsp;action.equals("SENT"))&nbsp; <br />
{&nbsp; <br />
name&nbsp;=&nbsp;request.getParameter("name");&nbsp; <br />
str&nbsp;=&nbsp;request.getParameter("str");&nbsp; <br />
}&nbsp; <br />
%&gt;&nbsp; <br />
&lt;html&gt;&nbsp; <br />
&lt;head&gt;&nbsp; <br />
&lt;title&gt;&lt;/title&gt;&nbsp; <br />
&lt;Script&nbsp;language="JavaScript"&gt;&nbsp; <br />
function&nbsp;Submit()&nbsp; <br />
{&nbsp; <br />
document.base.action&nbsp;=&nbsp;"?ACTION=SENT&amp;str=传入的中文";&nbsp; <br />
document.base.method&nbsp;=&nbsp;"POST";&nbsp; <br />
document.base.submit();&nbsp; <br />
}&nbsp; <br />
&lt;/Script&gt;&nbsp; <br />
&lt;/head&gt;&nbsp; <br />
&lt;body&nbsp;bgcolor="#FFFFFF"&nbsp;text="#000000"&nbsp;topmargin="5"&gt;&nbsp; <br />
&lt;form&nbsp;name="base"&nbsp;method&nbsp;=&nbsp;"POST"&nbsp;target="_self"&gt;&nbsp; <br />
&lt;input&nbsp;type="text"&nbsp;name="name"&nbsp;value=""&nbsp;size="30"&gt;&nbsp; <br />
&lt;a&nbsp;href&nbsp;=&nbsp;"JavaScript:Submit()"&gt;提交&lt;/a&gt;&nbsp; <br />
&lt;/form&gt;&nbsp; <br />
&lt;%&nbsp; <br />
if(action!=null&nbsp;&amp;&amp;&nbsp;action.equals("SENT"))&nbsp; <br />
{&nbsp; <br />
out.println("&lt;br&gt;你输入的字符为："+name);&nbsp; <br />
out.println("&lt;br&gt;你通过URL传入的字符为："+str);&nbsp; <br />
}&nbsp; <br />
%&gt;&nbsp; <br />
&lt;/body&gt;&nbsp; <br />
&lt;/html&gt;&nbsp; <br />
如图7是此程序运行的结果示意图：&nbsp; <br />
<br />
<br />
<br />
<br />
图7（不好意思，图传不上来，只好让大家自己去想像图的样子了，我想看了上文是可以想来图来的。）&nbsp; <br />
<br />
<br />
5、总结&nbsp; <br />
<br />
在上面的详细分析中，我们清晰地给出了JAVA在处理源程序过程中的详细转换过程，为我们正确解决JAVA编程中的中文问题提供了基础。同时，我们给出了认为是最优的解决JAVA中文问题的办法。&nbsp; 
<img src ="http://www.blogjava.net/caizh2009/aggbug/310131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-19 21:22 <a href="http://www.blogjava.net/caizh2009/articles/310131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件上传原理简单实现</title><link>http://www.blogjava.net/caizh2009/articles/310118.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 19 Jan 2010 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/310118.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/310118.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/310118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/310118.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/310118.html</trackback:ping><description><![CDATA[<div height="600">要实现文件上载，我们必须先了解上载文件的HTTP请求。下面这个简单的应用示范了如何上载文件以及把HTTP请求的原始数据写入文件。用文本编辑器查看该文件即可了解请求的格式，在此基础上我们就可以提取出上载文件的名字、文件内容以及原本混合在一起的其他信息。&nbsp;<br />
<br />
在这里我们写一个简单的html页面up.html,提供一个表单，用户从这里选择文件并把文件上载到服务器。&nbsp;<br />
<br />
&lt;html&gt;&nbsp;<br />
<br />
&lt;head&gt;&nbsp;<br />
<br />
&lt;title&gt;文件上载&lt;/title&gt;&nbsp;<br />
<br />
&lt;/head&gt;&nbsp;<br />
<br />
&lt;body&gt;&nbsp;<br />
<br />
&lt;form&nbsp;action="upjsp.jsp"&nbsp;enctype="MULTIPART/FORM-DATA"&nbsp;method=post&gt;&nbsp;<br />
<br />
&lt;br&nbsp;/&gt;&nbsp;<br />
<br />
公司:&nbsp;&lt;input&nbsp;type="text"&nbsp;name="company"&nbsp;/&gt;&nbsp;<br />
<br />
&lt;br&nbsp;/&gt;&nbsp;<br />
<br />
选择要上载的文件&nbsp;&lt;input&nbsp;type="file"&nbsp;name="filename"&nbsp;/&gt;&nbsp;<br />
<br />
&lt;br&nbsp;/&gt;&nbsp;<br />
<br />
&lt;input&nbsp;type="submit"&nbsp;value="上载"&nbsp;/&gt;&nbsp;<br />
<br />
&lt;/form&gt;&nbsp;<br />
<br />
&lt;/body&gt;&nbsp;<br />
<br />
&lt;/html&gt;&nbsp;<br />
<br />
注意，&lt;form&gt;标记有一个enctype属性，属性值是"MULTIPART/FORM-DATA"。还有个type为file的输入框是用来选择上传文件的。&nbsp;<br />
<br />
表单的action属性值是upjsp.jsp，这是将请求发送给upjsp.jsp文件。upjsp.jsp调用了名为UpBean的JavaBean。&nbsp;<br />
<br />
程序如下：&nbsp;<br />
<br />
&lt;jsp:useBean&nbsp;id="TheBean"&nbsp;scope="page"&nbsp;class="UpBean&nbsp;"&nbsp;/&gt;&nbsp;<br />
<br />
&lt;%&nbsp;<br />
<br />
TheBean.doUpload(request);&nbsp;<br />
<br />
%&gt;&nbsp;<br />
<br />
<br />
<br />
　　下面是UpBean的实现代码：&nbsp;<br />
<br />
import&nbsp;java.io.*;&nbsp;<br />
<br />
import&nbsp;javax.servlet.http.HttpServletRequest;&nbsp;<br />
<br />
import&nbsp;javax.servlet.http.HttpServletResponse;&nbsp;<br />
<br />
import&nbsp;javax.servlet.ServletInputStream;&nbsp;<br />
<br />
<br />
<br />
public&nbsp;class&nbsp;UpBean&nbsp;{&nbsp;<br />
<br />
<br />
<br />
public&nbsp;void&nbsp;doUpload(HttpServletRequest&nbsp;request)&nbsp;throws&nbsp;<br />
<br />
IOException&nbsp;{&nbsp;<br />
<br />
PrintWriter&nbsp;pw&nbsp;=&nbsp;new&nbsp;PrintWriter(&nbsp;<br />
<br />
new&nbsp;BufferedWriter(new&nbsp;FileWriter("test.txt")));&nbsp;<br />
<br />
ServletInputStream&nbsp;in&nbsp;=&nbsp;request.getInputStream();&nbsp;<br />
<br />
<br />
<br />
int&nbsp;i&nbsp;=&nbsp;in.read();&nbsp;<br />
<br />
while&nbsp;(i&nbsp;!=&nbsp;-1)&nbsp;{&nbsp;<br />
<br />
pw.print((char)&nbsp;i);&nbsp;<br />
<br />
i&nbsp;=&nbsp;in.read();&nbsp;<br />
<br />
}&nbsp;<br />
<br />
pw.close();&nbsp;<br />
<br />
}&nbsp;<br />
<br />
}&nbsp;<br />
<br />
这个JavaBean把HttpServletRequest对象的表单原始数据写入test.txt文件.&nbsp;<br />
<br />
选择上传一个文本或者网页文件。点击&#8220;上载&#8221;按钮之后，表单就发送给了upjsp.jsp文件，一起发送的还有上传的文件。upjsp.jsp文件不会向浏览器发送任何应答内容，但它会生成一个test.txt文件。打开test.txt文件，我们可以看到上传文件的内容和一些上传的信息了。&nbsp;<br />
null </div>
<img src ="http://www.blogjava.net/caizh2009/aggbug/310118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-19 17:33 <a href="http://www.blogjava.net/caizh2009/articles/310118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在jsp/servlet中断点/多线程下载文件 </title><link>http://www.blogjava.net/caizh2009/articles/310116.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 19 Jan 2010 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/310116.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/310116.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/310116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/310116.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/310116.html</trackback:ping><description><![CDATA[<p>&lt;%@ page import="java.io.File" %&gt;<br />
&lt;%@ page import="java.io.IOException" %&gt;<br />
&lt;%@ page import="java.io.OutputStream" %&gt;<br />
&lt;%@ page import="java.io.RandomAccessFile" %&gt;<br />
&lt;%!<br />
&nbsp;&nbsp;&nbsp; public void downloadFile(HttpServletRequest request, HttpServletResponse response, File file) throws IOException {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RandomAccessFile raf = new RandomAccessFile(file, "r");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.io.FileInputStream fis = new java.io.FileInputStream(raf.getFD());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setHeader("Server", "www.trydone.com");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setHeader("Accept-Ranges", "bytes");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long pos = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long len;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; len = raf.length();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (request.getHeader("Range") != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = Long.parseLong(request.getHeader("Range")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .replaceAll("bytes=", "")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .replaceAll("-", "")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setHeader("Content-Length", Long.toString(len - pos));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pos != 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setHeader("Content-Range", new StringBuffer()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append("bytes ")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append(pos)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append("-")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append(Long.toString(len - 1))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append("/")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append(len)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .toString()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType("application/octet-stream");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setHeader("Content-Disposition", new StringBuffer()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append("attachment;filename=\"")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append(file.getName())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append("\"").toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raf.seek(pos);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] b = new byte[2048];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputStream outs = response.getOutputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((i = raf.read(b)) != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outs.write(b, 0, i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raf.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fis.close();<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>%&gt;<br />
&lt;%<br />
&nbsp;&nbsp;&nbsp; String filePath = request.getParameter("file");<br />
&nbsp;&nbsp;&nbsp; filePath = application.getRealPath(filePath);<br />
&nbsp;&nbsp;&nbsp; File file = new File(filePath);<br />
&nbsp;&nbsp;&nbsp; downloadFile(request, response, file);<br />
%&gt;</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/310116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-19 17:28 <a href="http://www.blogjava.net/caizh2009/articles/310116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>response.setContentType 的参数说明</title><link>http://www.blogjava.net/caizh2009/articles/310114.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 19 Jan 2010 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/310114.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/310114.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/310114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/310114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/310114.html</trackback:ping><description><![CDATA[<p>image/bmp BMP<br />
image/gif GIF<br />
image/jpeg JPEG<br />
image/tiff TIFF<br />
image/x-dcx DCX<br />
image/x-pcx PCX<br />
text/html HTML<br />
text/plain TXT<br />
text/xml XML<br />
application/afp AFP<br />
application/pdf PDF<br />
application/rtf RTF<br />
application/msword MSWORD<br />
application/vnd.ms-excel MSEXCEL<br />
application/vnd.ms-powerpoint MSPOWERPOINT<br />
application/wordperfect5.1 WORDPERFECT<br />
application/vnd.lotus-wordpro WORDPRO<br />
application/vnd.visio VISIO<br />
application/vnd.framemaker FRAMEMAKER<br />
application/vnd.lotus-1-2-3 LOTUS123<br />
application/octet-stream 信息流</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/310114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-19 17:25 <a href="http://www.blogjava.net/caizh2009/articles/310114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java runtime.exec() 的编写 </title><link>http://www.blogjava.net/caizh2009/articles/310069.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 19 Jan 2010 05:50:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/310069.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/310069.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/310069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/310069.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/310069.html</trackback:ping><description><![CDATA[<p><font size="2">那就首先说点Runtime类吧，他是一个与JVM运行时环境有关的类，这个类是Singleton的。我说几个自己觉得重要的地方。</font></p>
<p><font size="2">1、Runtime.getRuntime()可以取得当前JVM的运行时环境，这也是在Java中唯一一个得到运行时环境的方法。</font></p>
<p><font size="2">2、Runtime上其他大部分的方法都是实例方法，也就是说每次进行运行时调用时都要用到getRuntime方法。</font></p>
<p><font size="2">3、Runtime中的exit方法是退出当前JVM的方法，估计也是唯一的一个吧，因为我看到System类中的exit实际上也是通过调用Runtime.exit()来退出JVM的，这里说明一下Java对Runtime返回值的一般规则（后边也提到了），0代表正常退出，非0代表异常中止，这只是Java的规则，在各个操作系统中总会发生一些小的混淆。</font></p>
<br />
<p><font size="2">4、Runtime.addShutdownHook()方法可以注册一个hook在JVM执行shutdown的过程中，方法的参数只要是一个初始化过但是没有执行的Thread实例就可以。（注意，Java中的Thread都是执行过了就不值钱的哦）</font></p>
<p><font size="2">5、说到addShutdownHook这个方法就要说一下JVM运行环境是在什么情况下shutdown或者abort的。文档上是这样写的，当最后一个非精灵进程退出或者收到了一个用户中断信号、用户登出、系统shutdown、Runtime的exit方法被调用时JVM会启动shutdown的过程，在这个过程开始后，他会并行启动所有登记的shutdown hook（注意是并行启动，这就需要线程安全和防止死锁）。当shutdown过程启动后，只有通过调用halt方法才能中止shutdown的过程并退出JVM。</font></p>
<p><font size="2">那什么时候JVM会abort退出那？首先说明一下，abort退出时JVM就是停止运行但并不一定进行shutdown。这只有JVM在遇到SIGKILL信号或者windows中止进程的信号、本地方法发生类似于访问非法地址一类的内部错误时会出现。这种情况下并不能保证shutdown hook是否被执行。</font></p>
<p><br />
<font size="2">现在开始看这篇文章，呵呵。</font></p>
<p><br />
<font size="2">首先讲的是Runtime.exec()方法的所有重载。这里要注意的有一点，就是public Process exec(String [] cmdArray, String [] envp);这个方法中cmdArray是一个执行的命令和参数的字符串数组，数组的第一个元素是要执行的命令往后依次都是命令的参数，envp我个人感觉应该和C中的execve中的环境变量是一样的，envp中使用的是name=value的方式。</font></p>
<p><br />
<font size="2">&lt;!--[if !supportLists]--&gt;1、 &lt;!--[endif]--&gt;一个很糟糕的调用程序，代码如下，这个程序用exec调用了一个外部命令之后马上使用exitValue就对其返回值进行检查，让我们看看会出现什么问题。</font></p>
<p><br />
<font size="2">import java.util.*;<br />
import java.io.*;</font></p>
<p><font size="2">public class BadExecJavac<br />
{<br />
public static void main(String args[])<br />
{<br />
try<br />
{ <br />
Runtime rt = Runtime.getRuntime();<br />
Process proc = rt.exec("javac");<br />
int exitVal = proc.exitValue();<br />
System.out.println("Process exitValue: " + exitVal);<br />
} catch (Throwable t)<br />
{<br />
t.printStackTrace();<br />
}<br />
}<br />
}</font></p>
<p><font size="2">A run of BadExecJavac produces: </font></p>
<p><br />
<font size="2">E:classescomjavaworldjpitfallsarticle2&gt;java BadExecJavac<br />
java.lang.IllegalThreadStateException: process has not exited<br />
at java.lang.Win32Process.exitValue(Native Method)<br />
at BadExecJavac.main(BadExecJavac.java:13)</font></p>
<p><br />
<font size="2">这里看原文就可以了解，这里主要的问题就是错误的调用了exitValue来取得外部命令的返回值（呵呵，这个错误我也曾经犯过），因为exitValue这个方法是不阻塞的，程序在调用这个方法时外部命令并没有返回所以造成了异常的出现，这里是由另外的方法来等待外部命令执行完毕的，就是waitFor方法，这个方法会一直阻塞直到外部命令执行结束，然后返回外部命令执行的结果，作者在这里一顿批评设计者的思路有问题，呵呵，反正我是无所谓阿，能用就可以拉。但是作者在这里有一个说明，就是exitValue也是有好多用途的。因为当你在一个Process上调用waitFor方法时，当前线程是阻塞的，如果外部命令无法执行结束，那么你的线程就会一直阻塞下去，这种意外会影响我们程序的执行。所以在我们不能判断外部命令什么时候执行完毕而我们的程序还需要继续执行的情况下，我们就应该循环的使用exitValue来取得外部命令的返回状态，并在外部命令返回时作出相应的处理。</font></p>
<p><br />
<font size="2">2、对exitValue处改进了的程序</font></p>
<p><font size="2">import java.util.*;<br />
import java.io.*;</font></p>
<p><font size="2">public class BadExecJavac2<br />
{<br />
public static void main(String args[])<br />
{<br />
try<br />
{ <br />
Runtime rt = Runtime.getRuntime();<br />
Process proc = rt.exec("javac");<br />
int exitVal = proc.waitFor();<br />
System.out.println("Process exitValue: " + exitVal);<br />
} catch (Throwable t)<br />
{<br />
t.printStackTrace();<br />
}<br />
}<br />
}</font></p>
<p><font size="2">不幸的是，这个程序也无法执行完成，它没有输出但却一直悬在那里，这是为什么那？</font></p>
<p><br />
<font size="2">JDK文档中对此有如此的解释：因为本地的系统对标准输入和输出所提供的缓冲池有效，所以错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程的锁，甚至死锁。</font></p>
<p><br />
<font size="2">文档引述完了，作者又开始批评了，他说JDK仅仅说明为什么问题会发生，却并没有说明这个问题怎么解决，这的确是个问题哈。紧接着作者说出自己的做法，就是在执行完外部命令后我们要控制好Process的所有输入和输出（视情况而定），在这个例子里边因为调用的是Javac，而他在没有参数的情况下会将提示信息输出到标准出错，所以在下面的程序中我们要对此进行处理。</font></p>
<p><br />
<font size="2">import java.util.*;<br />
import java.io.*;</font></p>
<p><font size="2">public class MediocreExecJavac<br />
{<br />
public static void main(String args[])<br />
{<br />
try<br />
{ <br />
Runtime rt = Runtime.getRuntime();<br />
Process proc = rt.exec("javac");<br />
InputStream stderr = proc.getErrorStream();<br />
InputStreamReader isr = new InputStreamReader(stderr);<br />
BufferedReader br = new BufferedReader(isr);<br />
String line = null;<br />
System.out.println("&lt;ERROR&gt;");<br />
while ( (line = br.readLine()) != null)<br />
System.out.println(line);<br />
System.out.println("&lt;/ERROR&gt;");<br />
int exitVal = proc.waitFor();<br />
System.out.println("Process exitValue: " + exitVal);<br />
} catch (Throwable t)<br />
{<br />
t.printStackTrace();<br />
}<br />
}<br />
}</font></p>
<p><br />
<font size="2">程序的运行结果为</font></p>
<p><font size="2">E:classescomjavaworldjpitfallsarticle2&gt;java MediocreExecJavac<br />
&lt;ERROR&gt;<br />
Usage: javac &lt;options&gt; &lt;source files&gt;</font></p>
<p><font size="2">where &lt;options&gt; includes:<br />
-g Generate all debugging info<br />
-g:none Generate no debugging info<br />
-g:{lines,vars,source} Generate only some debugging info<br />
-O Optimize; may hinder debugging or enlarge class files<br />
-nowarn Generate no warnings<br />
-verbose Output messages about what the compiler is doing<br />
-deprecation Output source locations where deprecated APIs are used<br />
-classpath &lt;path&gt; Specify where to find user class files<br />
-sourcepath &lt;path&gt; Specify where to find input source files<br />
-bootclasspath &lt;path&gt; Override location of bootstrap class files<br />
-extdirs &lt;dirs&gt; Override location of installed extensions<br />
-d &lt;directory&gt; Specify where to place generated class files<br />
-encoding &lt;encoding&gt; Specify character encoding used by source files<br />
-target &lt;release&gt; Generate class files for specific VM version<br />
&lt;/ERROR&gt;<br />
Process exitValue: 2</font></p>
<p><br />
<font size="2">哎，不管怎么说还是出来了结果，作者作了一下总结，就是说，为了处理好外部命令大量输出的情况，你要确保你的程序处理好外部命令所需要的输入或者输出。</font></p>
<p><br />
<font size="2">下一个题目，当我们调用一个我们认为是可执行程序的时候容易发生的错误（今天晚上我刚刚犯这个错误，没事做这个练习时候发生的）</font></p>
<p><font size="2">import java.util.*;<br />
import java.io.*;</font></p>
<p><font size="2">public class BadExecWinDir<br />
{<br />
public static void main(String args[])<br />
{<br />
try<br />
{ <br />
Runtime rt = Runtime.getRuntime();<br />
Process proc = rt.exec("dir");<br />
InputStream stdin = proc.getInputStream();<br />
InputStreamReader isr = new InputStreamReader(stdin);<br />
BufferedReader br = new BufferedReader(isr);<br />
String line = null;<br />
System.out.println("&lt;OUTPUT&gt;");<br />
while ( (line = br.readLine()) != null)<br />
System.out.println(line);<br />
System.out.println("&lt;/OUTPUT&gt;");<br />
int exitVal = proc.waitFor(); <br />
System.out.println("Process exitValue: " + exitVal);<br />
} catch (Throwable t)<br />
{<br />
t.printStackTrace();<br />
}<br />
}<br />
}</font></p>
<p><font size="2">A run of BadExecWinDir produces: </font></p>
<p><br />
<font size="2">E:classescomjavaworldjpitfallsarticle2&gt;java BadExecWinDir<br />
java.io.IOException: CreateProcess: dir error=2<br />
at java.lang.Win32Process.create(Native Method)<br />
at java.lang.Win32Process.&lt;init&gt;(Unknown Source)<br />
at java.lang.Runtime.execInternal(Native Method)<br />
at java.lang.Runtime.exec(Unknown Source)<br />
at java.lang.Runtime.exec(Unknown Source)<br />
at java.lang.Runtime.exec(Unknown Source)<br />
at java.lang.Runtime.exec(Unknown Source)<br />
at BadExecWinDir.main(BadExecWinDir.java:12)</font></p>
<p><br />
<font size="2">说实在的，这个错误还真是让我摸不着头脑，我觉得在windows中返回2应该是没有找到这个文件的缘故，可能windows 2000中只有cmd命令，dir命令不是当前环境变量能够解释的吧。我也不知道了，慢慢往下看吧。</font></p>
<p><font size="2">嘿，果然和作者想的一样，就是因为dir命令是由windows中的解释器解释的，直接执行dir时无法找到dir.exe这个命令，所以会出现文件未找到这个2的错误。如果我们要执行这样的命令，就要先根据操作系统的不同执行不同的解释程序command.com 或者cmd.exe。</font></p>
<p><font size="2">作者对上边的程序进行了修改</font></p>
<p><font size="2">import java.util.*;<br />
import java.io.*;</font></p>
<p><font size="2">class StreamGobbler extends Thread<br />
{<br />
InputStream is;<br />
String type;</font></p>
<p><font size="2">StreamGobbler(InputStream is, String type)<br />
{<br />
this.is = is;<br />
this.type = type;<br />
}</font></p>
<p><font size="2">public void run()<br />
{<br />
try<br />
{<br />
InputStreamReader isr = new InputStreamReader(is);<br />
BufferedReader br = new BufferedReader(isr);<br />
String line=null;<br />
while ( (line = br.readLine()) != null)<br />
System.out.println(type + "&gt;" + line); <br />
} catch (IOException ioe)<br />
{<br />
ioe.printStackTrace(); <br />
}<br />
}<br />
}</font></p>
<p><font size="2">public class GoodWindowsExec<br />
{<br />
public static void main(String args[])<br />
{<br />
if (args.length &lt; 1)<br />
{<br />
System.out.println("USAGE: java GoodWindowsExec &lt;cmd&gt;");<br />
System.exit(1);<br />
}</font></p>
<p><font size="2">try<br />
{ <br />
String osName = System.getProperty("os.name" );<br />
String[] cmd = new String[3];</font></p>
<p><font size="2">if( osName.equals( "Windows NT" ) )<br />
{<br />
cmd[0] = "cmd.exe" ;<br />
cmd[1] = "/C" ;<br />
cmd[2] = args[0];<br />
}<br />
else if( osName.equals( "Windows 95" ) )<br />
{<br />
cmd[0] = "command.com" ;<br />
cmd[1] = "/C" ;<br />
cmd[2] = args[0];<br />
}</font></p>
<p><font size="2">Runtime rt = Runtime.getRuntime();<br />
System.out.println("Execing " + cmd[0] + " " + cmd[1] <br />
+ " " + cmd[2]);<br />
Process proc = rt.exec(cmd);<br />
// any error message?<br />
StreamGobbler errorGobbler = new <br />
StreamGobbler(proc.getErrorStream(), "ERROR"); </font></p>
<p><font size="2">// any output?<br />
StreamGobbler outputGobbler = new <br />
StreamGobbler(proc.getInputStream(), "OUTPUT");</font></p>
<p><font size="2">// kick them off<br />
errorGobbler.start();<br />
outputGobbler.start();</font></p>
<p><font size="2">// any error???<br />
int exitVal = proc.waitFor();<br />
System.out.println("ExitValue: " + exitVal); <br />
} catch (Throwable t)<br />
{<br />
t.printStackTrace();<br />
}<br />
}<br />
}</font></p>
<p><font size="2">Running GoodWindowsExec with the dir command generates: </font></p>
<p><br />
<font size="2">E:classescomjavaworldjpitfallsarticle2&gt;java GoodWindowsExec "dir *.java"<br />
Execing cmd.exe /C dir *.java<br />
OUTPUT&gt; Volume in drive E has no label.<br />
OUTPUT&gt; Volume Serial Number is 5C5F-0CC9<br />
OUTPUT&gt;<br />
OUTPUT&gt; Directory of E:classescomjavaworldjpitfallsarticle2<br />
OUTPUT&gt;<br />
OUTPUT&gt;10/23/00 09:01p 805 BadExecBrowser.java<br />
OUTPUT&gt;10/22/00 09:35a 770 BadExecBrowser1.java<br />
OUTPUT&gt;10/24/00 08:45p 488 BadExecJavac.java<br />
OUTPUT&gt;10/24/00 08:46p 519 BadExecJavac2.java<br />
OUTPUT&gt;10/24/00 09:13p 930 BadExecWinDir.java<br />
OUTPUT&gt;10/22/00 09:21a 2,282 BadURLPost.java<br />
OUTPUT&gt;10/22/00 09:20a 2,273 BadURLPost1.java<br />
... (some output omitted for brevity)<br />
OUTPUT&gt;10/12/00 09:29p 151 SuperFrame.java<br />
OUTPUT&gt;10/24/00 09:23p 1,814 TestExec.java<br />
OUTPUT&gt;10/09/00 05:47p 23,543 TestStringReplace.java<br />
OUTPUT&gt;10/12/00 08:55p 228 TopLevel.java<br />
OUTPUT&gt; 22 File(s) 46,661 bytes<br />
OUTPUT&gt; 19,678,420,992 bytes free<br />
ExitValue: 0</font></p>
<p><font size="2">这里作者教了一个windows中很有用的方法，呵呵，至少我是不知道的，就是cmd.exe /C +一个windows中注册了后缀的文档名，windows会自动地调用相关的程序来打开这个文档，我试了一下，的确很好用，但是好像文件路径中有空格的话就有点问题，我加上引号也无法解决。</font></p>
<p><font size="2">这里作者强调了一下，不要假设你执行的程序是可执行的程序，要清楚自己的程序是单独可执行的还是被解释的，本章的结束作者会介绍一个命令行工具来帮助我们分析。</font></p>
<p><font size="2">这里还有一点，就是得到process的输出的方式是getInputStream，这是因为我们要从Java 程序的角度来看，外部程序的输出对于Java来说就是输入，反之亦然。</font></p>
<p><br />
<font size="2">最后的一个漏洞的地方就是错误的认为exec方法会接受所有你在命令行或者Shell中输入并接受的字符串。这些错误主要出现在命令作为参数的情况下，程序员错误的将所有命令行中可以输入的参数命令加入到exec中（这段翻译的不好，凑合看吧）。下面的例子中就是一个程序员想重定向一个命令的输出。</font></p>
<p><br />
<font size="2">import java.util.*;<br />
import java.io.*;</font></p>
<p><font size="2">// StreamGobbler omitted for brevity</font></p>
<p><font size="2">public class BadWinRedirect<br />
{<br />
public static void main(String args[])<br />
{<br />
try<br />
{ <br />
Runtime rt = Runtime.getRuntime();<br />
Process proc = rt.exec("java jecho 'Hello World' &gt; test.txt");<br />
// any error message?<br />
StreamGobbler errorGobbler = new <br />
StreamGobbler(proc.getErrorStream(), "ERROR"); </font></p>
<p><font size="2">// any output?<br />
StreamGobbler outputGobbler = new <br />
StreamGobbler(proc.getInputStream(), "OUTPUT");</font></p>
<p><font size="2">// kick them off<br />
errorGobbler.start();<br />
outputGobbler.start();</font></p>
<p><font size="2">// any error???<br />
int exitVal = proc.waitFor();<br />
System.out.println("ExitValue: " + exitVal); <br />
} catch (Throwable t)<br />
{<br />
t.printStackTrace();<br />
}<br />
}<br />
}</font></p>
<p><font size="2">Running BadWinRedirect produces: </font></p>
<p><br />
<font size="2">E:classescomjavaworldjpitfallsarticle2&gt;java BadWinRedirect<br />
OUTPUT&gt;'Hello World' &gt; test.txt<br />
ExitValue: 0</font></p>
<p><font size="2">程序员的本意是将Hello World这个输入重订向到一个文本文件中，但是这个文件并没有生成，jecho仅仅是将命令行中的参数输出到标准输出中，用户觉得可以像dos中重定向一样将输出重定向到一个文件中，但这并不能实现，用户错误的将exec认为是一个shell解释器，但它并不是，如果你想将一个程序的输出重定向到其他的程序中，你必须用程序来实现他。可用java.io中的包。</font></p>
<p><br />
<font size="2">import java.util.*;<br />
import java.io.*;</font></p>
<p><font size="2">class StreamGobbler extends Thread<br />
{<br />
InputStream is;<br />
String type;<br />
OutputStream os;</font></p>
<p><font size="2">StreamGobbler(InputStream is, String type)<br />
{<br />
this(is, type, null);<br />
}</font></p>
<p><font size="2">StreamGobbler(InputStream is, String type, OutputStream redirect)<br />
{<br />
this.is = is;<br />
this.type = type;<br />
this.os = redirect;<br />
}</font></p>
<p><font size="2">public void run()<br />
{<br />
try<br />
{<br />
PrintWriter pw = null;<br />
if (os != null)<br />
pw = new PrintWriter(os);</font></p>
<p><font size="2">InputStreamReader isr = new InputStreamReader(is);<br />
BufferedReader br = new BufferedReader(isr);<br />
String line=null;<br />
while ( (line = br.readLine()) != null)<br />
{<br />
if (pw != null)<br />
pw.println(line);<br />
System.out.println(type + "&gt;" + line); <br />
}<br />
if (pw != null)<br />
pw.flush();<br />
} catch (IOException ioe)<br />
{<br />
ioe.printStackTrace(); <br />
}<br />
}<br />
}</font></p>
<p><font size="2">public class GoodWinRedirect<br />
{<br />
public static void main(String args[])<br />
{<br />
if (args.length &lt; 1)<br />
{<br />
System.out.println("USAGE java GoodWinRedirect &lt;outputfile&gt;");<br />
System.exit(1);<br />
}</font></p>
<p><font size="2">try<br />
{ <br />
FileOutputStream fos = new FileOutputStream(args[0]);<br />
Runtime rt = Runtime.getRuntime();<br />
Process proc = rt.exec("java jecho 'Hello World'");<br />
// any error message?<br />
StreamGobbler errorGobbler = new <br />
StreamGobbler(proc.getErrorStream(), "ERROR"); </font></p>
<p><font size="2">// any output?<br />
StreamGobbler outputGobbler = new <br />
StreamGobbler(proc.getInputStream(), "OUTPUT", fos);</font></p>
<p><font size="2">// kick them off<br />
errorGobbler.start();<br />
outputGobbler.start();</font></p>
<p><font size="2">// any error???<br />
int exitVal = proc.waitFor();<br />
System.out.println("ExitValue: " + exitVal);<br />
fos.flush();<br />
fos.close(); <br />
} catch (Throwable t)<br />
{<br />
t.printStackTrace();<br />
}<br />
}<br />
}</font></p>
<p><font size="2">Running GoodWinRedirect produces: </font></p>
<p><br />
<font size="2">E:classescomjavaworldjpitfallsarticle2&gt;java GoodWinRedirect test.txt<br />
OUTPUT&gt;'Hello World'<br />
ExitValue: 0</font></p>
<p><font size="2">这里就不多说了，看看就明白，紧接着作者给出了一个监测命令的小程序</font></p>
<p><font size="2">import java.util.*;<br />
import java.io.*;</font></p>
<p><font size="2">// class StreamGobbler omitted for brevity</font></p>
<p><font size="2">public class TestExec<br />
{<br />
public static void main(String args[])<br />
{<br />
if (args.length &lt; 1)<br />
{<br />
System.out.println("USAGE: java TestExec "cmd"");<br />
System.exit(1);<br />
}</font></p>
<p><font size="2">try<br />
{<br />
String cmd = args[0];<br />
Runtime rt = Runtime.getRuntime();<br />
Process proc = rt.exec(cmd);</font></p>
<p><font size="2">// any error message?<br />
StreamGobbler errorGobbler = new <br />
StreamGobbler(proc.getErrorStream(), "ERR"); </font></p>
<p><font size="2">// any output?<br />
StreamGobbler outputGobbler = new <br />
StreamGobbler(proc.getInputStream(), "OUT");</font></p>
<p><font size="2">// kick them off<br />
errorGobbler.start();<br />
outputGobbler.start();</font></p>
<p><font size="2">// any error???<br />
int exitVal = proc.waitFor();<br />
System.out.println("ExitValue: " + exitVal);<br />
} catch (Throwable t)<br />
{<br />
t.printStackTrace();<br />
}<br />
}<br />
}</font></p>
<p><font size="2">对这个程序进行运行: <br />
E:classescomjavaworldjpitfallsarticle2&gt;java TestExec "e:javadocsindex.html"<br />
java.io.IOException: CreateProcess: e:javadocsindex.html error=193<br />
at java.lang.Win32Process.create(Native Method)<br />
at java.lang.Win32Process.&lt;init&gt;(Unknown Source)<br />
at java.lang.Runtime.execInternal(Native Method)<br />
at java.lang.Runtime.exec(Unknown Source)<br />
at java.lang.Runtime.exec(Unknown Source)<br />
at java.lang.Runtime.exec(Unknown Source)<br />
at java.lang.Runtime.exec(Unknown Source)<br />
at TestExec.main(TestExec.java:45)</font></p>
<p><font size="2">193在windows中是说这不是一个win32程序，这说明路径中找不到这个网页的关联程序，下面作者决定用一个绝对路径来试一下。</font></p>
<p><font size="2">E:classescomjavaworldjpitfallsarticle2&gt;java TestExec <br />
"e:program filesnetscapeprogramnetscape.exe e:javadocsindex.html"<br />
ExitValue: 0</font></p>
<p><br />
<font size="2">好用了，这个我也试了一下，用的是IE。</font></p>
<p><br />
<font size="2">最后，作者总结了几条规则，防止我们在进行Runtime.exec()调用时出现错误。</font></p>
<p><br />
<font size="2">&lt;!--[if !supportLists]--&gt;1、 &lt;!--[endif]--&gt;在一个外部进程执行完之前你不能得到他的退出状态</font></p>
<p><font size="2">&lt;!--[if !supportLists]--&gt;2、 &lt;!--[endif]--&gt;在你的外部程序开始执行的时候你必须马上控制输入、输出、出错这些流。</font></p>
<p><font size="2">&lt;!--[if !supportLists]--&gt;3、 &lt;!--[endif]--&gt;你必须用Runtime.exec()去执行程序</font></p>
<p><font size="2">&lt;!--[if !supportLists]--&gt;4、 &lt;!--[endif]--&gt;你不能象命令行一样使用Runtime.exec()。</font></p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/310069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-19 13:50 <a href="http://www.blogjava.net/caizh2009/articles/310069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用java实现zip压缩</title><link>http://www.blogjava.net/caizh2009/articles/309975.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Mon, 18 Jan 2010 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/309975.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/309975.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/309975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/309975.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/309975.html</trackback:ping><description><![CDATA[关键字: <span class="hilite1">java</span> <span class="hilite2">zip</span>
<div class="blog_content">本来是写到spaces live上的，可是代码的显示效果确实不怎么好看。在javaeye上试了试代码显示的顺眼多了。 <br />
<br />
今天写了个用<span class="hilite1">java</span>压缩的功能，可以实现对文件和目录的压缩。 <br />
<br />
由于<span class="hilite1">java</span>.util.<span class="hilite2">zip</span>.ZipOutputStream有中文乱码问题，所以采用org.apache.tools.<span class="hilite2">zip</span>.ZipOutputStream。 <br />
以下是代码： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span class="hilite1">Java</span>代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://szhnet.javaeye.com/blog/199059#"><img alt="复制代码" src="http://szhnet.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;net.szh.<span class="hilite2">zip</span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;<span class="hilite1">java</span>.io.BufferedInputStream; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;<span class="hilite1">java</span>.io.File; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;<span class="hilite1">java</span>.io.FileInputStream; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;<span class="hilite1">java</span>.io.FileOutputStream; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;<span class="hilite1">java</span>.util.<span class="hilite2">zip</span>.CRC32; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;<span class="hilite1">java</span>.util.<span class="hilite2">zip</span>.CheckedOutputStream; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.apache.tools.<span class="hilite2">zip</span>.ZipEntry; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.apache.tools.<span class="hilite2">zip</span>.ZipOutputStream; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ZipCompressor&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;BUFFER&nbsp;=&nbsp;</span><span class="number">8192</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;File&nbsp;zipFile; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;ZipCompressor(String&nbsp;pathName)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zipFile&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;File(pathName); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;compress(String&nbsp;srcPathName)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;File(srcPathName); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!file.exists()) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;RuntimeException(srcPathName&nbsp;+&nbsp;</span><span class="string">"不存在！"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream&nbsp;fileOutputStream&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;FileOutputStream(zipFile); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CheckedOutputStream&nbsp;cos&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;CheckedOutputStream(fileOutputStream, &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;CRC32()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZipOutputStream&nbsp;out&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ZipOutputStream(cos); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;basedir&nbsp;=&nbsp;</span><span class="string">""</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compress(file,&nbsp;out,&nbsp;basedir); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;RuntimeException(e); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;compress(File&nbsp;file,&nbsp;ZipOutputStream&nbsp;out,&nbsp;String&nbsp;basedir)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*&nbsp;判断是目录还是文件&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(file.isDirectory())&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"压缩："</span><span>&nbsp;+&nbsp;basedir&nbsp;+&nbsp;file.getName()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.compressDirectory(file,&nbsp;out,&nbsp;basedir); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"压缩："</span><span>&nbsp;+&nbsp;basedir&nbsp;+&nbsp;file.getName()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.compressFile(file,&nbsp;out,&nbsp;basedir); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp;压缩一个目录&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;compressDirectory(File&nbsp;dir,&nbsp;ZipOutputStream&nbsp;out,&nbsp;String&nbsp;basedir)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!dir.exists()) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File[]&nbsp;files&nbsp;=&nbsp;dir.listFiles(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;files.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*&nbsp;递归&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compress(files[i],&nbsp;out,&nbsp;basedir&nbsp;+&nbsp;dir.getName()&nbsp;+&nbsp;</span><span class="string">"/"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp;压缩一个文件&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;compressFile(File&nbsp;file,&nbsp;ZipOutputStream&nbsp;out,&nbsp;String&nbsp;basedir)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!file.exists())&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedInputStream&nbsp;bis&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedInputStream( &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;FileInputStream(file)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZipEntry&nbsp;entry&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ZipEntry(basedir&nbsp;+&nbsp;file.getName()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.putNextEntry(entry); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;count; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>&nbsp;data[]&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[BUFFER]; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;((count&nbsp;=&nbsp;bis.read(data,&nbsp;</span><span class="number">0</span><span>,&nbsp;BUFFER))&nbsp;!=&nbsp;-</span><span class="number">1</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.write(data,&nbsp;</span><span class="number">0</span><span>,&nbsp;count); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bis.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;RuntimeException(e); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package net.szh.<span class="hilite2">zip</span>;
import <span class="hilite1">java</span>.io.BufferedInputStream;
import <span class="hilite1">java</span>.io.File;
import <span class="hilite1">java</span>.io.FileInputStream;
import <span class="hilite1">java</span>.io.FileOutputStream;
import <span class="hilite1">java</span>.util.<span class="hilite2">zip</span>.CRC32;
import <span class="hilite1">java</span>.util.<span class="hilite2">zip</span>.CheckedOutputStream;
import org.apache.tools.<span class="hilite2">zip</span>.ZipEntry;
import org.apache.tools.<span class="hilite2">zip</span>.ZipOutputStream;
public class ZipCompressor {
static final int BUFFER = 8192;
private File zipFile;
public ZipCompressor(String pathName) {
zipFile = new File(pathName);
}
public void compress(String srcPathName) {
File file = new File(srcPathName);
if (!file.exists())
throw new RuntimeException(srcPathName + "不存在！");
try {
FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,
new CRC32());
ZipOutputStream out = new ZipOutputStream(cos);
String basedir = "";
compress(file, out, basedir);
out.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void compress(File file, ZipOutputStream out, String basedir) {
/* 判断是目录还是文件 */
if (file.isDirectory()) {
System.out.println("压缩：" + basedir + file.getName());
this.compressDirectory(file, out, basedir);
} else {
System.out.println("压缩：" + basedir + file.getName());
this.compressFile(file, out, basedir);
}
}
/** 压缩一个目录 */
private void compressDirectory(File dir, ZipOutputStream out, String basedir) {
if (!dir.exists())
return;
File[] files = dir.listFiles();
for (int i = 0; i &lt; files.length; i++) {
/* 递归 */
compress(files[i], out, basedir + dir.getName() + "/");
}
}
/** 压缩一个文件 */
private void compressFile(File file, ZipOutputStream out, String basedir) {
if (!file.exists()) {
return;
}
try {
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(file));
ZipEntry entry = new ZipEntry(basedir + file.getName());
out.putNextEntry(entry);
int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
bis.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}</pre>
<br />
<br />
后来发现原来可以用ant中的org.apache.tools.ant.taskdefs.<span class="hilite2">Zip</span>来实现，更加简单。 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span class="hilite1">Java</span>代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://szhnet.javaeye.com/blog/199059#"><img alt="复制代码" src="http://szhnet.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;net.szh.<span class="hilite2">zip</span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;<span class="hilite1">java</span>.io.File; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.apache.tools.ant.Project; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.apache.tools.ant.taskdefs.<span class="hilite2">Zip</span>; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.apache.tools.ant.types.FileSet; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ZipCompressorByAnt&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;File&nbsp;zipFile; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;ZipCompressorByAnt(String&nbsp;pathName)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zipFile&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;File(pathName); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;compress(String&nbsp;srcPathName)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;srcdir&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;File(srcPathName); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!srcdir.exists()) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;RuntimeException(srcPathName&nbsp;+&nbsp;</span><span class="string">"不存在！"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Project&nbsp;prj&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Project(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hilite2">Zip</span>&nbsp;<span class="hilite2">zip</span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;<span class="hilite2">Zip</span>(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hilite2">zip</span>.setProject(prj); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hilite2">zip</span>.setDestFile(zipFile); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileSet&nbsp;fileSet&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;FileSet(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileSet.setProject(prj); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileSet.setDir(srcdir); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//fileSet.setIncludes("**/*.<span class="hilite1">java</span>");&nbsp;包括哪些文件或文件夹&nbsp;eg:<span class="hilite2">zip</span>.setIncludes("*.<span class="hilite1">java</span>"); </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//fileSet.setExcludes(...);&nbsp;排除哪些文件或文件夹 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hilite2">zip</span>.addFileset(fileSet); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hilite2">zip</span>.execute(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package net.szh.<span class="hilite2">zip</span>;
import <span class="hilite1">java</span>.io.File;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.<span class="hilite2">Zip</span>;
import org.apache.tools.ant.types.FileSet;
public class ZipCompressorByAnt {
private File zipFile;
public ZipCompressorByAnt(String pathName) {
zipFile = new File(pathName);
}
public void compress(String srcPathName) {
File srcdir = new File(srcPathName);
if (!srcdir.exists())
throw new RuntimeException(srcPathName + "不存在！");
Project prj = new Project();
<span class="hilite2">Zip</span> <span class="hilite2">zip</span> = new <span class="hilite2">Zip</span>();
<span class="hilite2">zip</span>.setProject(prj);
<span class="hilite2">zip</span>.setDestFile(zipFile);
FileSet fileSet = new FileSet();
fileSet.setProject(prj);
fileSet.setDir(srcdir);
//fileSet.setIncludes("**/*.<span class="hilite1">java</span>"); 包括哪些文件或文件夹 eg:<span class="hilite2">zip</span>.setIncludes("*.<span class="hilite1">java</span>");
//fileSet.setExcludes(...); 排除哪些文件或文件夹
<span class="hilite2">zip</span>.addFileset(fileSet);
<span class="hilite2">zip</span>.execute();
}
}</pre>
<br />
测试一下 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span class="hilite1">Java</span>代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://szhnet.javaeye.com/blog/199059#"><img alt="复制代码" src="http://szhnet.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;net.szh.<span class="hilite2">zip</span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TestZip&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZipCompressor&nbsp;zc&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;&nbsp;ZipCompressor(</span><span class="string">"E:\\szhzip.<span class="hilite2">zip</span>"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zc.compress(</span><span class="string">"E:\\test"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZipCompressorByAnt&nbsp;zca&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ZipCompressorByAnt(</span><span class="string">"E:\\szhzipant.<span class="hilite2">zip</span>"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zca.compress(</span><span class="string">"E:\\test"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package net.szh.<span class="hilite2">zip</span>;
public class TestZip {
public static void main(String[] args) {
ZipCompressor zc = new  ZipCompressor("E:\\szhzip.<span class="hilite2">zip</span>");
zc.compress("E:\\test");
ZipCompressorByAnt zca = new ZipCompressorByAnt("E:\\szhzipant.<span class="hilite2">zip</span>");
zca.compress("E:\\test");
}
}</pre>
</div>
<script type="text/javascript"><!-- google_ad_client="pub-4348265167276910" ;
/* 468x60, 个人博客 */ google_ad_slot="2046406163" ; google_ad_width="468;
google_ad_height" = 60;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</script><ins style="padding-right: 0px; padding-left: 0px; visibility: visible; padding-bottom: 0px; margin: 0px; width: 468px; border-top-style: none; padding-top: 0px; border-right-style: none; border-left-style: none; position: relative; height: 60px; border-bottom-style: none"></ins>
<img src ="http://www.blogjava.net/caizh2009/aggbug/309975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-18 17:06 <a href="http://www.blogjava.net/caizh2009/articles/309975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java解压缩zip文件，java创建zip文件，java压缩文件，java解压文件</title><link>http://www.blogjava.net/caizh2009/articles/309967.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Mon, 18 Jan 2010 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/309967.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/309967.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/309967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/309967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/309967.html</trackback:ping><description><![CDATA[<p>package unzip; </p>
<p>&nbsp; </p>
<p>import java.io.BufferedInputStream; </p>
<p>import java.io.BufferedOutputStream; </p>
<p>import java.io.File; </p>
<p>import java.io.FileInputStream; </p>
<p>import java.io.FileOutputStream; </p>
<p>import java.io.IOException; </p>
<p>import java.io.InputStream; </p>
<p>import java.io.OutputStream; </p>
<p>import java.util.Enumeration; </p>
<p>&nbsp; </p>
<p>import org.apache.tools.zip.ZipEntry; </p>
<p>import org.apache.tools.zip.ZipFile; </p>
<p>import org.apache.tools.zip.ZipOutputStream; </p>
<p>&nbsp; </p>
<p>/** </p>
<p>&nbsp; * 功能： 1 、实现把指定文件夹下的所有文件压缩为指定文件夹下指定 zip 文件 2 、实现把指定文件夹下的 zip 文件解压到指定目录下 </p>
<p>&nbsp; * </p>
<p>&nbsp; * @author ffshi </p>
<p>&nbsp; * </p>
<p>&nbsp; */ </p>
<p>public class ZipUtils { </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) { </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 把 E 盘正则表达式文件夹下的所有文件压缩到 E 盘 stu 目录下，压缩后的文件名保存为 正则表达式 .zip </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // zip ("E:\\ 正则表达式 ", "E:\\stu \\ 正则表达式 .zip "); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 把 E 盘 stu 目录下的正则表达式 .zip 压缩文件内的所有文件解压到 E 盘 stu 目录下面 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unZip ( "E:\\stu\\ 正则表达式 .zip" , "E:\\stu" ); </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; /** </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 功能：把 sourceDir 目录下的所有文件进行 zip 格式的压缩，保存为指定 zip 文件 create date:2009- 6- 9 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * author:Administrator </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param sourceDir </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E:\\ 我的备份 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param zipFile </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 格式： E:\\stu \\zipFile.zip 注意：加入 zipFile 我们传入的字符串值是 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ： "E:\\stu \\" 或者 "E:\\stu " </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果 E 盘已经存在 stu 这个文件夹的话，那么就会出现 java.io.FileNotFoundException: E:\stu </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( 拒绝访问。 ) 这个异常，所以要注意正确传参调用本函数哦 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ </p>
<p>&nbsp;&nbsp;&nbsp; public static void zip(String sourceDir, String zipFile) { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputStream os; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os = new FileOutputStream(zipFile); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedOutputStream bos = new BufferedOutputStream(os); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ZipOutputStream zos = new ZipOutputStream(bos); </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File file = new File(sourceDir); </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String basePath = null ; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (file.isDirectory()) { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basePath = file.getPath(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; basePath = file.getParent(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zipFile (file, basePath, zos); </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zos.closeEntry(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zos.close(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; /** </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * create date:2009- 6- 9 author:Administrator </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param source </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param basePath </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param zos </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @throws IOException </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ </p>
<p>&nbsp;&nbsp;&nbsp; private static void zipFile(File source, String basePath, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ZipOutputStream zos) { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File[] files = new File[0]; </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (source.isDirectory()) { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; files = source.listFiles(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; files = new File[1]; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; files[0] = source; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String pathName; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte [] buf = new byte [1024]; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int length = 0; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (File file : files) { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (file.isDirectory()) { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pathName = file.getPath().substring(basePath.length() + 1) </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; + "/" ; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zos.putNextEntry( new ZipEntry(pathName)); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zipFile (file, basePath, zos); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pathName = file.getPath().substring(basePath.length() + 1); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream is = new FileInputStream(file); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedInputStream bis = new BufferedInputStream(is); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zos.putNextEntry( new ZipEntry(pathName)); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((length = bis.read(buf)) &gt; 0) { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zos.write(buf, 0, length); </p>
<p>&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; is.close(); </p>
<p>&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; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; /** </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 解压 zip 文件，注意不能解压 rar 文件哦，只能解压 zip 文件 解压 rar 文件 会出现 java.io.IOException: Negative </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * seek offset 异常 create date:2009- 6- 9 author:Administrator </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param zipfile </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zip 文件，注意要是正宗的 zip 文件哦，不能是把 rar 的直接改为 zip 这样会出现 java.io.IOException: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Negative seek offset 异常 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param destDir </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @throws IOException </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ </p>
<p>&nbsp;&nbsp;&nbsp; public static void unZip(String zipfile, String destDir) { </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destDir = destDir.endsWith( "\\" ) ? destDir : destDir + "\\" ; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte b[] = new byte [1024]; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int length; </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ZipFile zipFile; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zipFile = new ZipFile( new File(zipfile)); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enumeration enumeration = zipFile.getEntries(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ZipEntry zipEntry = null ; </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (enumeration.hasMoreElements()) { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zipEntry = (ZipEntry) enumeration.nextElement(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File loadFile = new File(destDir + zipEntry.getName()); </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (zipEntry.isDirectory()) { </p>
<p>&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; loadFile.mkdirs(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!loadFile.getParentFile().exists()) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loadFile.getParentFile().mkdirs(); </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputStream outputStream = new FileOutputStream(loadFile); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream inputStream = zipFile.getInputStream(zipEntry); </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((length = inputStream.read(b)) &gt; 0) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputStream.write(b, 0, length); </p>
<p>&nbsp; </p>
<p>&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; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System. out .println( " 文件解压成功 " ); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp; </p>
<p>} </p>
<p>&nbsp;</p>
<p><br />
也顺便网上查了下rar格式与zip格式有什么区别： </p>
<p><br />
区别一、zip的安装比较大，并仅仅有英文版+汉化包 <br />
rar有官方的简体中文版，并且安装很小，不足一兆 <br />
区别二、winrar的压缩率较高，而zip的压缩率更低 <br />
区别三、zip支持的格式很多，但已经较老，不大流行 <br />
rar支持格式也很多，并且还是流行的 <br />
区别四、zip仅仅能够压缩成zip格式，不能解压rar格式；rar不仅有自己的格式，还可以压缩成zip格式并解压zip格式 <br />
区别五、zip的界面没有rar漂亮 <br />
区别六、winrar支持分卷压缩，zip不支持 <br />
区别七、国外很多都采用zip，因为它是免费的，rar不是免费的，在国内很流行是由于有盗版的存在；zip不能兼容rar，是因为这样必须付出一笔费用 </p>
<p><br />
WinRAR 可以创建两种不同的压缩文件格式: RAR 和 ZIP <br />
ZIP 压缩文件 </p>
<p>在 ZIP 文件的最大优点就是普及率。比如说，大部分在 Internet 的压缩文件都是 ZIP 压缩文件，所以如果你要传送压缩文件给某一个人，但你无法确定你的收件人是否有 WinRAR 来解压压缩文件的内容时，使用 ZIP 格式是个好推荐。要不然你也可以发送 自解压文件。此类的压缩文件稍微大了一点点，但不需要任何的外部程序便可以解压。 </p>
<p>另一个 ZIP 的优点便是速度。 ZIP 压缩文件通常在创建时会比 RAR 快一些。 </p>
<p>RAR 压缩文件 </p>
<p>RAR 格式比 ZIP 更能够提供较好的压缩率，特别是在 固实模式 时。另外一个 RAR 的重要功能是支持 多卷 压缩文件。它们比起 ZIP 的&#8220;跨磁盘&#8221;压缩文件更加便利和简易。 WinRAR 不支持 ZIP 的磁盘拆分，如果你要创建分卷压缩文件，请使用 RAR 的分卷压缩来代替。 </p>
<p>RAR 格式也有一些在 ZIP 中所缺乏的重要功能，例如 恢复记录，它允许物理受损数据的恢复，还能 锁定 重要的压缩文件，以防止它们被别人意外地更改。 </p>
<p>RAR 格式可以管理的文件大小几乎是无限制的 (最大到 8,589,934,591 GB) ，而在 ZIP 压缩文件的单个文件的最大值为 4 GB。需注意的是，旧式的文</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/xumiaohua/archive/2009/06/25/4297100.aspx</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/xumiaohua/archive/2009/06/25/4297100.aspx</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/309967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-18 16:42 <a href="http://www.blogjava.net/caizh2009/articles/309967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp下载文件的实现方法 及 注意</title><link>http://www.blogjava.net/caizh2009/articles/309947.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Mon, 18 Jan 2010 05:30:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/309947.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/309947.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/309947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/309947.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/309947.html</trackback:ping><description><![CDATA[<div class="blog_content"><span class="hilite1">jsp</span>中实现文件下载 <br />
<br />
（一） <br />
最简单的方式是在网页上做超级链接，如：&lt;a href="music/abc.mp3"&gt;点击下载&lt;/a&gt;。 <br />
但是这样服务器上的目录资源会直接暴露给最终用户，会给网站带来一些不 安全的因素。 <br />
<br />
因此可以采用其它方式实现下载，可以采用： <br />
<br />
1、RequestDispatcher的方式进行； <br />
<br />
2、采用文件流输出的方式下载。 （推荐） <br />
<br />
<br />
<br />
1、采用RequestDispatcher的方式进行 <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span class="hilite1">Jsp</span>代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://aguu125.javaeye.com/blog/352314#"><img alt="复制代码" src="http://aguu125.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>&lt;% &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;response.setContentType(</span><span class="string">"application/x-download"</span><span>);//设置为下载application/x-download &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;String&nbsp;filedownload&nbsp;=&nbsp;</span><span class="string">"/要下载的文件名"</span><span>;//即将下载的文件的相对路径 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;String&nbsp;filedisplay&nbsp;=&nbsp;</span><span class="string">"最终要显示给用户的保存文件名"</span><span>;//下载文件时显示的文件保存名称 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;String&nbsp;filenamedisplay&nbsp;=&nbsp;URLEncoder.encode(filedisplay,</span><span class="string">"UTF-8"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;response.addHeader(</span><span class="string">"Content-Disposition"</span><span>,</span><span class="string">"attachment;filename="</span><span>&nbsp;+&nbsp;filedisplay); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;try &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;RequestDispatcher&nbsp;dis&nbsp;=&nbsp;application.getRequestDispatcher(filedownload); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;if(dis!=&nbsp;null) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;dis.forward(request,response); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;response.flushBuffer(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;catch(Exception&nbsp;e) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;finally &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>%&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="jsp" style="display: none" name="code">&lt;%
response.setContentType("application/x-download");//设置为下载application/x-download
String filedownload = "/要下载的文件名";//即将下载的文件的相对路径
String filedisplay = "最终要显示给用户的保存文件名";//下载文件时显示的文件保存名称
String filenamedisplay = URLEncoder.encode(filedisplay,"UTF-8");
response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);
try
{
RequestDispatcher dis = application.getRequestDispatcher(filedownload);
if(dis!= null)
{
dis.forward(request,response);
}
response.flushBuffer();
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
}
%&gt;
</pre>
<br />
<br />
2、采用文件流输出的方式下载 <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span class="hilite1">Jsp</span>代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://aguu125.javaeye.com/blog/352314#"><img alt="复制代码" src="http://aguu125.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>&lt;%@page&nbsp;language=</span><span class="string">"java"</span><span>&nbsp;contentType=</span><span class="string">"application/x-msdownload"</span><span>&nbsp;pageEncoding=</span><span class="string">"gb2312"</span><span>%&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;% &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;//关于文件下载时采用文件流输出的方式处理： &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;//加上response.reset()，并且所有的％&gt;后面不要换行，包括最后一个； &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;response.reset();//可以加也可以不加 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;response.setContentType(</span><span class="string">"application/x-download"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>//application.getRealPath(</span><span class="string">"/main/mvplayer/CapSetup.msi"</span><span>);获取的物理路径 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>String&nbsp;filedownload&nbsp;=&nbsp;</span><span class="string">"想办法找到要提供下载的文件的物理路径＋文件名"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;String&nbsp;filedisplay&nbsp;=&nbsp;</span><span class="string">"给用户提供的下载文件名"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;String&nbsp;filedisplay&nbsp;=&nbsp;URLEncoder.encode(filedisplay,</span><span class="string">"UTF-8"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;response.addHeader(</span><span class="string">"Content-Disposition"</span><span>,</span><span class="string">"attachment;filename="</span><span>&nbsp;+&nbsp;filedisplay); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;java.io.OutputStream&nbsp;outp&nbsp;=&nbsp;null; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;java.io.FileInputStream&nbsp;in&nbsp;=&nbsp;null; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;try &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;outp&nbsp;=&nbsp;response.getOutputStream(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;in&nbsp;=&nbsp;new&nbsp;FileInputStream(filenamedownload); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;byte[]&nbsp;b&nbsp;=&nbsp;new&nbsp;byte[</span><span class="number">1024</span><span>]; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;int&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;while((i&nbsp;=&nbsp;in.read(b))&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;outp.write(b,&nbsp;</span><span class="number">0</span><span>,&nbsp;i); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>//&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>outp.flush(); &nbsp;&nbsp;</span></li>
    <li><span>//要加以下两句话，否则会报错 &nbsp;&nbsp;</span></li>
    <li><span>//java.lang.IllegalStateException:&nbsp;getOutputStream()&nbsp;has&nbsp;already&nbsp;been&nbsp;called&nbsp;for&nbsp;//this&nbsp;response&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>out.clear(); &nbsp;&nbsp;</span></li>
    <li><span>out&nbsp;=&nbsp;pageContext.pushBody(); &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;catch(Exception&nbsp;e) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;System.out.println(</span><span class="string">"Error!"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;finally &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;if(in&nbsp;!=&nbsp;null) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;in.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;in&nbsp;=&nbsp;null; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>//这里不能关闭&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>//if(outp&nbsp;!=&nbsp;null) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;//{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;//outp.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;//outp&nbsp;=&nbsp;null; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;//} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>%&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="jsp" style="display: none" name="code">&lt;%@page language="java" contentType="application/x-msdownload" pageEncoding="gb2312"%&gt;
&lt;%
//关于文件下载时采用文件流输出的方式处理：
//加上response.reset()，并且所有的％&gt;后面不要换行，包括最后一个；
response.reset();//可以加也可以不加
response.setContentType("application/x-download");
//application.getRealPath("/main/mvplayer/CapSetup.msi");获取的物理路径
String filedownload = "想办法找到要提供下载的文件的物理路径＋文件名";
String filedisplay = "给用户提供的下载文件名";
String filedisplay = URLEncoder.encode(filedisplay,"UTF-8");
response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);
java.io.OutputStream outp = null;
java.io.FileInputStream in = null;
try
{
outp = response.getOutputStream();
in = new FileInputStream(filenamedownload);
byte[] b = new byte[1024];
int i = 0;
while((i = in.read(b)) &gt; 0)
{
outp.write(b, 0, i);
}
//
outp.flush();
//要加以下两句话，否则会报错
//java.lang.IllegalStateException: getOutputStream() has already been called for //this response
out.clear();
out = pageContext.pushBody();
}
catch(Exception e)
{
System.out.println("Error!");
e.printStackTrace();
}
finally
{
if(in != null)
{
in.close();
in = null;
}
//这里不能关闭
//if(outp != null)
//{
//outp.close();
//outp = null;
//}
}
%&gt;
</pre>
<br />
对于第二种方法，我认为应该是比较常用的。不过有几个地方是值得我们注意的： <br />
<br />
一、采用第二种方法的主要优点是实际文件的存放路径对客户端来说是透明的。 <br />
这个文件可以存在于任何你的服务器能够取得到的地方，而客户端不一定能直接得到。例如文件来自于数据库或者内部网络的一个FTP服务器。还句话说，这种方式可以实现隐藏实际文件的URL地址。 <br />
<br />
二、为了防止客户端浏览器直接打开目标文件（例如在装了MS Office套件的Windows中的IE浏览器可能就会直接在IE浏览器中打开你想下载的doc或者xls文件），你必须在响应头里加入强制下载的MIME类型： <br />
response.setContentType("application/force-download");//设置为下载application/force-download <br />
这样，就可以保证在用户点击下载链接的时候浏览器一定会弹出提示窗口来询问你是下载还是直接打开并允许你选择要打开的应用程序，除非你设置了浏览器的一些默认行为。 <br />
或者，你想让客户端自行处理各种不同的文件类型，你可以在服务器的配置文件中配置MIME类型映射，通过简单的判断文件后缀名来处理。例如，在Tomcat中设置MIME响应类型： <br />
如果文件在客户端中的响应程序类型和期望不一致，修改$TOMCAT_HOME\conf\web.xml文件中的如下部分 ： <br />
&lt;mime-mapping&gt; <br />
&nbsp; &lt;extension&gt;zip&lt;/extension&gt; <br />
&nbsp; &lt;mime-type&gt;application/zip&lt;/mime-type&gt; <br />
&lt;/mime-mapping&gt; <br />
&lt;mime-mapping&gt; <br />
&nbsp; &lt;extension&gt;mht&lt;/extension&gt; <br />
&nbsp; &lt;mime-type&gt;message/rfc822&lt;/mime-type&gt; <br />
&lt;/mime-mapping&gt; <br />
&#8230;&#8230; <br />
<br />
三、在响应头中尽量不要设置浏览器缓存期限。 <br />
有时候用户在点击了下载链接后，在弹出窗口中，用户想直接点击&#8220;打开&#8221;，而不想保存到指定路径。这时候如果我们在响应头中限制了不允许使用浏览器缓存（即总是刷新），在IE浏览器中我们将无法直接打开该文件。因为限制了不允许使用缓存，浏览器无法将文件保存到临时文件夹（即缓存）。 <br />
也就是说，在响应头中不要进行如下的设置（已注释）： <br />
&nbsp; //response.addHeader("pragma","NO-cache"); <br />
&nbsp; //response.addHeader("Cache-Control","no-cache"); <br />
&nbsp; //response.addDateHeader("Expries",0); <br />
<br />
四、文件名为中文或其他unicode字符时的处理。 <br />
有时候提供下载的文件名中包含中文字符或者其他unicode字符，会导致浏览器无法正确的采用默认的文件名保存文件。我们应该记住在响应头中包含filename字段并采用ISO8859-1编码（推荐）或者采用UTF-8编码： <br />
response.setHeader("Content-disposition","attachment; filename="+new String(filename.getBytes("UTF-8"),"iso8859-1")); //采用ISO8859-1编码 <br />
response.setHeader("Content-disposition","attachment; filename="+URLEncoder.encode(filename, "UTF-8")); //采用UTF-8编码 <br />
但是，这种方式在不同的浏览器中表现也有所不同。例如在IE和Firefox中，采用ISO8859-1编码可以正确显示文件名，而在Opera中不管采用那种编码，默认保存的文件名都无法做到正确显示。 <br />
所以最好的方法其实就是尽量在文件名中使用ascii编码。 <br />
<br />
五、由于采用流的方式进行输入输出，我们必须保证在使用完毕后关闭流的资源。 <br />
一般我们把关闭流的操作放在finally块中，以保证在程序段结束前一定会关闭流的资源： <br />
<br />
InputStream is = null; <br />
ServletOutputStream sos = null; <br />
try { <br />
&nbsp; is = ...; //通过某种方式读进数据到输入流 <br />
&nbsp; sos = response.getOutputStream(); //打开输入流 <br />
&nbsp; byte[] buff = new byte[2048]; <br />
&nbsp; int bytesRead; <br />
&nbsp; while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) { <br />
&nbsp; sos.write(buff,0,bytesRead); <br />
&nbsp; sos.flush(); <br />
&nbsp; } <br />
} catch(IOException ex) { <br />
&nbsp; //TODO something with IOException <br />
} catch(Exception ex) { <br />
&nbsp; //TODO something with Exception <br />
} finally { <br />
&nbsp; if(is != null) { <br />
&nbsp; is.close(); //关闭输入流 <br />
&nbsp; } <br />
&nbsp; if(sos != null) { <br />
&nbsp; sos.close(); //关闭输入流 <br />
&nbsp; } <br />
} </div>
<script type="text/javascript"><!-- google_ad_client="pub-4348265167276910" ;
/* 468x60, 个人博客 */ google_ad_slot="2046406163" ; google_ad_width="468;
google_ad_height" = 60;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</script><ins style="padding-right: 0px; padding-left: 0px; visibility: visible; padding-bottom: 0px; margin: 0px; width: 468px; border-top-style: none; padding-top: 0px; border-right-style: none; border-left-style: none; position: relative; height: 60px; border-bottom-style: none"></ins>
<img src ="http://www.blogjava.net/caizh2009/aggbug/309947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-18 13:30 <a href="http://www.blogjava.net/caizh2009/articles/309947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat的编码设置</title><link>http://www.blogjava.net/caizh2009/articles/309193.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 12 Jan 2010 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/309193.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/309193.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/309193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/309193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/309193.html</trackback:ping><description><![CDATA[<span class="content">tomcat中文问题的解决<br />
<br />
<br />
第一，存文件必须以一种编码存；读文件也必须以一种编码读，如不特别设置，去系统默认的编码，中文windows为GBK编码。<br />
<br />
从.java-&gt;.class过程是，先编写.java文件并按莫种编码方式保存，然后用javac方法编译此文件，注意如.java没按系统默认编码保存则要带encoding参数指明实际编码，否则出错，生成的.class文件存为系统默认编码。<br />
<br />
从.jsp-&gt;.java-&gt;.class，先存为某种编码的.jsp文件，然后tomcat根据pageEncoding读取并转化为servlet存为系统默认编码，然后同上面.java-&gt;.class过程。<br />
<br />
第二，IDE的encoding为对系统下文件打开的解码方式或保存的编码方式。特例：如果.jsp文件有&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;，则eclipse会自动存为UTF-8方式，不管eclipse的encoding是什么，这也是eclipse的聪明之处。<br />
<br />
第三，<br />
pageEncoding="UTF-8"表示此文件的编码方式，必须与此文件存储方式一致（所以eclipse会首选根据它来存文件），tomcat根据这个来读此.jsp文件并编译为servlet。<br />
contentType="text/html;charset=UTF-8"表示当浏览器得到此文件时以什么方式解码。例如：<br />
&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;<br />
&lt;%@ page contentType="text/html;charset=iso8859-1"%&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;test&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
我是个好人<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
会产生乱码，因为存为UTF-8的文件被解码为iso8859-1，这样 如有中文肯定出乱码。<br />
<br />
至此，页面应为：<br />
&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;<br />
&lt;%@ page contentType="text/html;charset=UTF-8"%&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;中文问题&lt;/title&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;<br />
&lt;/head&gt;<br />
&lt;/html&gt;<br />
<br />
第四，<br />
request.setCharacterEncoding("UTF-8")是把提交内容的字符集设为UTF－8<br />
response.setCharacterEncoding("UTF-8")可以把页面中的&lt;%@ page contentType="text/html;charset=iso8859-1"%&gt;换为charset=UTF-8，是给告诉浏览器我这个文件的编码方式。<br />
<br />
第五，表单提交：无论何种表单提交都可以在后台的java文件中通过String des = new String(s.getBytes("iso8859-1"),"UTF-8");来转换成你想要的UTF－8编码方式。但如果每处都加词句太麻烦，故分post和get两种方式区分提交（tomcat5以后分开处理，之前处理方式一样，即都可以用request.setCharacterEncoding("UTF-8")方法处理，不过tomcat5以后get提交方法用此语句无效）。<br />
1,post提交的数据: <br />
程序加上org.springframework.web.filter.CharacterEncodingFilter过滤器. <br />
&lt;filter&gt; <br />
&lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; <br />
&lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt; <br />
&lt;init-param&gt; <br />
&lt;param-name&gt;encoding&lt;/param-name&gt; <br />
&lt;param-value&gt;UTF8&lt;/param-value&gt; <br />
&lt;/init-param&gt; <br />
&lt;init-param&gt; <br />
&lt;param-name&gt;forceEncoding&lt;/param-name&gt; <br />
&lt;param-value&gt;true&lt;/param-value&gt; <br />
&lt;/init-param&gt; <br />
&lt;/filter&gt; <br />
<br />
&lt;filter-mapping&gt; <br />
&lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; <br />
&lt;url-pattern&gt;*.html&lt;/url-pattern&gt; <br />
&lt;/filter-mapping&gt; <br />
&lt;filter-mapping&gt; <br />
&lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; <br />
&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt; <br />
&lt;/filter-mapping&gt; <br />
<br />
因为规范要求浏览器提交数据都要用utf8编码,所以这里设置编码方式为UTF8. <br />
<br />
特别注意: <br />
a,这个过滤器只是简单的调用:request.setCharacterEncoding(this.encoding); <br />
在这个语句之前不能调用任何的request.getParameter()方法,否则会设置tomcat的缺省字符集为"ISO-8859-1",并且使setCharacterEncoding的调用失效.所以在这个过滤器之前的过滤器中不能有对getParameter这类方法的调用,比较安全的做法就是把这个过滤器尽量靠前放. <br />
b,在server.xml中不能加上&lt;Valve className="org.apache.catalina.valves.RequestDumperValve"/&gt; <br />
这个value也设置tomcat的缺省字符集为"ISO-8859-1",使setCharacterEncoding的调用失效.可能其他的value也有这个问题,我没有测试过. <br />
如果要观察http请求参数,可以考虑用过滤器或者其他工具,例如ethereal(<a href="http://www.ethereal.com/" target="_blank">[url]http://www.ethereal.com/[/url]</a>) <br />
<br />
2,get提交的数据: <br />
两种情况: <br />
a,如果从地址栏直接输入汉字,则一般编码为"GBK",需要用 <br />
new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK") <br />
取出 <br />
b,如果是页面超连接连接中带的汉字,则编码根据页面编码的不同而不同,如果页面的 <br />
content="text/html; charset=utf-8",则在tomcat/conf/server.xml中的配置文件中: <br />
&lt;!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 --&gt; <br />
&lt;Connector port="8080" <br />
maxThreads="150" minSpareThreads="25" maxSpareThreads="75" <br />
enableLookups="false" redirectPort="8443" acceptCount="100" <br />
debug="0" connectionTimeout="20000" useBodyEncodingForURI="true" <br />
disableUploadTimeout="true" /&gt; <br />
<br />
加上:useBodyEncodingForURI="true"即可正常使用getParameter取出正确内容. <br />
如果content="text/html; charset=GBK",需用 <br />
new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK") <br />
取出,其他情况类似. <br />
<br />
总结: <br />
1,所有页面使用utf8编码, <br />
2,服务器加上过滤器, <br />
3,server.xml中不要使用 <br />
&lt;Valve className="org.apache.catalina.valves.RequestDumperValve"/&gt; <br />
4,server.xml文件加上useBodyEncodingForURI="true" <br />
这样应该可以搞定大多数前台的中文问题.至于地址栏输入中文,不支持也罢,一般的程序很少要求 <br />
从这里输入.<br />
<br />
第六，连接数据库 <br />
<br />
1、mysql配置文件：<br />
修改mysql在windows\my.ini里default-character-set=utf-8<br />
<br />
2、mysql里数据库和表也都设为utf8_unicode_ci<br />
<br />
3、数据库连结：jdbc:mysql://localhost/mydb?useUnicode=true&amp;characterEncoding=utf-8<br />
注意，关键就在于此：此句中间是'&amp;'不是'&amp;'这是因为数据库连结时，在.jsp和.java文件中应该用&amp;号，而XML文件中需要用&amp;<br />
<br />
对于Web容器来说，如果你不设置，默认是ISO8859-1<br />
String des = new String(s.getBytes("iso8859-1"),"UTF-8");都可以使用这个 不论哪里，有乱码就是用</span>
<img src ="http://www.blogjava.net/caizh2009/aggbug/309193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-12 17:41 <a href="http://www.blogjava.net/caizh2009/articles/309193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>j2EE中的过滤器的用法(过滤乱码) </title><link>http://www.blogjava.net/caizh2009/articles/308978.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Mon, 11 Jan 2010 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/308978.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/308978.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/308978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/308978.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/308978.html</trackback:ping><description><![CDATA[乱码是j2ee中一个比较常见的问题。遇到1，2个情况下，可以用new String(request.getParameter(xxx).getBytes("ISO-8859-1"),"UTF-8")来解决。遇到多的情况下，就最好用过滤器了。<br />
1个过滤器只需要注意2个地方，类和在web.xml上面的发布。<br />
<br />
1。在web.xml上面的发布如下：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 206px; background-color: #eeeeee"><font size="2"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">&gt;</span></font><span style="color: #000000"><br />
<font size="2"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size="2"><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">SetCharsetEncodingFilter</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;&nbsp;<font color="#008000"> //这个是类名</font></span></font><span style="color: #000000"><br />
<font size="2"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size="2"><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span><span style="color: #000000">&gt;</span><span style="color: #000000">org.SetCharacter</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span><span style="color: #000000">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#008000">//这个是类的位置</font></span></font><span style="color: #000000"><br />
<font size="2"><font color="#008000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size="2"><span style="color: #000000">&lt;</span><span style="color: #000000">init</span><span style="color: #000000">-</span><span style="color: #000000">param</span><span style="color: #000000">&gt;</span></font><span style="color: #000000"><br />
<font size="2"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size="2"><span style="color: #000000">&lt;</span><span style="color: #000000">param</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">encoding</span><span style="color: #000000">&lt;/</span><span style="color: #000000">param</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span></font><span style="color: #000000"><br />
<font size="2"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size="2"><span style="color: #000000">&lt;</span><span style="color: #000000">param</span><span style="color: #000000">-</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">utf</span><span style="color: #000000">-</span><span style="color: #000000">8</span><span style="color: #000000">&lt;/</span><span style="color: #000000">param</span><span style="color: #000000">-</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span></font><span style="color: #000000"><br />
<font size="2"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size="2"><span style="color: #000000">&lt;/</span><span style="color: #000000">init</span><span style="color: #000000">-</span><span style="color: #000000">param</span><span style="color: #000000">&gt;</span></font><span style="color: #000000"><br />
<font size="2"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</font></span><font size="2"><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">&gt;</span></font><span style="color: #000000"><br />
<font size="2"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</font></span><font size="2"><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">mapping</span><span style="color: #000000">&gt;</span></font><span style="color: #000000"><br />
<font size="2"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size="2"><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">SetCharsetEncodingFilter</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span></font><span style="color: #000000"><br />
<font size="2"><img id="Codehighlighter1_323_359_Open_Image" onclick="this.style.display='none'; Codehighlighter1_323_359_Open_Text.style.display='none'; Codehighlighter1_323_359_Closed_Image.style.display='inline'; Codehighlighter1_323_359_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_323_359_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_323_359_Closed_Text.style.display='none'; Codehighlighter1_323_359_Open_Image.style.display='inline'; Codehighlighter1_323_359_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size="2"><span style="color: #000000">&lt;</span><span style="color: #000000">url</span><span style="color: #000000">-</span><span style="color: #000000">pattern</span><span style="color: #000000">&gt; </span></font><span id="Codehighlighter1_323_359_Open_Text"><span style="color: #008000"><font color="#000000" size="2">/* </font></span><span style="color: #008000"><font color="#000000" size="2">&lt;/url-pattern&gt;&nbsp;&nbsp;</font><font size="2"><font color="#008000"> //这个代表所有的文件遇到过滤器都要被拦截<br />
</font><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;<font color="#000000">&nbsp;&lt;/filter-mapping&gt;</font></font></span></span></div>
注意配置文件之中：&lt;filter-class&gt; com.struts.common.SetCharacterEncodingFilter &lt;/filter-class&gt;这是文件的位置<br />
2。过滤的这个类如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;java.io.IOException;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;javax.servlet.Filter;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;javax.servlet.FilterChain;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;javax.servlet.FilterConfig;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;javax.servlet.ServletException;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;javax.servlet.ServletRequest;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;javax.servlet.ServletResponse;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_331_1460_Open_Image" onclick="this.style.display='none'; Codehighlighter1_331_1460_Open_Text.style.display='none'; Codehighlighter1_331_1460_Closed_Image.style.display='inline'; Codehighlighter1_331_1460_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_331_1460_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_331_1460_Closed_Text.style.display='none'; Codehighlighter1_331_1460_Open_Image.style.display='inline'; Codehighlighter1_331_1460_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;SetCharacterEncodingFilter&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;Filter&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_331_1460_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;encoding&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;FilterConfig&nbsp;&nbsp;&nbsp;filterConfig&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;ignore&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_553_834_Open_Image" onclick="this.style.display='none'; Codehighlighter1_553_834_Open_Text.style.display='none'; Codehighlighter1_553_834_Closed_Image.style.display='inline'; Codehighlighter1_553_834_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_553_834_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_553_834_Closed_Text.style.display='none'; Codehighlighter1_553_834_Open_Image.style.display='inline'; Codehighlighter1_553_834_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;init(FilterConfig&nbsp;&nbsp;&nbsp;filterConfig)&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;ServletException&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_553_834_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.filterConfig</span><span style="color: #000000">=</span><span style="color: #000000">filterConfig;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.encoding</span><span style="color: #000000">=</span><span style="color: #000000">filterConfig.getInitParameter(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">encoding&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />String&nbsp;&nbsp;&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">filterConfig.getInitParameter(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ignore&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(value</span><span style="color: #000000">==</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.ignore</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(value.equalsIgnoreCase(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">true&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.ignore</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.ignore</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_987_1244_Open_Image" onclick="this.style.display='none'; Codehighlighter1_987_1244_Open_Text.style.display='none'; Codehighlighter1_987_1244_Closed_Image.style.display='inline'; Codehighlighter1_987_1244_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_987_1244_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_987_1244_Closed_Text.style.display='none'; Codehighlighter1_987_1244_Open_Image.style.display='inline'; Codehighlighter1_987_1244_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;doFilter(ServletRequest&nbsp;&nbsp;&nbsp;request,&nbsp;&nbsp;&nbsp;ServletResponse&nbsp;&nbsp;&nbsp;response,&nbsp;&nbsp;&nbsp;FilterChain&nbsp;&nbsp;&nbsp;chain)&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;IOException,&nbsp;&nbsp;&nbsp;ServletException&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_987_1244_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;TODO&nbsp;&nbsp;&nbsp;自动生成方法存根&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_1080_1203_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1080_1203_Open_Text.style.display='none'; Codehighlighter1_1080_1203_Closed_Image.style.display='inline'; Codehighlighter1_1080_1203_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1080_1203_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1080_1203_Closed_Text.style.display='none'; Codehighlighter1_1080_1203_Open_Image.style.display='inline'; Codehighlighter1_1080_1203_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;(ignore&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;(request.getCharacterEncoding()&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">))&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1080_1203_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />String&nbsp;&nbsp;&nbsp;encoding&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;selectEncoding(request);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;(encoding&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />request.setCharacterEncoding(encoding);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />chain.doFilter(request,&nbsp;&nbsp;&nbsp;response);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_1276_1359_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1276_1359_Open_Text.style.display='none'; Codehighlighter1_1276_1359_Closed_Image.style.display='inline'; Codehighlighter1_1276_1359_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1276_1359_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1276_1359_Closed_Text.style.display='none'; Codehighlighter1_1276_1359_Open_Image.style.display='inline'; Codehighlighter1_1276_1359_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;destroy()&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1276_1359_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;TODO&nbsp;&nbsp;&nbsp;自动生成方法存根&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.encoding&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.filterConfig&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_1427_1457_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1427_1457_Open_Text.style.display='none'; Codehighlighter1_1427_1457_Closed_Image.style.display='inline'; Codehighlighter1_1427_1457_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1427_1457_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1427_1457_Closed_Text.style.display='none'; Codehighlighter1_1427_1457_Open_Image.style.display='inline'; Codehighlighter1_1427_1457_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;selectEncoding(ServletRequest&nbsp;&nbsp;&nbsp;request)&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1427_1457_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">.encoding);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
<span style="color: red; background-color: yellow">注意：COPY我的代码的时候记得吧字符串变量后的空格去掉</span>
<img src ="http://www.blogjava.net/caizh2009/aggbug/308978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-01-11 09:41 <a href="http://www.blogjava.net/caizh2009/articles/308978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>iBatis中使用事务</title><link>http://www.blogjava.net/caizh2009/articles/291955.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Thu, 20 Aug 2009 06:57:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/291955.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/291955.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/291955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/291955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/291955.html</trackback:ping><description><![CDATA[先复习一下事务的特点：<strong>ACID</strong>
<p><strong>A</strong>tomicity: 原子性<br />
<strong>C</strong>onsistency: 一致性<br />
<strong>I</strong>solation: 隔离性<br />
<strong>D</strong>urability: 耐久性</p>
<p><img src="http://img.baidu.com/hi/face/i_f25.gif"  alt="" />iBatis中的事务分为：<br />
<strong>Automatic</strong> Transaction<br />
<strong>Local</strong> Transaction<br />
<strong>Global</strong> Transaction<br />
<strong>Custom</strong> Transaction</p>
<p><strong>Automatic</strong> Transaction:</p>
<p>默认情况下iBatis认为每个statement都是一个事务</p>
<p><strong>比如</strong><br />
<font face="Times New Roman"><em>public void runStatementsUsingAutomaticTransactions()&nbsp;&nbsp;&nbsp;&nbsp; <br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp; SqlMapClient sqlMapClient = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlMapClientConfig.getSqlMapClient();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Person p = (Person)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqlMapClient.<strong>queryForObject</strong>("getPerson",&nbsp;&nbsp;<strong>// 第一个事务</strong><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; new Integer(9));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.setLastName("Smith");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqlMapClient.<strong>update</strong>("updatePerson", p); <strong>//第二个事务</strong><br />
}</em></font></p>
<p><strong>Local</strong> Transaction：</p>
<p>如果你想将几个statement作为一个事务来处理，可以用<br />
startTransaction，endTransaction来划分事务</p>
<p><strong>比如<br />
</strong><font face="宋体"><em>public void runStatementsUsingLocalTransactions() {<br />
SqlMapClient sqlMapClient = <br />
&nbsp;&nbsp;&nbsp; SqlMapClientConfig.getSqlMapClient();<br />
<br />
try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqlMapClient.startTransaction(); </em></font><font face="宋体"><em><strong>//事务开始<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Person p = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Person)sqlMapClient.queryForObject<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("getPerson", new Integer(9));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.setLastName("Smith");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqlMapClient.update("updatePerson", p);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Department d = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Department)sqlMapClient.queryForObject&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; ("getDept", new Integer(3));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.setDepartment(d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqlMapClient.update("updatePersonDept", p);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqlMapClient.commitTransaction(); </em><em><strong>//提交事务，从开始到这里是一个事务<br />
</strong><br />
} finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqlMapClient.endTransaction();</em></font><font face="宋体"><em><strong> //事务结束<br />
</strong>}<br />
}</em></font></p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/291955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-08-20 14:57 <a href="http://www.blogjava.net/caizh2009/articles/291955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>flex3+struts 1.3+spring +ibatis 2.x 整合实例---让新人少走弯路（myeclipse）</title><link>http://www.blogjava.net/caizh2009/articles/290997.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Thu, 13 Aug 2009 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/290997.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/290997.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/290997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/290997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/290997.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 经过两天工作闲余时间的奋战，终于flex3+struts 1.3+spring +ibatis 2.x 整合成功，下面介绍下详细的步骤和核心代码：IDE:myeclipse（当然：前提是FLEX+java整合成功的情况下，关于flex+java整合的文章就比较多，google下就OK）：1.成功整合FLEX+JAVA后,右键单击项目选择 MyEclipse---》add struts（...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/articles/290997.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/290997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-08-13 14:38 <a href="http://www.blogjava.net/caizh2009/articles/290997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三种整合 Struts 应用程序与 Spring 的方式</title><link>http://www.blogjava.net/caizh2009/articles/290767.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Wed, 12 Aug 2009 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/290767.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/290767.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/290767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/290767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/290767.html</trackback:ping><description><![CDATA[<blockquote><em>Struts Recipes</em> 的合著者 George Franciscus 将介绍另一个重大的 Struts 整合窍门 —— 这次是将 Struts 应用程序导入 Spring 框架。请跟随 George，他将向您展示如何改变 Struts 动作，使得管理 Struts 动作就像管理 Spring beans 那样。结果是一个增强的 web 框架，这个框架可以方便地利用 Spring AOP 的优势。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p>您肯定已经听说过控制反转 (IOC) 设计模式，因为很长一段时间以来一直在流传关于它的信息。如果您在任何功能中使用过 Spring 框架，那么您就知道其原理的作用。在本文中，我利用这一原理把一个 Struts 应用程序注入 Spring 框架，您将亲身体会到 IOC 模式的强大。</p>
<p>将一个 Struts 应用程序整合进 Spring 框架具有多方面的优点。首先，Spring 是为解决一些关于 JEE 的真实世界问题而设计的，比如复杂性、低性能和可测试性，等等。第二，Spring 框架包含一个 AOP 实现，允许您将面向方面技术应用于面向对象的代码。第三，一些人可能会说 Spring 框架只有<em>处理</em> Struts 比 Struts 处理自己好。但是这是观点问题，我演示三种将 Struts 应用程序整合到 Spring 框架的方法后，具体由您自己决定使用哪一种。</p>
<p>我所演示的方法都是执行起来相对简单的，但是它们却具有明显不同的优点。我为每一种方法创建了一个独立而可用的例子，这样您就可以完全理解每种方法。请参阅 <a href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#resources" cmimpressionsent="1">下载</a> 部分获得完整例子源代码。请参阅 <a href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#resources" cmimpressionsent="1">参考资料</a>，下载 Struts MVC 和 Spring 框架。</p>
<p><a name="N1008C"><span class="atitle">为什么 Spring 这么了不起？</span></a></p>
<p>Spring 的创立者 Rod Johnson 以一种批判的眼光看待 Java&#8482; 企业软件开发，并且提议很多企业难题都能够通过战略地使用 IOC 模式（也称作依赖注入）来解决。当 Rod 和一个具有奉献精神的开放源码开发者团队将这个理论应用于实践时，结果就产生了 Spring 框架。简言之，Spring 是一个轻型的容器，利用它可以使用一个外部 XML 配置文件方便地将对象连接在一起。每个对象都可以通过显示一个 JavaBean 属性收到一个到依赖对象的引用，留给您的简单任务就只是在一个 XML 配置文件中把它们连接好。</p>
<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
    <tbody>
        <tr>
            <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td>
            <td>
            <table cellspacing="0" cellpadding="5" width="100%" border="1">
                <tbody>
                    <tr>
                        <td bgcolor="#eeeeee"><a name="N10099"><strong>IOC 和 Spring</strong></a><br />
                        <p>IOC 是一种使应用程序逻辑外在化的设计模式，所以它是被注入而不是被写入客户机代码中。将 IOC 与接口编程应用结合，就像 Spring 框架那样，产生了一种架构，这种架构能够减少客户机对特定实现逻辑的依赖。请参阅 <a href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#resources" cmimpressionsent="1">参考资料</a> 了解更多关于 IOC 和 Spring 的信息。</p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<p>依赖注入是一个强大的特性，但是 Spring 框架能够提供更多特性。Spring 支持可插拔的事务管理器，可以给您的事务处理提供更广泛的选择范围。它集成了领先的持久性框架，并且提供一个一致的异常层次结构。Spring 还提供了一种使用面向方面代码代替正常的面向对象代码的简单机制。</p>
<p>Spring AOP 允许您使用<em>拦截器</em> 在一个或多个执行点上拦截应用程序逻辑。加强应用程序在拦截器中的日志记录逻辑会产生一个更可读的、实用的代码基础，所以拦截器广泛用于日志记录。您很快就会看到，为了处理横切关注点，Spring AOP 发布了它自己的拦截器，您也可以编写您自己的拦截器。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N100B0"><span class="atitle">整合 Struts 和 Spring</span></a></p>
<p>与 Struts 相似，Spring 可以作为一个 MVC 实现。这两种框架都具有自己的优点和缺点，尽管大部分人同意 Struts 在 MVC 方面仍然是最好的。很多开发团队已经学会在时间紧迫的时候利用 Struts 作为构造高品质软件的基础。Struts 具有如此大的推动力，以至于开发团队宁愿整合 Spring 框架的特性，而不愿意转换成 Spring MVC。没必要进行转换对您来说是一个好消息。Spring 架构允许您将 Struts 作为 Web 框架连接到基于 Spring 的业务和持久层。最后的结果就是现在一切条件都具备了。</p>
<p>在接下来的小窍门中，您将会了解到三种将 Struts MVC 整合到 Spring 框架的方法。我将揭示每种方法的缺陷并且对比它们的优点。 一旦您了解到所有三种方法的作用，我将会向您展示一个令人兴奋的应用程序，这个程序使用的是这三种方法中我最喜欢的一种。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N100BC"><span class="atitle">三个小窍门</span></a></p>
<p>接下来的每种整合技术（或者窍门）都有自己的优点和特点。我偏爱其中的一种，但是我知道这三种都能够加深您对 Struts 和 Spring 的理解。在处理各种不同情况的时候，这将给您提供一个广阔的选择范围。方法如下：</p>
<ul>
    <li>使用 Spring 的 <code>ActionSupport</code> 类整合 Structs
    <li>使用 Spring 的 <code>DelegatingRequestProcessor</code> 覆盖 Struts 的 <code>RequestProcessor </code>
    <li>将 Struts <code>Action</code> 管理委托给 Spring 框架 </li>
</ul>
<p><a name="N100E1"><span class="smalltitle">装载应用程序环境</span></a></p>
<p>无论您使用哪种技术，都需要使用 Spring 的 <code>ContextLoaderPlugin</code> 为 Struts 的 <code>ActionServlet</code> 装载 Spring 应用程序环境。就像添加任何其他插件一样，简单地向您的 struts-config.xml 文件添加该插件，如下所示：</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;plug-in className=
            "org.springframework.web.struts.ContextLoaderPlugIn"&gt;
            &lt;set-property property=
            "contextConfigLocation" value="/WEB-INF/beans.xml"/&gt;
            &lt;/plug-in&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>前面已经提到过，在 <a href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#download" cmimpressionsent="1">下载</a> 部分，您能够找到这三个完全可使用的例子的完整源代码。每个例子都为一个书籍搜索应用程序提供一种不同的 Struts 和 Spring 的整合方法。您可以在这里看到例子的要点，但是您也可以下载应用程序以查看所有的细节。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N100FE"><span class="atitle">窍门 1. 使用 Spring 的 ActionSupport</span></a></p>
<p>手动创建一个 Spring 环境是一种整合 Struts 和 Spring 的最直观的方式。为了使它变得更简单，Spring 提供了一些帮助。为了方便地获得 Spring 环境，<code>org.springframework.web.struts.ActionSupport</code> 类提供了一个 <code>getWebApplicationContext()</code> 方法。您所做的只是从 Spring 的 <code>ActionSupport</code> 而不是 Struts <code>Action</code> 类扩展您的动作，如清单 1 所示：</p>
<br />
<a name="N1011C"><strong>清单 1. 使用 ActionSupport 整合 Struts</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">package ca.nexcel.books.actions;
            import java.io.IOException;
            import javax.servlet.ServletException;
            import javax.servlet.http.HttpServletRequest;
            import javax.servlet.http.HttpServletResponse;
            import org.apache.struts.action.ActionError;
            import org.apache.struts.action.ActionErrors;
            import org.apache.struts.action.ActionForm;
            import org.apache.struts.action.ActionForward;
            import org.apache.struts.action.ActionMapping;
            import org.apache.struts.action.DynaActionForm;
            import org.springframework.context.ApplicationContext;
            import org.springframework.web.struts.ActionSupport;
            import ca.nexcel.books.beans.Book;
            import ca.nexcel.books.business.BookService;
            public class SearchSubmit extends ActionSupport {   <span class="boldcode">|(1)</span>
            public ActionForward execute(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws IOException, ServletException {
            DynaActionForm searchForm = (DynaActionForm) form;
            String isbn = (String) searchForm.get("isbn");
            //the old fashion way
            //BookService bookService = new BookServiceImpl();
            ApplicationContext ctx =
            getWebApplicationContext();    <span class="boldcode">|(2)</span>
            BookService bookService =
            (BookService) ctx.getBean("bookService");   <span class="boldcode">|(3)</span>
            Book book = bookService.read(isbn.trim());
            if (null == book) {
            ActionErrors errors = new ActionErrors();
            errors.add(ActionErrors.GLOBAL_ERROR,new ActionError
            ("message.notfound"));
            saveErrors(request, errors);
            return mapping.findForward("failure") ;
            }
            request.setAttribute("book", book);
            return mapping.findForward("success");
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>让我们快速思考一下这里到底发生了什么。在 (1) 处，我通过从 Spring 的 <code>ActionSupport</code> 类而不是 Struts 的 <code>Action</code> 类进行扩展，创建了一个新的 <code>Action</code>。在 (2) 处，我使用 <code>getWebApplicationContext()</code> 方法获得一个 <code>ApplicationContext</code>。为了获得业务服务，我使用在 (2) 处获得的环境在 (3) 处查找一个 Spring bean。</p>
<p>这种技术很简单并且易于理解。不幸的是，它将 Struts 动作与 Spring 框架耦合在一起。如果您想替换掉 Spring，那么您必须重写代码。并且，由于 Struts 动作不在 Spring 的控制之下，所以它不能获得 Spring AOP 的优势。当使用多重独立的 Spring 环境时，这种技术可能有用，但是在大多数情况下，这种方法不如另外两种方法合适。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N10146"><span class="atitle">窍门 2. 覆盖 RequestProcessor</span></a></p>
<p>将 Spring 从 Struts 动作中分离是一个更巧妙的设计选择。分离的一种方法是使用 <code>org.springframework.web.struts.DelegatingRequestProcessor</code> 类来覆盖 Struts 的 <code>RequestProcessor</code> 处理程序，如清单 2 所示：</p>
<br />
<a name="N1015C"><strong>清单 2. 通过 Spring 的 DelegatingRequestProcessor 进行整合</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;
            &lt;!DOCTYPE struts-config PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
            "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"&gt;
            &lt;struts-config&gt;
            &lt;form-beans&gt;
            &lt;form-bean name="searchForm"
            type="org.apache.struts.validator.DynaValidatorForm"&gt;
            &lt;form-property name="isbn"    type="java.lang.String"/&gt;
            &lt;/form-bean&gt;
            &lt;/form-beans&gt;
            &lt;global-forwards type="org.apache.struts.action.ActionForward"&gt;
            &lt;forward   name="welcome"                path="/welcome.do"/&gt;
            &lt;forward   name="searchEntry"            path="/searchEntry.do"/&gt;
            &lt;forward   name="searchSubmit"           path="/searchSubmit.do"/&gt;
            &lt;/global-forwards&gt;
            &lt;action-mappings&gt;
            &lt;action    path="/welcome" forward="/WEB-INF/pages/welcome.htm"/&gt;
            &lt;action    path="/searchEntry" forward="/WEB-INF/pages/search.jsp"/&gt;
            &lt;action    path="/searchSubmit"
            type="ca.nexcel.books.actions.SearchSubmit"
            input="/searchEntry.do"
            validate="true"
            name="searchForm"&gt;
            &lt;forward name="success" path="/WEB-INF/pages/detail.jsp"/&gt;
            &lt;forward name="failure" path="/WEB-INF/pages/search.jsp"/&gt;
            &lt;/action&gt;
            &lt;/action-mappings&gt;
            &lt;message-resources parameter="ApplicationResources"/&gt;
            &lt;controller processorClass="org.springframework.web.struts.
            DelegatingRequestProcessor"/&gt; <span class="boldcode">|(1)</span>
            &lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"&gt;
            &lt;set-property property="pathnames"
            value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/&gt;
            &lt;/plug-in&gt;
            &lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;
            &lt;set-property property="csntextConfigLocation" value="/WEB-INF/beans.xml"/&gt;
            &lt;/plug-in&gt;
            &lt;/struts-config&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>我利用了 <code>&lt;controller&gt;</code> 标记来用 <code>DelegatingRequestProcessor</code> 覆盖默认的 Struts <code>RequestProcessor</code>。下一步是在我的 Spring 配置文件中注册该动作，如清单 3 所示：</p>
<br />
<a name="N10179"><strong>清单 3. 在 Spring 配置文件中注册一个动作</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
            &lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
            "http://www.springframework.org/dtd/spring-beans.dtd"&gt;
            &lt;beans&gt;
            &lt;bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/&gt;
            &lt;bean name="/searchSubmit"
            class="ca.nexcel.books.actions.SearchSubmit"&gt; <span class="boldcode">|(1)</span>
            &lt;property name="bookService"&gt;
            &lt;ref bean="bookService"/&gt;
            &lt;/property&gt;
            &lt;/bean&gt;
            &lt;/beans&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>注意：在 (1) 处，我使用名称属性注册了一个 bean，以匹配 struts-config 动作映射名称。<code>SearchSubmit</code> 动作揭示了一个 JavaBean 属性，允许 Spring 在运行时填充属性，如清单 4 所示：</p>
<br />
<a name="N1018E"><strong>清单 4. 具有 JavaBean 属性的 Struts 动作</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">package ca.nexcel.books.actions;
            import java.io.IOException;
            import javax.servlet.ServletException;
            import javax.servlet.http.HttpServletRequest;
            import javax.servlet.http.HttpServletResponse;
            import org.apache.struts.action.Action;
            import org.apache.struts.action.ActionError;
            import org.apache.struts.action.ActionErrors;
            import org.apache.struts.action.ActionForm;
            import org.apache.struts.action.ActionForward;
            import org.apache.struts.action.ActionMapping;
            import org.apache.struts.action.DynaActionForm;
            import ca.nexcel.books.beans.Book;
            import ca.nexcel.books.business.BookService;
            public class SearchSubmit extends Action {
            private BookService bookService;
            public BookService getBookService() {
            return bookService;
            }
            public void setBookService(BookService bookService) { <span class="boldcode">| (1)</span>
            this.bookService = bookService;
            }
            public ActionForward execute(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws IOException, ServletException {
            DynaActionForm searchForm = (DynaActionForm) form;
            String isbn = (String) searchForm.get("isbn");
            Book book = getBookService().read(isbn.trim());  <span class="boldcode">|(2)</span>
            if (null == book) {
            ActionErrors errors = new ActionErrors();
            errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("message.notfound"));
            saveErrors(request, errors);
            return mapping.findForward("failure") ;
            }
            request.setAttribute("book", book);
            return mapping.findForward("success");
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>在清单 4 中，您可以了解到如何创建 Struts 动作。在 (1) 处，我创建了一个 JavaBean 属性。<code>DelegatingRequestProcessor</code>自动地配置这种属性。这种设计使 Struts 动作并不知道它正被 Spring 管理，并且使您能够利用 Sping 的动作管理框架的所有优点。由于您的 Struts 动作注意不到 Spring 的存在，所以您不需要重写您的 Struts 代码就可以使用其他控制反转容器来替换掉 Spring。</p>
<p><code>DelegatingRequestProcessor</code> 方法的确比第一种方法好，但是仍然存在一些问题。如果您使用一个不同的 <code>RequestProcessor</code>，则需要手动整合 Spring 的 <code>DelegatingRequestProcessor</code>。添加的代码会造成维护的麻烦并且将来会降低您的应用程序的灵活性。此外，还有过一些使用一系列命令来代替 Struts <code>RequestProcessor</code> 的传闻。 这种改变将会对这种解决方法的使用寿命造成负面的影响。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N101B4"><span class="atitle">窍门 3. 将动作管理委托给 Spring</span></a></p>
<p>一个更好的解决方法是将 Strut 动作管理委托给 Spring。您可以通过在 <code>struts-config</code> 动作映射中注册一个代理来实现。代理负责在 Spring 环境中查找 Struts 动作。由于动作在 Spring 的控制之下，所以它可以填充动作的 JavaBean 属性，并为应用诸如 Spring 的 AOP 拦截器之类的特性带来了可能。 </p>
<p>清单 5 中的 <code>Action</code> 类与清单 4 中的相同。但是 struts-config 有一些不同：</p>
<br />
<a name="N101CD"><strong>清单 5. Spring 整合的委托方法</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;
            &lt;!DOCTYPE struts-config PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
            "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"&gt;
            &lt;struts-config&gt;
            &lt;form-beans&gt;
            &lt;form-bean name="searchForm"
            type="org.apache.struts.validator.DynaValidatorForm"&gt;
            &lt;form-property name="isbn"    type="java.lang.String"/&gt;
            &lt;/form-bean&gt;
            &lt;/form-beans&gt;
            &lt;global-forwards type="org.apache.struts.action.ActionForward"&gt;
            &lt;forward   name="welcome"                path="/welcome.do"/&gt;
            &lt;forward   name="searchEntry"            path="/searchEntry.do"/&gt;
            &lt;forward   name="searchSubmit"           path="/searchSubmit.do"/&gt;
            &lt;/global-forwards&gt;
            &lt;action-mappings&gt;
            &lt;action    path="/welcome" forward="/WEB-INF/pages/welcome.htm"/&gt;
            &lt;action    path="/searchEntry" forward="/WEB-INF/pages/search.jsp"/&gt;
            &lt;action    path="/searchSubmit"
            type="org.springframework.web.struts.DelegatingActionProxy" <span class="boldcode">|(1)</span>
            input="/searchEntry.do"
            validate="true"
            name="searchForm"&gt;
            &lt;forward name="success" path="/WEB-INF/pages/detail.jsp"/&gt;
            &lt;forward name="failure" path="/WEB-INF/pages/search.jsp"/&gt;
            &lt;/action&gt;
            &lt;/action-mappings&gt;
            &lt;message-resources parameter="ApplicationResources"/&gt;
            &lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"&gt;
            &lt;set-property
            property="pathnames"
            value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/&gt;
            &lt;/plug-in&gt;
            &lt;plug-in
            className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;
            &lt;set-property property="contextConfigLocation" value="/WEB-INF/beans.xml"/&gt;
            &lt;/plug-in&gt;
            &lt;/struts-config&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>清单 5 是一个典型的 struts-config.xml 文件，只有一个小小的差别。它注册 Spring 代理类的名称，而不是声明动作的类名，如（1）处所示。DelegatingActionProxy 类使用动作映射名称查找 Spring 环境中的动作。这就是我们使用 <code>ContextLoaderPlugIn</code> 声明的环境。</p>
<p>将一个 Struts 动作注册为一个 Spring bean 是非常直观的，如清单 6 所示。我利用动作映射使用 <code>&lt;bean&gt;</code> 标记的名称属性（在这个例子中是 "<code>/searchSubmit</code>"）简单地创建了一个 bean。这个动作的 JavaBean 属性像任何 Spring bean 一样被填充： </p>
<br />
<a name="N101ED"><strong>清单 6. 在 Spring 环境中注册一个 Struts 动作</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
            &lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
            "http://www.springframework.org/dtd/spring-beans.dtd"&gt;
            &lt;beans&gt;
            &lt;bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/&gt;
            &lt;bean name="/searchSubmit"
            class="ca.nexcel.books.actions.SearchSubmit"&gt;
            &lt;property name="bookService"&gt;
            &lt;ref bean="bookService"/&gt;
            &lt;/property&gt;
            &lt;/bean&gt;
            &lt;/beans&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N101F4"><span class="atitle">动作委托的优点</span></a></p>
<p>动作委托解决方法是这三种方法中最好的。Struts 动作不了解 Spring，不对代码作任何改变就可用于非 Spring 应用程序中。<code>RequestProcessor</code> 的改变不会影响它，并且它可以利用 Spring AOP 特性的优点。 </p>
<p>动作委托的优点不止如此。一旦让 Spring 控制您的 Struts 动作，您就可以使用 Spring 给动作补充更强的活力。例如，没有 Spring 的话，所有的 Struts 动作都必须是线程安全的。如果您设置 <code>&lt;bean&gt;</code> 标记的 singleton 属性为&#8220;false&#8221;，那么不管用何种方法，您的应用程序都将在每一个请求上有一个新生成的动作对象。您可能不需要这种特性，但是把它放在您的工具箱中也很好。您也可以利用 Spring 的生命周期方法。例如，当实例化 Struts 动作时，<code>&lt;bean&gt;</code> 标记的 init-method 属性被用于运行一个方法。类似地，在从容器中删除 bean 之前，destroy-method 属性执行一个方法。这些方法是管理昂贵对象的好办法，它们以一种与 Servlet 生命周期相同的方式进行管理。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N1020D"><span class="atitle">拦截 Struts</span></a></p>
<p>前面提到过，通过将 Struts 动作委托给 Spring 框架而整合 Struts 和 Spring 的一个主要的优点是：您可以将 Spring 的 AOP 拦截器应用于您的 Struts 动作。通过将 Spring 拦截器应用于 Struts 动作，您可以用最小的代价处理横切关注点。</p>
<p>虽然 Spring 提供很多内置拦截器，但是我将向您展示如何创建自己的拦截器并把它应用于一个 Struts 动作。为了使用拦截器，您需要做三件事：</p>
<ol>
    <li>创建拦截器。
    <li>注册拦截器。
    <li>声明在何处拦截代码。 </li>
</ol>
<p>这看起来非常简单的几句话却非常强大。例如，在清单 7 中，我为 Struts 动作创建了一个日志记录拦截器。 这个拦截器在每个方法调用之前打印一句话：</p>
<br />
<a name="N1022D"><strong>清单 7. 一个简单的日志记录拦截器</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">package ca.nexcel.books.interceptors;
            import org.springframework.aop.MethodBeforeAdvice;
            import java.lang.reflect.Method;
            public class LoggingInterceptor implements MethodBeforeAdvice {
            public void before(Method method, Object[] objects, Object o) throws Throwable {
            System.out.println("logging before!");
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>这个拦截器非常简单。<code>before()</code> 方法在拦截点中每个方法之前运行。在本例中，它打印出一句话，其实它可以做您想做的任何事。下一步就是在 Spring 配置文件中注册这个拦截器，如清单 8 所示：</p>
<br />
<a name="N1023F"><strong>清单 8. 在 Spring 配置文件中注册拦截器</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
            &lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
            "http://www.springframework.org/dtd/spring-beans.dtd"&gt;
            &lt;beans&gt;
            &lt;bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/&gt;
            &lt;bean name="/searchSubmit"
            class="ca.nexcel.books.actions.SearchSubmit"&gt;
            &lt;property name="bookService"&gt;
            &lt;ref bean="bookService"/&gt;
            &lt;/property&gt;
            &lt;/bean&gt;
            &lt;!--  Interceptors --&gt;
            &lt;bean name="logger"
            class="ca.nexcel.books.interceptors.LoggingInterceptor"/&gt; <span class="boldcode">|(1)</span>
            &lt;!-- AutoProxies --&gt;
            &lt;bean name="loggingAutoProxy"
            class="org.springframework.aop.framework.autoproxy.
            BeanNameAutoProxyCreator"&gt; <span class="boldcode">|(2)</span>
            &lt;property name="beanNames"&gt;
            &lt;value&gt;/searchSubmit&lt;/valuesgt; <span class="boldcode">|(3)</span>
            &lt;/property&gt;
            &lt;property name="interceptorNames"&gt;
            &lt;list&gt;
            &lt;value&gt;logger&lt;/value&gt; <span class="boldcode">|(4)</span>
            &lt;/list&gt;
            &lt;/property&gt;
            &lt;/bean&gt;
            &lt;/beans&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>您可能已经注意到了，清单 8 扩展了 <a href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#code6" cmimpressionsent="1">清单 6</a> 中所示的应用程序以包含一个拦截器。具体细节如下：</p>
<ul>
    <li>在 (1) 处，我注册了这个拦截器。
    <li>在 (2) 处，我创建了一个 bean 名称自动代理，它描述如何应用拦截器。还有其他的方法定义拦截点，但是这种方法常见而简便。
    <li>在 (3) 处，我将 Struts 动作注册为将被拦截的 bean。如果您想要拦截其他的 Struts 动作，则只需要在 "beanNames" 下面创建附加的 <code>&lt;value&gt;</code> 标记。
    <li>在 (4) 处，当拦截发生时，我执行了在 (1) 处创建的拦截器 bean 的名称。这里列出的所有拦截器都应用于&#8220;beanNames&#8221;。 </li>
</ul>
<p>就是这样。就像这个例子所展示的，将您的 Struts 动作置于 Spring 框架的控制之下，为处理您的 Struts 应用程序提供了一系列全新的选择。在本例中，使用动作委托可以轻松地利用 Spring 拦截器提高 Struts 应用程序中的日志记录能力。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N1026F"><span class="atitle">结束语</span></a></p>
<p>在本文中，您已经学习了将 Struts 动作整合到 Spring 框架中的三种窍门。使用 Spring 的 <code>ActionSupport</code> 来整合 Struts（第一种窍门中就是这样做的）简单而快捷，但是会将 Struts 动作与 Spring 框架耦合在一起。如果您需要将应用程序移植到一个不同的框架，则需要重写代码。第二种解决方法通过委托 <code>RequestProcessor</code> 巧妙地解开代码的耦合，但是它的可扩展性不强，并且当 Struts 的 <code>RequestProcessor</code> 变成一系列命令时，这种方法就持续不了很长时间。第三种方法是这三种方法中最好的：将 Struts 动作委托给 Spring 框架可以使代码解耦，从而使您可以在您的 Struts 应用程序中利用 Spring 的特性（比如日志记录拦截器）。</p>
<p>三种 Struts-Spring 整合窍门中的每一种都被实现成一个完整可用的应用程序。请参阅 <a href="http://www.ibm.com/developerworks/cn/java/j-sr2.html#download" cmimpressionsent="1">下载</a> 部分仔细研究它们。</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/290767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-08-12 10:30 <a href="http://www.blogjava.net/caizh2009/articles/290767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>整合spring+struts 1.x+ibatis ,加载spring配置文件路径问题（TOMCAT/BIN）</title><link>http://www.blogjava.net/caizh2009/articles/290761.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Wed, 12 Aug 2009 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/290761.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/290761.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/290761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/290761.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/290761.html</trackback:ping><description><![CDATA[ApplicationContext ctx=new&nbsp; <br />
&nbsp;&nbsp;FileSystemXmlApplicationContext(request.getSession().getServletContext().getRealPath("")+"/WEB-INF/applicationContext.xml");&nbsp;<br />
<br />
如果在ACTION里面直接加载，始终会在TOMCAT/BIN下面查找这个路径查找配置文件，那只有用绝对路径了<br />
<br />
另外一种解决方法：<br />
&nbsp;&nbsp; ClassPathXmlApplicationContext ctxss = new ClassPathXmlApplicationContext("applicationContext.xml");<br />
&nbsp;&nbsp;BeanFactory ctx=(BeanFactory)ctxss; <br />
这样就能用相对路径了
<img src ="http://www.blogjava.net/caizh2009/aggbug/290761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-08-12 10:06 <a href="http://www.blogjava.net/caizh2009/articles/290761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH笔记四 整合struts2 </title><link>http://www.blogjava.net/caizh2009/articles/290671.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 11 Aug 2009 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/290671.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/290671.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/290671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/290671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/290671.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: SSH笔记四 整合struts2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;就好像骑自行车去远行，最开始的时候总是激情澎湃，到了路上越走越发现只是在苦苦的支撑，不过等你走完全程，看那些凝固在照片中的风景与记忆，你只有一种感觉，满足。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/articles/290671.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/290671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-08-11 12:32 <a href="http://www.blogjava.net/caizh2009/articles/290671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH笔记三 反向生成DAO 优化开发目录 </title><link>http://www.blogjava.net/caizh2009/articles/290670.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 11 Aug 2009 04:31:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/290670.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/290670.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/290670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/290670.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/290670.html</trackback:ping><description><![CDATA[<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/juxuejian/archive/2009/08/09/290462.html">SSH笔记三 反向生成DAO 优化开发目录</a> </div>
<br />
<span style="font-family: 微软雅黑">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;感谢昨天有人提醒用maven来管理所有依赖，今天稍微看了一下，终于把所有依赖交予了maven。也算对maven的掌握更进了一步。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSH笔记目录<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-family: 微软雅黑">&nbsp;</span><span style="color: red"><span style="background-color: #808000"><span style="color: red"><span style="background-color: #ffffff"><span style="color: red; background-color: #999999"><span style="color: red; background-color: #ffffff"><u><span style="color: red"><span style="background-color: #808000"><span style="color: red"><span style="background-color: #ffffff"><span style="color: red; background-color: #999999"><span style="color: red; background-color: #ffffff"><u><a href="http://www.blogjava.net/juxuejian/archive/2009/08/07/290268.html"><span style="color: red"><span style="background-color: #808000"><span style="color: red"><span style="background-color: #ffffff"><span style="color: red; background-color: #999999"><span style="color: red; background-color: #ffffff"><u><span style="color: red"><span style="background-color: #808000"><span style="color: red"><span style="background-color: #ffffff"><span style="color: red; background-color: #999999"><span style="color: red; background-color: #ffffff"><u><span style="font-family: 微软雅黑">SSH笔记一&nbsp; 用maven构建项目</span></u></span></span></span></span></span></span></u></span></span></span></span></span></span></a></u></span></span></span></span></span></span></u><span style="font-family: 微软雅黑">(源码下载</span><a title="ssim.rar" href="http://www.blogjava.net/Files/juxuejian/ssim.rar"><span style="font-family: 微软雅黑">ssim1.rar</span></a><span style="font-family: 微软雅黑">)</span></span><br />
</span></span></span></span><span style="font-family: 微软雅黑">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: red"><span style="background-color: #3366ff"><span style="color: red; background-color: #00ccff"><span style="background-color: #ffffff"><span style="color: red"><span style="color: red"><span style="font-family: 微软雅黑"><u><a href="http://www.blogjava.net/juxuejian/archive/2009/08/08/290346.html"><span style="color: red"><span style="background-color: #3366ff"><span style="color: red; background-color: #00ccff"><span style="background-color: #ffffff"><span style="color: red"><span style="color: red"><span style="font-family: 微软雅黑"><u>SSH笔记二&nbsp;&nbsp;整合hibernate和spring</u></span></span></span></span></span></span></span></a></u>（源码下载</span><a title="ssim2.rar" href="http://www.blogjava.net/Files/juxuejian/ssim2.rar"><span style="font-family: 微软雅黑">ssim2-maven.rar</span></a><span style="font-family: 微软雅黑">）</span></span></span></span><br />
</span></span><span style="font-family: 微软雅黑">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: red"><span style="background-color: #00ccff"><span style="font-family: 微软雅黑"><span style="color: red">SSH笔记三&nbsp;&nbsp;反向生成DAO&nbsp;&nbsp;优化开发目录（源码下载<a title="ssim3-dao.rar" href="http://www.blogjava.net/Files/juxuejian/ssim3.rar">ssim3-dao.rar</a><span style="font-family: 微软雅黑">）</span></span><br />
</span></span></span></span></span><span style="font-family: 微软雅黑">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: red"><span style="font-family: 微软雅黑">SSH笔记四&nbsp; 整合struts2<br />
</span></span></strong><span style="font-family: 微软雅黑">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 微软雅黑"><strong><span style="color: red">SSH笔记五&nbsp; 整合Tiles2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red">SSH笔记六&nbsp; 完成登录验证</span></span></strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 微软雅黑">今天的任务是——<font style="font-family: ">反</font></span>向生成DAO并优化开发目录。完成的效果如下(左边为包视图、右边为文件视图)：<br />
</span>
<div align="center"><span style="font-family: 微软雅黑"><img style="width: 277px; height: 441px" height="441" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/dao5.jpg" width="277" border="0" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img style="width: 297px; height: 432px" height="432" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/dao6.jpg" width="297" border="0" /> </span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 微软雅黑">1.&nbsp; 反向生成DAO并测试（上次我们已经在ssimdb中建立了ssim_user表）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.1&nbsp; hibernate反向工程，切换到 Database Explorer ，选中ssim_user，右键选择Hibernate Reverse Engineering，弹出如下视图<br />
<div align="center"><img height="475" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/dao2.jpg" width="481" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.2&nbsp; 点击finish，完成反向工程后项目发生了如下变化
<div align="center"><img height="271" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/dao3.jpg" width="265" border="0" /></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.测试DAO并优化开发目录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.1创建测试父类&nbsp; SpringTestCase.java，如下<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;net.selitech.ssim.utils;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;junit.framework.TestCase;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.ApplicationContext;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SpringTestCase&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;TestCase&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;ApplicationContext&nbsp;context;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUp(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassPathXmlApplicationContext(getPathName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;tearDown(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;String&nbsp;getPathName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">application-context.xml</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Object&nbsp;getBean(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;context.getBean(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;ApplicationContext&nbsp;getContext()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;context;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.2&nbsp; 测试SimmUserDAO<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;net.selitech.net.dao;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;net.selitech.ssim.dao.SsimUser;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;net.selitech.ssim.dao.SsimUserDAO;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;net.selitech.ssim.utils.SpringTestCase;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">:&nbsp;juxuejian<br />
&nbsp;*&nbsp;@filename:&nbsp;SsimUserDAOTest.java<br />
&nbsp;*&nbsp;@date:&nbsp;Aug&nbsp;9,&nbsp;2009&nbsp;,&nbsp;9:14:54&nbsp;PM<br />
&nbsp;*&nbsp;@description&nbsp;:<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SsimUserDAOTest&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;SpringTestCase{<br />
&nbsp;&nbsp;&nbsp;&nbsp;SsimUserDAO&nbsp;ssimUserDAO;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUp(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.setUp();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssimUserDAO</span><span style="color: #000000">=</span><span style="color: #000000">(SsimUserDAO)getBean(</span><span style="color: #000000">"</span><span style="color: #000000">SsimUserDAO</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;testSsimUserDAO(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">SsimUser</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;list</span><span style="color: #000000">=</span><span style="color: #000000">ssimUserDAO.findAll();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(SsimUser&nbsp;s:list){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s.getUserEmail()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">\t</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">s.getUserRealname());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.3&nbsp; 如果你正确的输出了邮件地址以及姓名，恭喜你<img height="20" alt="" src="http://www.blogjava.net/Emoticons/QQ/34.gif" width="20" border="0" />，如果没有，不要灰心，再来一次，看哪里有出入，仔细比对。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接下来我们讲对开发目录进行优化<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp; 优化目录以及配置文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.1&nbsp; 将数据库链接信息提取为配置文件&nbsp; ssimdb-config.properties，如下<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />#&nbsp;database&nbsp;connection&nbsp;to&nbsp;data&nbsp;warehouse<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />#<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />ssimdb.mysql.url</span><span style="color: #000000">=</span><span style="color: #000000">jdbc\:mysql\:</span><span style="color: #008000">//</span><span style="color: #008000">localhost\:3306/ssimdb</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">ssimdb.mysql.username</span><span style="color: #000000">=</span><span style="color: #000000">root<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />#密码设置为自己的密码。tomcyj是我的密码哈<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />ssimdb.mysql.password</span><span style="color: #000000">=</span><span style="color: #000000">tomcyj<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />#&nbsp;debug&nbsp;information<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />#<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />hibernate.show_sql</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.2&nbsp; 修改application-conten.xml，如下<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">import&nbsp;</span><span style="color: #ff0000">resource</span><span style="color: #0000ff">="beans/data-source.xml"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">import&nbsp;</span><span style="color: #ff0000">resource</span><span style="color: #0000ff">="beans/ssim-dao.xml"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="configurator"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="locations"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">ssimdb-config.properties</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.3&nbsp; 正如你看到的，我们将数据连接信息以及DAO配置分别放在了 data-source.xml和ssim-dao.xml中,那我们就来创建他们。<br />
data-source.xml<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="ssimdb.TxManager"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.hibernate3.HibernateTransactionManager"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="ssimdb.session.factory"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="ssimdb.mssql"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.commons.dbcp.BasicDataSource"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destroy-method</span><span style="color: #0000ff">="close"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="driverClassName"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="com.mysql.jdbc.Driver"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="url"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="${ssimdb.mysql.url}"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="username"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="${ssimdb.mysql.username}"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="password"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="${ssimdb.mysql.password}"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="maxIdle"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="10"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="minIdle"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="2"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="maxActive"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="10"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="ssimdb.session.factory"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="dataSource"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="ssimdb.mssql"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="hibernateProperties"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.dialect"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.dialect.MySQLDialect<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="mappingResources"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">dao/SsimUser.hbm.xml</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span></div>
ssim-dao.xml<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="SsimUserDAO"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="net.selitech.ssim.dao.SsimUserDAO"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="ssimdb.session.factory"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到了这里，运行一下SsimUserDAOTest，看看结果，如果顺利通过，该恭喜你完成了我们今天的任务了。明天再接再历<img height="20" alt="" src="http://www.blogjava.net/Emoticons/QQ/05.gif" width="20" border="0" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下一次&nbsp;&nbsp;<span style="color: red"><span style="font-family: 微软雅黑">SSH笔记四&nbsp; 整合struts2</span></span> <br />
</span>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/290670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-08-11 12:31 <a href="http://www.blogjava.net/caizh2009/articles/290670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH笔记二 整合hibernate和spring </title><link>http://www.blogjava.net/caizh2009/articles/290668.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 11 Aug 2009 04:30:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/290668.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/290668.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/290668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/290668.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/290668.html</trackback:ping><description><![CDATA[<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/juxuejian/archive/2009/08/08/290346.html">SSH笔记二 整合hibernate和spring</a> </div>
<span style="font-family: 微软雅黑">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red">(感谢&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl00_NameLink" href="http://www.blogjava.net/john/" target="_blank">john locke</a>的提醒，已将依赖交予maven管理，msysql包可能需在maven中手动添加)</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;重新整理起来才发觉，搭建一个SSH框架是件很繁琐的事情。不过总觉得自己搭建的用起来才觉得得心应手，所以尽量的从中来发现一些乐趣。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSH笔记目录<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;<span style="color: red"><span style="background-color: #808000"><span style="color: red"><span style="background-color: #ffffff"><span style="color: red; background-color: #999999"><span style="color: red; background-color: #ffffff"><u><span style="color: red"><span style="background-color: #808000"><span style="color: red"><span style="background-color: #ffffff"><span style="color: red; background-color: #999999"><span style="color: red; background-color: #ffffff"><u><a href="http://www.blogjava.net/juxuejian/archive/2009/08/07/290268.html"><span style="color: red"><span style="background-color: #808000"><span style="color: red"><span style="background-color: #ffffff"><span style="color: red; background-color: #999999"><span style="color: red; background-color: #ffffff"><u><span style="color: red"><span style="background-color: #808000"><span style="color: red"><span style="background-color: #ffffff"><span style="color: red; background-color: #999999"><span style="color: red; background-color: #ffffff"><u>SSH笔记一&nbsp; 用maven构建项目</u></span></span></span></span></span></span></u></span></span></span></span></span></span></a></u></span></span></span></span></span></span></u>(源码下载<a title="ssim.rar" href="http://www.blogjava.net/Files/juxuejian/ssim.rar">ssim1.rar</a>)</span><br />
</span></span></span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red"><span style="background-color: #3366ff"><span style="color: red; background-color: #00ccff">SSH笔记二&nbsp;&nbsp;整合hibernate和spring（源码下载<a title="ssim2.rar" href="http://www.blogjava.net/Files/juxuejian/ssim2.rar">ssim2-maven.rar</a>）<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red">SSH笔记三&nbsp;&nbsp;反向生成DAO&nbsp;&nbsp;优化开发目录</span><br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red">SSH笔记四&nbsp; 整合struts2<br />
</span></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: red">SSH笔记五&nbsp; 整合Tiles2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red">SSH笔记六&nbsp; 完成登录验证</span></span></strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天的任务是——<font face="微软雅黑">整合hibernate和spring。完成的效果如下(左边为包视图、右边为文件视图)：<br />
<div align="center"><img height="239" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/ssim_spring.jpg" width="262" border="0" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img style="width: 280px; height: 362px" height="362" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/ssim_files2.jpg" width="280" border="0" /></div>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>1.&nbsp; 准备工作（用mysql5新建数据库，暂且命名为ssimdb）</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.1&nbsp; 安装<a href="http://www.mysql.cn/"><u>mysql5</u></a>（略），安装完成之后可以使用<a href="http://www.navicat.net.cn/"><u>Navicat8</u></a>来进行管理mysql；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.2&nbsp; 创建数据库&nbsp; ssimdb；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.3&nbsp; 创建表&nbsp; ssim_user<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 421px; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #0000ff">drop</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">exists</span><span style="color: #000000">&nbsp;ssimdb.ssim_user;<br />
</span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #008080">/*</span><span style="color: #008080">==============================================================</span><span style="color: #008080">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #008080">/*</span><span style="color: #008080">&nbsp;Table:&nbsp;ssim_user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #008080">/*</span><span style="color: #008080">==============================================================</span><span style="color: #008080">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;ssimdb.ssim_user(<br />
</span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">user_id</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">int</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">11</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;auto_increment&nbsp;comment&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">主键</span><span style="color: #ff0000">'</span><span style="color: #000000">,<br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;group_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">int</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">11</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;comment&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">小组</span><span style="color: #ff0000">'</span><span style="color: #000000">,<br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;user_email&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">national</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">50</span><span style="color: #000000">)&nbsp;comment&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Email作为用户名</span><span style="color: #ff0000">'</span><span style="color: #000000">,<br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;user_password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">national</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">50</span><span style="color: #000000">)&nbsp;comment&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">密码</span><span style="color: #ff0000">'</span><span style="color: #000000">,<br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;user_realname&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">national</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">20</span><span style="color: #000000">)&nbsp;comment&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">真实姓名</span><span style="color: #ff0000">'</span><span style="color: #000000">,<br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;user_sex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">national</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">20</span><span style="color: #000000">)&nbsp;comment&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">性别</span><span style="color: #ff0000">'</span><span style="color: #000000">,<br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;user_job&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">national</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">20</span><span style="color: #000000">)&nbsp;comment&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">工作</span><span style="color: #ff0000">'</span><span style="color: #000000">,<br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;user_phone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">national</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">20</span><span style="color: #000000">)&nbsp;comment&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">电话</span><span style="color: #ff0000">'</span><span style="color: #000000">,<br />
</span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;user_city&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">national</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">20</span><span style="color: #000000">)&nbsp;comment&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">城市</span><span style="color: #ff0000">'</span><span style="color: #000000">,<br />
</span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;user_last_login&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">datetime</span><span style="color: #000000">&nbsp;comment&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">最后登录时间</span><span style="color: #ff0000">'</span><span style="color: #000000">,<br />
</span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;user_register&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">datetime</span><span style="color: #000000">&nbsp;comment&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">注册时间</span><span style="color: #ff0000">'</span><span style="color: #000000">,<br />
</span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">&nbsp;(</span><span style="color: #ff00ff">user_id</span><span style="color: #000000">)<br />
</span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">)type&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;InnoDB;<br />
</span><span style="color: #008080">20</span>&nbsp;<span style="color: #0000ff">alter</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;ssimdb.ssim_user&nbsp;comment&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">用户信息表</span><span style="color: #ff0000">'</span><span style="color: #000000">;<br />
<span style="color: #008080">21</span>&nbsp;<span style="color: #3366ff"><span style="color: #0000ff">insert&nbsp;into </span></span><font face="微软雅黑">ssim_user&nbsp;<span style="color: #0000ff">values</span> ('1', '1', <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#106;&#117;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;&#39;">'ju@126.com'</a>, '123456', '鞠学见', '男', 'IT', '12345678912', '成都', '2009-08-04 17:1<span style="color: #008080">22</span> 1:34', '2009-08-03 17:11:53');</font></span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>2.&nbsp; 在myeclipse6.5 中新建mysql链接<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.1&nbsp; 打开Windows-Open Perspective-Myeclipse Database Explorer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.2&nbsp; 新建连接，new<br />
<div align="center"><img style="width: 462px; height: 324px" height="324" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/mysql.jpg" width="462" border="0" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img style="width: 188px; height: 320px" height="320" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/mysql2.jpg" width="188" border="0" /><br />
</div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.3打开连接，进行测试，测试成功，则准备工作完成。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>3.&nbsp; 整合spring（在myeclipse中操作）<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.1&nbsp; 回到Package Explorer选中项目ssim，右键-Myeclipse-Add Spring capabilitities，弹出下面窗口，选择spring2.5（如果不知道选择那些包，可以全部选中），其他选项如图所示<br />
<div align="center"><img height="458" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/spring1.jpg" width="502" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.2&nbsp; 选择 next，进入下一步<br />
<div align="center"><img height="355" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/spring2.jpg" width="496" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.2&nbsp; 点击&nbsp; finish，完成spring的添加。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.3&nbsp; 为了使项目开发目录更据可读性，我们将 application-content.xml 移至 src/main/resources 中，并新建net.selitech.ssim.dao，为集成hibernate准备，现在项目的package视图如下<br />
<div align="center"><img height="239" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/ssim_spring.jpg" width="262" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red">3.4&nbsp; 修改 .springBeans，如下（否者在添加hibernate的时，将找不到spring配置文件）</span><br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #0000ff">&lt;</span><span style="color: #800000">beansProjectDescription</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">version</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">version</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">pluginVersion</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;![CDATA[</span><span style="color: #808080">2.0.4.zmyeclipse650200806</span><span style="color: #0000ff">]]&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">pluginVersion</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">configSuffixes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">configSuffix</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;![CDATA[</span><span style="color: #808080">xml</span><span style="color: #0000ff">]]&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">configSuffix</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">configSuffixes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">enableImports</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;![CDATA[</span><span style="color: #808080">false</span><span style="color: #0000ff">]]&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">enableImports</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">configs</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">src/main/resources/application-context.xml</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">configs</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">configSets</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">configSets</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">springVersion</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">2.5</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">springVersion</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">15</span>&nbsp;<span style="color: #0000ff">&lt;/</span><span style="color: #800000">beansProjectDescription</span><span style="color: #0000ff">&gt;</span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;4.&nbsp; 整合hibernate<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.1&nbsp; 回到Package Explorer选中项目ssim，右键-Myeclipse-Add&nbsp;Hibernate capabilitities，弹出下面窗口，选择hibernate3.2，点击next<br />
<div align="center"><img style="width: 392px; height: 360px" height="360" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/hibernate.jpg" width="392" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.2&nbsp; 让hibernate使用spring的配置文件（application-content.xml），点击next<br />
<div align="center"><img style="width: 423px; height: 313px" height="313" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/hibernate2.jpg" width="423" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.3&nbsp; 确认spring配置文件路径，并命名 SessionFactory Id 为 sessionFactory，点击next<br />
<div align="center"><img alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/hibernate3.jpg" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.4&nbsp; 选择mysql数据源，并命名Bean Id 为 dataSource，点击next<br />
<div align="center"><img style="width: 481px; height: 426px" height="426" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/hibernate4.jpg" width="481" border="0" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.5&nbsp; 不创建sessionfactory class，点进finish，然后点击 keep existing，完成hibernate与spring的整合。<br />
</font></span>
<div align="center"><img height="308" alt="" src="http://www.blogjava.net/images/blogjava_net/juxuejian/hibernate5.jpg" width="469" border="0" /></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 微软雅黑">&nbsp;充实的一天要结束了<span style="color: red"><span style="color: #000000">。明天继续</span><img height="20" alt="" src="http://www.blogjava.net/Emoticons/QQ/17.gif" width="20" border="0" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">下一讲</span>&nbsp; <span style="color: red">SSH笔记三&nbsp;&nbsp;反向生成DAO&nbsp;&nbsp;优化开发目录<br />
</span></span></span>
<img src ="http://www.blogjava.net/caizh2009/aggbug/290668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-08-11 12:30 <a href="http://www.blogjava.net/caizh2009/articles/290668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH笔记一 用maven构建项目</title><link>http://www.blogjava.net/caizh2009/articles/290667.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 11 Aug 2009 04:29:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/290667.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/290667.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/290667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/290667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/290667.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: SSH笔记一 用maven构建项目 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;迷迷糊糊的接触java也有大半年之久了，期间一直用java来开发web项目，从最开始的helloworld，到jdbc链接数据库，到现在的用struts、hibernate、spring完成一个项目，收获颇多。&nbsp;&nbsp;&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/articles/290667.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/290667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-08-11 12:29 <a href="http://www.blogjava.net/caizh2009/articles/290667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2.5中基于注释的IoC</title><link>http://www.blogjava.net/caizh2009/articles/290019.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Thu, 06 Aug 2009 00:37:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/290019.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/290019.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/290019.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/290019.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/290019.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Spring2.5中基于注释的IoC关键字: spring2.5 注释 ioc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于注释（Annotation）的配置有越来越流行的趋势，Spring 2.5 顺应这种趋势，提供了完全基于注释配置 Bean、装配 Bean 的功能，您可以使用基于注释的 Spring IoC 替换原来基于 XML 的配置。&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/articles/290019.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/290019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-08-06 08:37 <a href="http://www.blogjava.net/caizh2009/articles/290019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSPX</title><link>http://www.blogjava.net/caizh2009/articles/272036.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Thu, 21 May 2009 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/272036.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/272036.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/272036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/272036.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/272036.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: 宋体">看看现存的</span><span style="font-family: Times New Roman">Java web</span><span style="font-family: 宋体">应用程序框架，无一例外的要求花费大量的时间与精力后才可投入生产。对于大多数开发人员来说想要的东西很简单：友好，易于学习并且还具有生产力。因此我们开发了</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">。</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">的主要目标就是打造成为一个&#8220;友好的开发者&#8221;框架。因为</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">只基于标准的</span><span style="font-family: Times New Roman">HTML</span><span style="font-family: 宋体">标签和简单的</span><span style="font-family: Times New Roman">Java POJO</span><span style="font-family: 宋体">：</span></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Times New Roman"><span style="font-size: small">1.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: small">JSPX</span></span><span style="font-size: small"><span style="font-family: 宋体">易于学习。我们已经做到让一些只有</span><span style="font-family: Times New Roman">HTML</span><span style="font-family: 宋体">和</span><span style="font-family: Times New Roman">Java</span><span style="font-family: 宋体">基础，而对其它框架一无所知的开发新手在很短的时间内就上手投入生产。</span></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Times New Roman"><span style="font-size: small">2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small"><span style="font-family: 宋体">开箱即用</span><span style="font-family: Times New Roman">(out of the box)</span><span style="font-family: 宋体">的组件比如说</span><span style="font-family: Times New Roman">DataTable</span><span style="font-family: 宋体">，</span><span style="font-family: Times New Roman">ListTable</span><span style="font-family: 宋体">，</span><span style="font-family: Times New Roman">Validators</span><span style="font-family: 宋体">和</span><span style="font-family: Times New Roman">Capatcha</span><span style="font-family: 宋体">已经非常强大的，对于一般的需求绰绰有余。</span></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Times New Roman"><span style="font-size: small">3.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small"><span style="font-family: 宋体">通过</span><span style="font-family: Times New Roman">Java API</span><span style="font-family: 宋体">来利用声明好的代码来与</span><span style="font-family: Times New Roman">HTML</span><span style="font-family: 宋体">上那些声明好的控件进行交互，是</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">框架的核心。</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 14pt; color: #ff6600; font-family: 宋体">声明代码是如何使得</span><span style="font-size: 14pt; color: #ff6600"><span style="font-family: Times New Roman">JSPX</span></span><span style="font-size: 14pt; color: #ff6600; font-family: 宋体">与众不同呢</span><span style="font-size: 14pt; color: #ff6600"><span style="font-family: Times New Roman">?</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">已经足够智能——你无需告诉它怎么做，它就已经知道了你的意图。原因就在于你只需要在</span><span style="font-family: Times New Roman">HTML</span><span style="font-family: 宋体">的页面上声明一些属性，从而来改变行为结果。比如说吧，有一个</span><span style="font-family: Times New Roman">DataTable</span><span style="font-family: 宋体">组件，你把它的&#8220;</span><span style="font-family: Times New Roman">AutoBind</span><span style="font-family: 宋体">&#8221;属性设置为&#8220;</span><span style="font-family: Times New Roman">True</span><span style="font-family: 宋体">&#8221;后，它会自动的连上数据库去获取数据填充表格，不需要任何</span><span style="font-family: Times New Roman">Java</span><span style="font-family: 宋体">代码。</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: 宋体">下面的就是</span><span style="font-family: Times New Roman">DataTable</span><span style="font-family: 宋体">的实例：</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: 宋体"><img title="点击查看原始大小图片" height="163" alt="" src="http://java.dzone.com/sites/all/files/fig_0.png" width="650" /></span></span></p>
<p><span style="font-family: 宋体">
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: 宋体">现在我们来个关于</span><span style="font-family: Times New Roman">HelloWorld</span><span style="font-family: 宋体">的</span><span style="font-family: Times New Roman">QuickStart</span><span style="font-family: 宋体">。用</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">开发&#8220;</span><span style="font-family: Times New Roman">HelloWorld</span><span style="font-family: 宋体">&#8221;非常简单。只需要三步：</span></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-size: small"><span style="font-family: Times New Roman">1.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">配置</span><span style="font-family: Times New Roman">web.xml</span><span style="font-family: 宋体">文件。我们得注册两个</span><span style="font-family: Times New Roman">servlets</span><span style="font-family: 宋体">并且选择你的</span><span style="font-family: Times New Roman">URL pattern</span><span style="font-family: 宋体">：</span></span></p>
</span>
<div>
<div>
<div>Xml代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/news/4887-jspx-the-rapid-development-of-java-web-frameworks-from-cairo-egypt#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol>
    <li>&lt;servlet&gt;&nbsp;&nbsp; &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;display-name&gt;JspxHandler&lt;/display-name&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;JspxHandler&lt;/servlet-name&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;eg.java.net.web.jspx.engine.RequestHandler&lt;/servlet-class&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&lt;/servlet&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp; &nbsp;&nbsp;</li>
    <li>&lt;servlet&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;display-name&gt;ResourceHandler&lt;/display-name&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;ResourceHandler&lt;/servlet-name&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;eg.java.net.web.jspx.engine.ResourceHandler&lt;/servlet-class&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&lt;/servlet&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp; &nbsp;&nbsp;</li>
    <li>&lt;servlet-mapping&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;JspxHandler&lt;/servlet-name&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;*.jspx&lt;/url-pattern&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&lt;/servlet-mapping&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp; &nbsp;&nbsp;</li>
    <li>&lt;servlet-mapping&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;ResourceHandler&lt;/servlet-name&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/jspxEmbededResources/*&lt;/url-pattern&gt;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&lt;/servlet-mapping&gt;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none" name="code">&lt;servlet&gt;
&lt;display-name&gt;JspxHandler&lt;/display-name&gt;
&lt;servlet-name&gt;JspxHandler&lt;/servlet-name&gt;
&lt;servlet-class&gt;eg.java.net.web.jspx.engine.RequestHandler&lt;/servlet-class&gt;
&lt;/servlet&gt;
&lt;servlet&gt;
&lt;display-name&gt;ResourceHandler&lt;/display-name&gt;
&lt;servlet-name&gt;ResourceHandler&lt;/servlet-name&gt;
&lt;servlet-class&gt;eg.java.net.web.jspx.engine.ResourceHandler&lt;/servlet-class&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;JspxHandler&lt;/servlet-name&gt;
&lt;url-pattern&gt;*.jspx&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;ResourceHandler&lt;/servlet-name&gt;
&lt;url-pattern&gt;/jspxEmbededResources/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
</pre>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Times New Roman"><span style="font-size: small">2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small"><span style="font-family: 宋体">创建的</span><span style="font-family: Times New Roman">HTML</span><span style="font-family: 宋体">文件的扩展名就是你刚才选择的</span><span style="font-family: Times New Roman">URL pattern</span><span style="font-family: 宋体">。比如说，现在咱们在</span><span style="font-family: Times New Roman">WebRoot</span><span style="font-family: 宋体">文件夹下创建一个叫</span><span style="font-family: Times New Roman">FirstPage.jspx</span><span style="font-family: 宋体">的</span><span style="font-family: Times New Roman">HTML</span><span style="font-family: 宋体">文件：</span></span></p>
<p><span style="font-size: small">
<p><span style="font-family: 宋体"></p>
<div>
<div>
<div>Html代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/news/4887-jspx-the-rapid-development-of-java-web-frameworks-from-cairo-egypt#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol>
    <li>&lt;page&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&nbsp; &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:noNamespaceSchemaLocation="http://jspx-bay.sourceforge.net/jspx.xsd"&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controller="FirstPage"&nbsp;&gt;&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;html&gt;&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;head&gt;&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;http-equiv="Content-Type"&nbsp;content="text/html;&nbsp;charset=ISO-8859-1"&nbsp;/&gt;&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;jspx&nbsp;demo&lt;/title&gt;&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/head&gt;&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;body&gt;&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form&nbsp;method="post"&nbsp;enctype="multipart/form-data"&nbsp;&gt;&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;label&nbsp;id="resultLabel"&gt;&lt;/label&gt;&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form&gt;&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/body&gt;&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/html&gt;&nbsp;&nbsp;</span></li>
    <li>&lt;/page&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none" name="code">&lt;page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://jspx-bay.sourceforge.net/jspx.xsd"
controller="FirstPage" &gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /&gt;
&lt;title&gt;jspx demo&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form method="post" enctype="multipart/form-data" &gt;
&lt;label id="resultLabel"&gt;&lt;/label&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;/page&gt;
</pre>
</span></span>
<p style="margin-left: 21pt; text-indent: -21pt">&lt;!--[if !supportLists]--&gt;<span style="font-family: 'Times New Roman'"><br />
3.&nbsp;&nbsp;&nbsp; 创建一个Java类，该类必须与定义在HTML页面上的page标签&#8220;jspx.demo.web.controller.FirstPage&#8221;一致。<span style="color: #ff0000">(注：上面页面配置的&#8220;FirstPage&#8221;可能有误，应该是jspx.demo.web.controller.FirstPage)<br />
</span></span></p>
<div>
<div>
<div>Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/news/4887-jspx-the-rapid-development-of-java-web-frameworks-from-cairo-egypt#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol>
    <li>public&nbsp;class&nbsp;FirstPage&nbsp;extends&nbsp;Page&nbsp;{ &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;pageLoaded()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultLabel.setValue("Hello&nbsp;Web&nbsp;in&nbsp;JSPX"); &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Label&nbsp;resultLabel&nbsp;=&nbsp;new&nbsp;Label(); &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Label&nbsp;getResultLabel()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;resultLabel; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setResultLabel(Label&nbsp;result)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.resultLabel&nbsp;=&nbsp;result; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>}&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none" name="code">public class FirstPage extends Page {
protected void pageLoaded() {
resultLabel.setValue("Hello Web in JSPX");
}
public Label resultLabel = new Label();
public Label getResultLabel() {
return resultLabel;
}
public void setResultLabel(Label result) {
this.resultLabel = result;
}
}
</pre>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: 宋体">现在你可以启动</span><span style="font-family: Times New Roman">servlet</span><span style="font-family: 宋体">容器，访问</span><a href="http://localhost/jspx-demo/pages/FirstPage.jspx"><span style="font-family: Times New Roman">http://localhost/jspx-demo/pages/FirstPage.jspx</a><span style="font-family: Times New Roman">.</span></span><span style="font-family: 宋体">看看结果。</span><span style="color: red"><span style="font-family: Times New Roman">(</span></span><span style="color: red; font-family: 宋体">注：真实的</span><span style="color: red"><span style="font-family: Times New Roman">URL</span></span><span style="color: red; font-family: 宋体">与你实际配置有关。而且目前版本，所有的页面貌似只能放在&#8220;</span><span style="color: red"><span style="font-family: Times New Roman">pages</span></span><span style="color: red; font-family: 宋体">&#8221;下</span><span style="font-family: Times New Roman"><span style="color: red">)</span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 14pt; color: #ff6600"><span style="font-family: Times New Roman">FAQ</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="color: red; font-family: 宋体">在</span><span style="color: red"><span style="font-family: Times New Roman">JSPX</span></span><span style="color: red; font-family: 宋体">中的</span><span style="color: red"><span style="font-family: Times New Roman">HTML</span></span><span style="color: red; font-family: 宋体">文件与普通</span><span style="color: red"><span style="font-family: Times New Roman">HTML</span></span><span style="color: red; font-family: 宋体">文件有什么区别？</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: 宋体">看到上面的实例，除了根元素</span><span style="font-family: Times New Roman">&lt;page&gt;</span><span style="font-family: 宋体">外，我们可以看到页面用的其实还是标准的</span><span style="font-family: Times New Roman">HTML</span><span style="font-family: 宋体">标签。这也是</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">最重要的特性之一：将一个已经设计好的普通</span><span style="font-family: Times New Roman">HTML</span><span style="font-family: 宋体">页面包装成</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">页面，而且仅仅使用</span><span style="font-family: Times New Roman">&lt;page&gt;</span><span style="font-family: 宋体">标签即可。虽然</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">是构建于标准</span><span style="font-family: Times New Roman">HTML</span><span style="font-family: 宋体">标签的，但是当遇到一些稍微复杂点的业务</span><span style="font-family: Times New Roman">(</span><span style="font-family: 宋体">比如说查找数据库的记录集</span><span style="font-family: Times New Roman">)</span><span style="font-family: 宋体">，我们也可以使用一些非标准的</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">标签来解决</span><span style="font-family: Times New Roman">(</span><span style="font-family: 宋体">上文提到的</span><span style="font-family: Times New Roman">DataTable</span><span style="font-family: 宋体">，</span><span style="font-family: Times New Roman">ListTable</span><span style="font-family: 宋体">，</span><span style="font-family: Times New Roman">Validators</span><span style="font-family: 宋体">和</span><span style="font-family: Times New Roman">Capatcha</span><span style="font-family: 宋体">等等都是</span><span style="font-family: Times New Roman">)</span><span style="font-family: 宋体">。</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: red">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="color: red"><span style="font-family: Times New Roman">POJO</span></span><span style="color: red; font-family: 宋体">中到底定义的是什么？他们是如何绑定上</span><span style="color: red"><span style="font-family: Times New Roman">(hook )HTML</span></span><span style="color: red; font-family: 宋体">文件的？</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: 宋体">所谓的</span><span style="font-family: Times New Roman">Controller (</span><span style="font-family: 宋体">控制器</span><span style="font-family: Times New Roman">)</span><span style="font-family: 宋体">其实就是一个简单的</span><span style="font-family: Times New Roman">POJO</span><span style="font-family: 宋体">类，它表示了在</span><span style="font-family: Times New Roman">HTML</span><span style="font-family: 宋体">页面那。在上面的页面中，你可以在</span><span style="font-family: Times New Roman">&lt;page&gt;</span><span style="font-family: 宋体">标签中，看到&#8220;</span><span style="font-family: Times New Roman">Controller</span><span style="font-family: 宋体">&#8221;属性。它与你在后台定义的那个</span><span style="font-family: Times New Roman">Controller</span><span style="font-family: 宋体">类的完全限定名是完全一致的。而在这个</span><span style="font-family: Times New Roman">Controller</span><span style="font-family: 宋体">类中，你又可以定义其它</span><span style="font-family: Times New Roman">web</span><span style="font-family: 宋体">控件，然后在相应的</span><span style="font-family: Times New Roman">HTML</span><span style="font-family: 宋体">页面中添加相应的标签，并且令其</span><span style="font-family: Times New Roman">id</span><span style="font-family: 宋体">与</span><span style="font-family: Times New Roman">Controller</span><span style="font-family: 宋体">中定义的组件变量名一致即可。除此以外，通过使用</span><span style="font-family: Times New Roman">JspxBean</span><span style="font-family: 宋体">控件，还有更高级的绑定技术，很像</span><span style="font-family: Times New Roman">JSF</span><span style="font-family: 宋体">的</span><span style="font-family: Times New Roman">backing beans</span><span style="font-family: 宋体">哦。</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="color: red; font-family: 宋体">配置文件如何配置，像</span><span style="color: red"><span style="font-family: Times New Roman">struts-config.xml</span></span><span style="color: red; font-family: 宋体">吗？</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: 宋体">配置方法也是</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">最重要的优点之一。我们从一开始就想把烦人的配置文件给干掉。不像</span><span style="font-family: Times New Roman">JSF</span><span style="font-family: 宋体">和</span><span style="font-family: Times New Roman">Struts</span><span style="font-family: 宋体">，除了标准的</span><span style="font-family: Times New Roman">web.xml</span><span style="font-family: 宋体">外，</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">并不需要任何配置文件。因此，你可以认为</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">也是一个&#8220;</span><span style="font-family: Times New Roman">Zero Configurations Framework</span><span style="font-family: 宋体">&#8221;</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="color: red; font-family: 宋体">该框架有啥缺点吗？</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: 宋体">对于某些人来说，使用一个相对较新的框架被为是一种冒险。对于</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">来说，我们已经考察过其它框架，知道哪些东西应该取舍。对于已经采用了像</span><span style="font-family: Times New Roman">JSF</span><span style="font-family: 宋体">和</span><span style="font-family: Times New Roman">JSP</span><span style="font-family: 宋体">这些技术开发的项目，</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">也可以融入其中进行开发。对于已有的</span><span style="font-family: Times New Roman">JSP</span><span style="font-family: 宋体">页面，我们支持将其转成</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">页面。</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="color: red; font-family: 宋体">你们在实际工作中使用了此框架吗？结果如何？</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: 宋体">自</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">第一次公布以来，已经过去的</span><span style="font-family: Times New Roman">5</span><span style="font-family: 宋体">个多月了，它已经至少付诸于</span><span style="font-family: Times New Roman">5</span><span style="font-family: 宋体">个我们的企业项目。有些已经完全迁徙到</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">上去了。其它的由于已经用的是别的开发技术，</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">目前用于开发新的需求。所有的项目中，</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">都表现出了惊人的生产力。对于我们的开发周期，高层管理都非常满意。实际上，我们已经可以将原本计划数天干完的活，结果不到一小时就搞定了。</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="color: red; font-family: 宋体">这个框架将来打算怎么发展？</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">的第一次发布是在</span><span style="font-family: Times New Roman">2009</span><span style="font-family: 宋体">年的</span><span style="font-family: Times New Roman">1</span><span style="font-family: 宋体">月</span><span style="font-family: Times New Roman">1</span><span style="font-family: 宋体">号，但我们并不会因此而止步不前。我们的计划是每月都发布一次，除把一些</span><span style="font-family: Times New Roman">bug</span><span style="font-family: 宋体">给修复掉，还会添加新的特性。我们计划在下一个版本添加对</span><span style="font-family: Times New Roman">AJAX</span><span style="font-family: 宋体">的支持。当然，推出基于</span><span style="font-family: Times New Roman">NetBeans</span><span style="font-family: 宋体">的插件也会为此框架增色不少哦。</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: small">其实最主要的是我们还得依靠用户的不断反馈来驱动框架变得更有活力，同时还产生出更多的成功商业案例。</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="color: red; font-family: 宋体">如何开始使用？</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: red">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: small">我们的站点是</span></span><a href="http://jspx-bay.sourceforge.net/"><span style="font-size: 10pt; font-family: Arial"><span style="color: #800080">http://jspx-bay.sourceforge.net</span></a></span><span style="font-size: small"><span style="font-family: 宋体">，里面有很多教你如何开始使用</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">的内容。当然我们也提供了一个</span><span style="font-family: Times New Roman">demo</span><span style="font-family: 宋体">来演示框架的一些特性。当然我们非常乐意的支持有关</span><span style="font-family: Times New Roman">JSPX</span><span style="font-family: 宋体">的任何请求，我们的邮箱是：</span><span style="font-family: Times New Roman">support.jspx@gmail.com</span></span></p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/272036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-05-21 17:21 <a href="http://www.blogjava.net/caizh2009/articles/272036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>