﻿<?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-nbtymm-随笔分类-Spring框架</title><link>http://www.blogjava.net/nbtymm/category/11237.html</link><description>&lt;/br&gt;&lt;a href="http://www.fastonlineusers.com"&gt;&lt;b&gt;&lt;font color=red&gt;共有&lt;script src=http://fastonlineusers.com/online.php?d=bluedavy.blogjava.net&gt;&lt;/script&gt;人在同时阅读此Blog&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 03:26:48 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 03:26:48 GMT</pubDate><ttl>60</ttl><item><title>spring 生成Excel和PDF文件</title><link>http://www.blogjava.net/nbtymm/archive/2006/10/07/73622.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Sat, 07 Oct 2006 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/10/07/73622.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/73622.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/10/07/73622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/73622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/73622.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<span class="content">HTML页面并不总是向用户显示数据输出的最好方式，有时候需要生成不可改变的文件打印，PDF可能是种不错的选择。<br /><br />Spring支持从数据动态生成PDF或Excel文件<br /><br />下面这个简单实现的例子实现了spring输出PDF和Excel文件，为了使用Excel电子表格，你需要在你的classpath中加入poi-2.5.1.jar库文件，而对PDF文件，则需要iText.jar文件。它们都包含在Spring的主发布包中。<br /><br />下面是测试项目代码：<br /><br /><br />1、控制器配置代码<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="beanNameViewResolver"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        class</span><span style="COLOR: #0000ff">="org.springframework.web.servlet.view.BeanNameViewResolver"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="viewController"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="com.zhupan.spring.ViewController"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="urlMapping"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        class</span><span style="COLOR: #0000ff">="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="mappings"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">props</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="/view*.shtml"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">viewController</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">props</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br /> 3、用于Excel视图的视图子类化<br />为了在生成输出文档的过程中实现定制的行为，我们将继承合适的抽象类。对于Excel，这包括提供一个 org.springframework.web.servlet.view.document.AbstractExcelView的子类，并实现 buildExcelDocument方法。<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com.zhupan.view;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Date;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Map;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.HttpServletRequest;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.HttpServletResponse;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.apache.poi.hssf.usermodel.HSSFCell;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.apache.poi.hssf.usermodel.HSSFCellStyle;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.apache.poi.hssf.usermodel.HSSFDataFormat;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.apache.poi.hssf.usermodel.HSSFRow;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.apache.poi.hssf.usermodel.HSSFSheet;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.apache.poi.hssf.usermodel.HSSFWorkbook;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.web.servlet.view.document.AbstractExcelView;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_585_1434_Open_Image" onclick="this.style.display='none'; Codehighlighter1_585_1434_Open_Text.style.display='none'; Codehighlighter1_585_1434_Closed_Image.style.display='inline'; Codehighlighter1_585_1434_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_585_1434_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_585_1434_Closed_Text.style.display='none'; Codehighlighter1_585_1434_Open_Image.style.display='inline'; Codehighlighter1_585_1434_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ViewExcel </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> AbstractExcelView </span><span id="Codehighlighter1_585_1434_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_585_1434_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> buildExcelDocument(<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />             Map model, HSSFWorkbook workbook,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />             HttpServletRequest request, HttpServletResponse response)<br /><img id="Codehighlighter1_761_1429_Open_Image" onclick="this.style.display='none'; Codehighlighter1_761_1429_Open_Text.style.display='none'; Codehighlighter1_761_1429_Closed_Image.style.display='inline'; Codehighlighter1_761_1429_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_761_1429_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_761_1429_Closed_Text.style.display='none'; Codehighlighter1_761_1429_Open_Image.style.display='inline'; Codehighlighter1_761_1429_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception </span><span id="Codehighlighter1_761_1429_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_761_1429_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       HSSFSheet sheet </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> workbook.createSheet(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       sheet.setDefaultColumnWidth((</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       HSSFCell cell </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> getCell(sheet, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       setText(cell, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Spring Excel test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       HSSFCellStyle dateStyle </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> workbook.createCellStyle();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       dateStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">m/d/yy</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       cell </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> getCell(sheet, </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       cell.setCellValue(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Date());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       cell.setCellStyle(dateStyle);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       getCell(sheet, </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">).setCellValue(</span><span style="COLOR: #000000">458</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       HSSFRow sheetRow </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> sheet.createRow(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);<br /><img id="Codehighlighter1_1357_1424_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1357_1424_Open_Text.style.display='none'; Codehighlighter1_1357_1424_Closed_Image.style.display='inline'; Codehighlighter1_1357_1424_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1357_1424_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1357_1424_Closed_Text.style.display='none'; Codehighlighter1_1357_1424_Open_Image.style.display='inline'; Codehighlighter1_1357_1424_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />       </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_1357_1424_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1357_1424_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />             sheetRow.createCell(i).setCellValue(i </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />       }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />4、用于PDF视图的视图子类化<br />需要象下面一样继承org.springframework.web.servlet.view.document.AbstractPdfView，并实现buildPdfDocument()方法。 <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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com.zhupan.view;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.List;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Map;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.HttpServletRequest;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.HttpServletResponse;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.web.servlet.view.document.AbstractPdfView;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.lowagie.text.Document;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.lowagie.text.Paragraph;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.lowagie.text.pdf.PdfWriter;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_391_694_Open_Image" onclick="this.style.display='none'; Codehighlighter1_391_694_Open_Text.style.display='none'; Codehighlighter1_391_694_Closed_Image.style.display='inline'; Codehighlighter1_391_694_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_391_694_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_391_694_Closed_Text.style.display='none'; Codehighlighter1_391_694_Open_Image.style.display='inline'; Codehighlighter1_391_694_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ViewPDF </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> AbstractPdfView </span><span id="Codehighlighter1_391_694_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_391_694_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> buildPdfDocument(Map model, Document document,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            PdfWriter writer, HttpServletRequest request,<br /><img id="Codehighlighter1_552_691_Open_Image" onclick="this.style.display='none'; Codehighlighter1_552_691_Open_Text.style.display='none'; Codehighlighter1_552_691_Closed_Image.style.display='inline'; Codehighlighter1_552_691_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_552_691_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_552_691_Closed_Text.style.display='none'; Codehighlighter1_552_691_Open_Image.style.display='inline'; Codehighlighter1_552_691_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            HttpServletResponse response) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception </span><span id="Codehighlighter1_552_691_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_552_691_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        List list </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (List) model.get(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> list.size(); i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            document.add(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Paragraph((String) list.get(i)));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>5、其他文件<br />1）控制器ViewController <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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com.zhupan.spring;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.ArrayList;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.HashMap;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.List;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Map;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.HttpServletRequest;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.HttpServletResponse;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.web.servlet.ModelAndView;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.web.servlet.mvc.multiaction.MultiActionController;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.zhupan.view.ViewExcel;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.zhupan.view.ViewPDF;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_479_1219_Open_Image" onclick="this.style.display='none'; Codehighlighter1_479_1219_Open_Text.style.display='none'; Codehighlighter1_479_1219_Closed_Image.style.display='inline'; Codehighlighter1_479_1219_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_479_1219_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_479_1219_Closed_Text.style.display='none'; Codehighlighter1_479_1219_Open_Image.style.display='inline'; Codehighlighter1_479_1219_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ViewController </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> MultiActionController</span><span id="Codehighlighter1_479_1219_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_479_1219_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     <br /><img id="Codehighlighter1_595_835_Open_Image" onclick="this.style.display='none'; Codehighlighter1_595_835_Open_Text.style.display='none'; Codehighlighter1_595_835_Closed_Image.style.display='inline'; Codehighlighter1_595_835_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_595_835_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_595_835_Closed_Text.style.display='none'; Codehighlighter1_595_835_Open_Image.style.display='inline'; Codehighlighter1_595_835_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> ModelAndView viewPDF(HttpServletRequest request, HttpServletResponse response) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception </span><span id="Codehighlighter1_595_835_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_595_835_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       List list </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       Map model</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashMap();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       list.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       list.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       model.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,list);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       ViewPDF viewPDF</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ViewPDF();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ModelAndView(viewPDF,model);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     <br /><img id="Codehighlighter1_954_1217_Open_Image" onclick="this.style.display='none'; Codehighlighter1_954_1217_Open_Text.style.display='none'; Codehighlighter1_954_1217_Closed_Image.style.display='inline'; Codehighlighter1_954_1217_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_954_1217_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_954_1217_Closed_Text.style.display='none'; Codehighlighter1_954_1217_Open_Image.style.display='inline'; Codehighlighter1_954_1217_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> ModelAndView viewExcel(HttpServletRequest request, HttpServletResponse response) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception </span><span id="Codehighlighter1_954_1217_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_954_1217_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            List list </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Map model</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashMap();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        list.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        list.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        model.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,list);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ViewExcel viewExcel</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ViewExcel();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ModelAndView(viewExcel,model);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>2）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; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">web-app </span><span style="COLOR: #ff0000">version</span><span style="COLOR: #0000ff">="2.4"</span><span style="COLOR: #ff0000"> xmlns</span><span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    xmlns:xsi</span><span style="COLOR: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    xsi:schemaLocation</span><span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">springPDFTest</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">springPDFTest</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            org.springframework.web.servlet.DispatcherServlet<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">springPDFTest</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">*.shtml</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">welcome-file-list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">welcome-file</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">index.jsp</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">welcome-file</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">welcome-file-list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">web-app</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />3)index.jsp<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 id="Codehighlighter1_2_47_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2_47_Open_Text.style.display='none'; Codehighlighter1_2_47_Closed_Image.style.display='inline'; Codehighlighter1_2_47_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2_47_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2_47_Closed_Text.style.display='none'; Codehighlighter1_2_47_Open_Image.style.display='inline'; Codehighlighter1_2_47_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span id="Codehighlighter1_2_47_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_2_47_Open_Text"><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ page contentType</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">text/html; charset=gb2312</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">a </span><span style="COLOR: #ff0000">href</span><span style="COLOR: #0000ff">="viewPDF.shtml"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">PDF视图打开 </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">a</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">br</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">a </span><span style="COLOR: #ff0000">href</span><span style="COLOR: #0000ff">="viewExcel.shtml"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Excel视图打开</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">a</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span></div></span>
		</div>
<img src ="http://www.blogjava.net/nbtymm/aggbug/73622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-10-07 13:29 <a href="http://www.blogjava.net/nbtymm/archive/2006/10/07/73622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Framework之最佳实践二</title><link>http://www.blogjava.net/nbtymm/archive/2006/07/26/60208.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Wed, 26 Jul 2006 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/07/26/60208.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/60208.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/07/26/60208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/60208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/60208.html</trackback:ping><description><![CDATA[
		<p>转载自(<a href="http://www.gpowersoft.com/tech/Spring/46.htm">http://www.gpowersoft.com/tech/Spring/46.htm</a>)<br /><br />Spring Framework最得以出名的是与Hibernate的无缝链接，基本上用Spring，就会用Hibernate。可惜的是Spring提供的HibernateTemplate功能显得不够，使用起来也不是很方便。我们编程序时，一般先写BusinessService，由BusinessService调DAO来执行存储，在这方面Spring没有很好的例子，造成真正想用好它，并不容易。</p>
		<p>我们的思路是先写一个BaseDao，仿照HibernateTemplate，将基本功能全部实现：</p>
		<p>public class BaseDao extends HibernateDaoSupport{</p>
		<p>    private Log log = LogFactory.getLog(getClass());</p>
		<p>    public Session openSession() {<br />        return SessionFactoryUtils.getSession(getSessionFactory(), false);<br />    }</p>
		<p>    public Object get(Class entityClass, Serializable id) throws DataAccessException {<br />        Session session = openSession();<br />        try {<br />            return session.get(entityClass, id);<br />        }<br />        catch (HibernateException ex) {<br />            throw SessionFactoryUtils.convertHibernateAccessException(ex);<br />        }<br />    }</p>
		<p>    public Serializable create(Object entity) throws DataAccessException {<br />        Session session = openSession();<br />        try {<br />            return session.save(entity);<br />        }<br />        catch (HibernateException ex) {<br />            throw SessionFactoryUtils.convertHibernateAccessException(ex);<br />        }<br />    }</p>
		<p>...</p>
		<p>其它的DAO，从BaseDao继承出来，这样写其他的DAO，代码就会很少。</p>
		<p>从BaseDao继承出来EntityDao，专门负责一般实体的基本操作，会更方便。</p>
		<p>public interface EntityDao {</p>
		<p>    public Object get(Class entityClass, Serializable id) throws DataAccessException;</p>
		<p>    public Object load(Class entityClass, Serializable id) throws DataAccessException;</p>
		<p>    public Serializable create(Object entity) throws DataAccessException;<br />...}</p>
		<p>/**<br /> * Base class for Hibernate DAOs.  This class defines common CRUD methods for<br /> * child classes to inherit. User Sping AOP Inteceptor<br /> */<br />public class EntityDaoImpl extends BaseDao implements EntityDao{</p>
		<p>}</p>
		<p>为了Transaction的控制，采用AOP的方式：</p>
		<p>public interface EntityManager {</p>
		<p>    public Object get(Class entityClass, Serializable id);</p>
		<p>    public Object load(Class entityClass, Serializable id);</p>
		<p>    public Serializable create(Object entity);<br />...</p>
		<p>}</p>
		<p>/**<br /> * Base class for Entity Service. User Sping AOP Inteceptor<br /> */<br />public class EntityManagerImpl implements EntityManager {</p>
		<p>    private EntityDao entityDao;</p>
		<p>    public void setEntityDao(EntityDao entityDao) {<br />        this.entityDao = entityDao;<br />    }</p>
		<p>    public Object get(Class entityClass, Serializable id) {<br />        return entityDao.get(entityClass, id);<br />    }</p>
		<p>    public Object load(Class entityClass, Serializable id) {<br />        return entityDao.load(entityClass, id);<br />    }<br />...</p>
		<p>}</p>
		<p>这样我们就有了一个通用的Hibernate实体引擎，可以对任何Hibernate实体实现基本的增加、修改、删除、查询等。</p>
		<p>其它的BusinessService就可以继承EntityManager，快速实现业务逻辑。</p>
		<p>具体XML配置如下：</p>
		<p> &lt;!-- Oracle JNDI DataSource for J2EE environments --&gt;<br /> &lt;bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"&gt;<br />  &lt;property name="jndiName"&gt;&lt;value&gt;java:comp/env/jdbc/testPool&lt;/value&gt;&lt;/property&gt;<br /> &lt;/bean&gt;</p>
		<p> &lt;!-- Hibernate SessionFactory for Oracle --&gt;<br /> &lt;!-- Choose the dialect that matches your "dataSource" definition --&gt;<br /> &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"&gt;<br />  &lt;property name="dataSource"&gt;&lt;ref local="dataSource"/&gt;&lt;/property&gt;<br />  &lt;property name="mappingResources"&gt;<br />   &lt;value&gt;user-hbm.xml&lt;/value&gt;<br />  &lt;/property&gt;<br />  &lt;property name="hibernateProperties"&gt;<br />   &lt;props&gt;<br />    &lt;prop key="hibernate.dialect"&gt;net.sf.hibernate.dialect.OracleDialect&lt;/prop&gt;<br />    &lt;prop key="hibernate.cache.provider_class"&gt;net.sf.ehcache.hibernate.Provider&lt;/prop&gt;<br />    &lt;prop key="hibernate.cache.use_query_cache"&gt;true&lt;/prop&gt;<br />                  &lt;prop key="hibernate.show_sql"&gt;false&lt;/prop&gt;<br />   &lt;/props&gt;<br />  &lt;/property&gt;<br /> &lt;/bean&gt;</p>
		<p> &lt;!-- AOP DAO Intecepter --&gt;<br />        &lt;bean id="hibernateInterceptor" class="org.springframework.orm.hibernate.HibernateInterceptor"&gt;<br />          &lt;property name="sessionFactory"&gt;<br />            &lt;ref bean="sessionFactory"/&gt;<br />          &lt;/property&gt;<br />        &lt;/bean&gt;</p>
		<p>        &lt;bean id="entityDaoTarget" class="com.gpower.services.entity.dao.EntityDaoImpl"&gt;<br />          &lt;property name="sessionFactory"&gt;<br />            &lt;ref bean="sessionFactory"/&gt;<br />          &lt;/property&gt;<br />        &lt;/bean&gt;</p>
		<p>        &lt;bean id="entityDao" class="org.springframework.aop.framework.ProxyFactoryBean"&gt;<br />          &lt;property name="proxyInterfaces"&gt;<br />            &lt;value&gt;com.gpower.services.entity.dao.EntityDao&lt;/value&gt;<br />          &lt;/property&gt;<br />          &lt;property name="interceptorNames"&gt;<br />            &lt;list&gt;<br />              &lt;value&gt;hibernateInterceptor&lt;/value&gt;<br />              &lt;value&gt;entityDaoTarget&lt;/value&gt;<br />            &lt;/list&gt;<br />          &lt;/property&gt;<br />        &lt;/bean&gt;</p>
		<p> &lt;!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --&gt;<br /> &lt;bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"&gt;<br />  &lt;property name="sessionFactory"&gt;&lt;ref local="sessionFactory"/&gt;&lt;/property&gt;<br /> &lt;/bean&gt;</p>
		<p> &lt;!-- Transaction manager that delegates to JTA (for a transactional JNDI DataSource) --&gt;<br /> &lt;!--<br /> &lt;bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/&gt;<br /> --&gt;</p>
		<p> &lt;!-- Transactional proxy for the Application primary business object --&gt;<br />        &lt;bean id="entityManagerTarget" class="com.gpower.services.entity.EntityManagerImpl"&gt;<br />          &lt;property name="entityDao"&gt;<br />            &lt;ref bean="entityDao"/&gt;<br />          &lt;/property&gt;<br />        &lt;/bean&gt;</p>
		<p>        &lt;bean id="entityManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br />          &lt;property name="transactionManager"&gt;<br />            &lt;ref bean="transactionManager"/&gt;<br />          &lt;/property&gt;<br />          &lt;property name="target"&gt;<br />            &lt;ref bean="entityManagerTarget"/&gt;<br />          &lt;/property&gt;<br />          &lt;property name="transactionAttributes"&gt;<br />     &lt;props&gt;<br />       &lt;prop key="get*"&gt;PROPAGATION_SUPPORTS&lt;/prop&gt;<br />       &lt;prop key="*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />     &lt;/props&gt;<br />          &lt;/property&gt;<br />        &lt;/bean&gt;<br /></p>
<img src ="http://www.blogjava.net/nbtymm/aggbug/60208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-07-26 17:12 <a href="http://www.blogjava.net/nbtymm/archive/2006/07/26/60208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Framework之最佳实践一</title><link>http://www.blogjava.net/nbtymm/archive/2006/07/26/60206.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Wed, 26 Jul 2006 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/07/26/60206.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/60206.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/07/26/60206.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/60206.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/60206.html</trackback:ping><description><![CDATA[
		<p>
				<br />
				<br />Spring Framework从诞生之日起，受到了越来越多的关注。最近，新的开源项目大多支持Spring Framework。国内目前也有专门的网站（<a href="http://spring.jactiongroup.net/"><font color="#000080">http://spring.jactiongroup.net/</font></a>）。那它为什么如此受欢迎呢？</p>
		<p>我想最重要的是，EJB让每个人都痛恨。要编写一个EJB，需要写LocalHome, RemoteHome, Bean, LocalInterface, RemoteInterface，需要一个标准描述符，一个特殊厂商描述符（Weblogic、WebSphere都不一样），如果是Entity Bean，还需要Mapping文件。如此之多，实在麻烦。但EJB最重要的是解决Transaction问题，没有Spring之前，没有其他方法能够描述式的解决它。每个人、每个公司为了解决Transaction的问题，编程的写法都不一样，百花齐放。于是，在最需要它的时候，Spring出现了。</p>
		<p>Spring的功能非常多。但对于一个产品，最重要的是如何用好它的精华。Spring包含AOP、ORM、DAO、Context、Web、MVC几个部分组成。Web、MVC暂不用考虑，用成熟的Struts、JSP或Webwork更好。DAO由于目前Hibernate、JDO的流行，也可不考虑。因此最需要用的是AOP、ORM、Context。</p>
		<p>Context中，最重要的是Beanfactory，它是将接口与实现分开，非常重要。以前我们写程序，如一个接口IDocument，一个实现类Document1。在写程序时，需写成IDocument doc = new Document1()，一旦我们的实现类需改变时，变为Document2，则程序需写成IDocument doc = new Document2()，所有用到的地方全需改。Beanfactory帮我们解决了这个问题，用context后，写法变为IDocument doc=(IDocument)beanFactory.getBean("doc")。如果实现类从Document1改为Document2，直接在配置文件改就可以了。Context是Bean factory的进一步抽象。很多人都喜欢用ApplicationConext，用Servlet把它Load。这样就把Bean Factory与Web绑定在一起。如果是Fat Client或Remote调用，则这些Bean factory就很难调用，实际是将表现层与业务层绑定的太紧。推荐的方法是SingletonBeanFactoryLocator。具体为：</p>
		<p>   BeanFactoryLocator bfLocator = SingletonBeanFactoryLocator.getInstance();<br />   BeanFactoryReference bf = bfLocator.useBeanFactory("beanFactory");<br />   // now use some bean from factory<br />   return bf.getFactory().getBean(name);</p>
		<p> </p>
		<p> &lt;beans&gt;</p>
		<p>     &lt;bean id="beanFactory" class="org.springframework.context.support.ClassPathXmlApplicationContext"&gt;<br />     &lt;constructor-arg&gt;<br />      &lt;list&gt;<br />       &lt;value&gt;dataAccessContext.xml&lt;/value&gt;<br />       &lt;value&gt;securityContext.xml&lt;/value&gt;<br />       &lt;value&gt;...&lt;/value&gt;<br />      &lt;/list&gt;<br />     &lt;/constructor-arg&gt;<br />    &lt;/bean&gt;</p>
		<p>&lt;/beans&gt;</p>
		<p>
				<br />这样，就可随时动态扩展，实现组件式的开发。</p>
		<p>（未完，待续）</p>
<img src ="http://www.blogjava.net/nbtymm/aggbug/60206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-07-26 17:08 <a href="http://www.blogjava.net/nbtymm/archive/2006/07/26/60206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 Spring MVC 轻松进行应用程序开发(转载)</title><link>http://www.blogjava.net/nbtymm/archive/2006/06/15/53042.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Thu, 15 Jun 2006 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/06/15/53042.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/53042.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/06/15/53042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/53042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/53042.html</trackback:ping><description><![CDATA[Spring MVC 框架。用银行示例介绍如何建模和构建简单的应用程序。示例应用程序包含了已经学过的一些技术（例如依赖注入），但是主要演示 Spring MVC 的特性。<br />　　<br />　　在开始之前，请 下载这篇文章的源代码。请参阅 参考资料 访问 Spring 框架和 Tom<a href="http://topic.ccw.com.cn/corpCenter/249.html" target="_blank"><font color="#0000cc"><strong>ca</strong></font></a>t 5.0，运行示例需要它们。<br />　　<br />　　Spring MVC 框架<br />　　<br />　　Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构，可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。通过策略接口，Spring 框架是高度可配置的，而且包含多种视图技术，例如 JavaServer Pages（JSP）技术、Velocity、Tiles、iText 和 POI。Spring MVC 框架并不知道使用的视图，所以不会强迫您只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色，这种分离让它们更容易进行定制。<br />　　<br />　　Spring 的 Web MVC 框架是围绕 DispatcherServlet 设计的，它把请求分派给处理程序，同时带有可配置的处理程序映射、视图解析、本地语言、主题解析以及上载文件支持。默认的处理程序是非常简单的 Controller 接口，只有一个方法 ModelAndView handleRequest(request, response)。Spring 提供了一个控制器层次结构，可以派生子类。如果应用程序需要处理用户输入表单，那么可以继承 AbstractFormController。如果需要把多页输入处理到一个表单，那么可以继承 AbstractWizardFormController。<br />　　<br />　　示例应用程序有助于直观地学习这些特性。银行应用程序允许用户检索他们的帐户信息。在构建银行应用程序的过程中，可以学到如何配置 Spring MVC 框架和实现框架的视图层，视图层包括 JSTL 标记（用于显示输出的数据）和JavaServer Pages 技术。<br />　　<br />　　配置 Spring MVC<br />　　<br />　　要开始构建示例应用程序，请配置 Spring MVC 的 DispatcherServlet。请在 web.xml 文件中注册所有配置。清单 1 显示了如何配置 sampleBankingServlet。<br />　　<br />　　清单 1. 配置 Spring MVC DispatcherServlet<br />　　<br />　　&lt;servlet&gt;<br />　　&lt;servlet-name&gt;sampleBankingServlet&lt;/servlet-name&gt;<br />　　&lt;servlet-class&gt;<br />　　org.springframework.we.servlet.DispatcherServlet<br />　　&lt;servlet-class&gt;<br />　　&lt;load-on-startup&gt;1&lt;load-on-startup&gt;<br />　　&lt;servlet&gt;<br />　　<br />　　DispatcherServlet 从一个 XML 文件装入 Spring 应用程序上下文，XML 文件的名称是 servlet 的名称后面加上 -servlet 。在这个示例中，DispatcherServlet 会从 sampleBankingServlet-servlet.xml 文件装入应用程序上下文。<br />　　<br />　　配置应用程序的 URL<br />　　<br />　　下一步是配置想让 sampleBankingServlet 处理的 URL。同样，还是要在 web.xml 中注册所有这些信息。<br />　　<br />　　清单 2. 配置想要处理的 URL<br />　　<br />　　&lt;servlet-mapping&gt;<br />　　&lt;servlet-name&gt; sampleBankingServlet&lt;servlet-name&gt;<br />　　&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />　　&lt;/servlet-mapping&gt;<br />　　<br />　　装入配置文件<br />　　<br />　　下面，装入配置文件。为了做到这点，请为 Servlet 2.3 规范注册 ContextLoaderListener 或为 Servlet 2.2 及以下的容器注册 ContextLoaderServlet。为了保障后向兼容性，请用 ContextLoaderServlet。在启动 Web 应用程序时，ContextLoaderServlet 会装入 Spring 配置文件。清单 3 注册了 ContextLoaderServlet。<br />　　<br />　　清单 3. 注册 ContextLoaderServlet<br />　　<br />　　&lt;servlet&gt;<br />　　&lt;servlet-name&gt;context&gt;servlet-name&gt;<br />　　&lt;servlet-class&gt;<br />　　org.springframework.web.context.ContextLoaderServlet<br />　　&lt;/servlet-class&gt;<br />　　&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />　　&lt;/servlet&gt;<br />　　<br />　　contextConfigLocation 参数定义了要装入的 Spring 配置文件，如下面的 servlet 上下文所示。<br />　　<br />　　&lt;context-param&gt;<br />　　&lt;param-value&gt;contextConfigLocation&lt;/param-value&gt;<br />　　&lt;param-value&gt;/WEB-INF/sampleBanking-services.xml&lt;/param-value&gt;<br />　　&lt;/context-param&gt;<br />　　<br />　　sampleBanking-services.xml 文件代表示例银行应用程序服务的配置和 bean 配置。如果想装入多个配置文件，可以在 &lt;param-value&gt; 标记中用逗号作分隔符。<br />　　<br />　　Spring MVC 示例<br />　　<br />　　示例银行应用程序允许用户根据惟一的 ID 和口令查看帐户信息。虽然 Spring MVC 提供了其他选项，但是我将采用 JSP 技术作为视图页面。这个简单的应用程序包含一个视图页用于用户输入（ID 和口令），另一页显示用户的帐户信息。<br />　　<br />　　我从 LoginBankController 开始，它扩展了 Spring MVC 的 SimpleFormController。SimpleFormContoller 提供了显示从 HTTP GET 请求接收到的表单的功能，以及处理从 HTTP POST 接收到的相同表单数据的功能。LoginBankController 用 AuthenticationService 和 AccountServices 服务进行验证，并执行帐户活动。“ 配置视图属性 ”一节中的 清单 5 描述了如何把 AuthenticationService 和 AccountServices 连接到 LoginBankController。 清单 4 显示了 LoginBankController 的代码。<br />　　<br />　　配置视图属性<br />　　<br />　　下面，我必须注册在接收到 HTTP GET 请求时显示的页面。我在 Spring 配置中用 formView 属性注册这个页面，如清单 5 所示。sucessView 属性代表表单数据提交而且 doSubmitAction() 方法中的逻辑成功执行之后显示的页面。formView 和 sucessView 属性都代表被定义的视图的逻辑名称，逻辑名称映射到实际的视图页面。<br />　　<br />　　清单 5. 注册 LoginBankController<br />　　<br />　　&lt;bean id="loginBankController"<br />　　class="springexample.controller.LoginBankController"&gt;<br />　　&lt;property name="sessionForm"&gt;&lt;value&gt;true&lt;/value&gt;&lt;/property&gt;<br />　　&lt;property name="commandName"&gt;&lt;value&gt;loginCommand&lt;/value&gt;&lt;/property&gt;<br />　　&lt;property name="commandClass"&gt;<br />　　&lt;value&gt;springexample.commands.LoginCommand&lt;/value&gt;<br />　　&lt;/property&gt;<br />　　<br />　　&lt;property name="authenticationService"&gt;<br />　　&lt;ref bean="authenticationService" /&gt;<br />　　&lt;/property&gt;<br />　　&lt;property name="accountServices"&gt;<br />　　&lt;ref bean="accountServices" /&gt;<br />　　&lt;/property&gt;<br />　　&lt;property name="formView"&gt;<br />　　&lt;value&gt;login&lt;/value&gt;<br />　　&lt;/property&gt;<br />　　&lt;property name="successView"&gt;<br />　　&lt;value&gt;accountdetail&lt;/value&gt;<br />　　&lt;/property&gt;<br />　　<br />　　&lt;/bean&gt;<br />　　<br />　　commandClass 和 commandName 标记决定将在视图页面中活动的 bean。例如，可以通过 login.jsp 页面访问 loginCommand bean，这个页面是应用程序的登录页面。一旦用户提交了登录页面，应用程序就可以从 LoginBankController 的 onSubmit() 方法中的命令对象检索出表单数据。<br />　　<br />　　视图解析器<br />　　<br />　　Spring MVC 的 视图解析器 把每个逻辑名称解析成实际的资源，即包含帐户信息的 JSP 文件。我用的是 Spring 的 InternalResourceViewResolver，如 清单 6 所示。<br />　　<br />　　因为我在 JSP 页面中使用了 JSTL 标记，所以用户的登录名称解析成资源 /jsp/login.jsp，而 viewClass 成为 JstlView。<br />　　<br />　　验证和帐户服务<br />　　<br />　　就像前面提到的，LoginBankController 内部连接了 Spring 的 AccountServices 和 AuthenticationService。AuthenticationService 类处理银行应用程序的验证。AccountServices 类处理典型的银行服务，例如查找交易和电汇。清单 7 显示了银行应用程序的验证和帐户服务的配置。<br />　　<br />　　清单 7. 配置验证和帐户服务<br />　　<br />　　&lt;beans&gt;<br />　　<br />　　&lt;bean id="accountServices"<br />　　class="springexample.services.AccountServices"&gt;<br />　　<br />　　&lt;/bean&gt;<br />　　<br />　　&lt;bean id="authenticationService"<br />　　class="springexample.services.AuthenticationService"&gt;<br />　　<br />　　&lt;/bean&gt;<br />　　<br />　　&lt;/beans&gt;<br />　　<br />　　以上服务在 sampleBanking-services.xml 中注册，然后装入 web.xml 文件中，就像 前面讨论的那样。控制器和服务配置好后，这个简单的应用程序就完成了。现在我们来看看部署和测试它时会发生什么!<br />　　<br />　　部署应用程序<br />　　<br />　　我把示例应用程序部署在 Tomcat servlet 容器中。Tomcat 是 Java Servlet 和 Java ServerPagest 技术的官方参考实现中使用的 servlet 容器。如果以前没这么做过，请 下载 jakarta-tomcat-5.0.28.exe 并运行它把 Tomcat 安装到自己喜欢的任何位置，例如 c:\tomcat5.0。<br />　　<br />　　接下来，下载示例代码 并释放到驱动器（例如 c:\ ）上。创建了 Spring 项目的文件夹之后，打开它并把 spring-banking 子文件夹拷贝到 c:\tomvat5.0\webapps。spring-banking 文件夹是一个 Web 档案，里面包含 Spring MVC 示例应用程序。lib 文件夹包含应用程序需要的 Spring 框架、与Spring 相关的 MVC 库以及 JSTL 标记库和 jar 文件。<br />　　<br />　　要启动 Tomcat 服务器，请使用以下命令：<br />　　<br />　　cd bin C:\Tomcat 5.0\bin&gt; catalina.bat start<br />　　Tomcat 应当启动并部署 Spring MVC 示例应用程序。<br />　　<br />　　测试应用程序<br />　　<br />　　要测试应用程序，请打开 Web 浏览器，指向 <a href="http://localhost:tomcatport/springbanking">http://localhost:tomcatport/springbanking</a> 并用 Tomcat 服务器实际运行的端口替换 tomcatport。应当看到图 1 所示的登录屏幕。输入用户 ID “admin”和口令“password”，并按下登录按钮。其他用户 ID 或口令会造成来自验证服务的错误。<br />　　<br />　　图 1. Spring MVC 示例登录屏幕<br /><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zzr173/1.jpg" /><br /><br />登录成功之后，会看到图 2 所示的帐户细节页面。<br />　　<br />　　图 2. Spring MVC 示例帐户细节页面<br /><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zzr173/1.jpg" />　　<br /><br /><br />　　结束语<br />　　<br />　　在三部分的 Spring 系列 的第三篇文章中，我介绍了 Spring MVC 框架的特性。我演示了如何配置和开发 Spring MVC 应用程序、如何配置 Spring MVC 控制器和向其中插入依赖项、如何用 JavaServer Pages 技术开发应用程序视图，以及如何把自己的页面与 Spring MVC 的视图层集成。总结这篇文章时，我演示了如何在 Tomcat servlet 容器中部署应用程序以及如何在浏览器中测试它。<img src ="http://www.blogjava.net/nbtymm/aggbug/53042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-06-15 17:39 <a href="http://www.blogjava.net/nbtymm/archive/2006/06/15/53042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts+Spring+Hibernate练习(完整)转载</title><link>http://www.blogjava.net/nbtymm/archive/2006/06/15/52923.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Thu, 15 Jun 2006 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/06/15/52923.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/52923.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/06/15/52923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/52923.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/52923.html</trackback:ping><description><![CDATA[
		<div class="postbody">
				<div>工具：</div>
				<div>    Eclipse3.1、MyEclipse4.03、Tomcat5.5.9、Properties Editor插件、MySql4.1.13</div>
				<div> </div>
				<div>新建工程：名称为 login</div>
				<div> </div>
				<div>创建Struts框架</div>
				<div> </div>
				<div>创建 index.jsp，增加一链接指向 login.jsp</div>
				<div> </div>
				<div>按下Ctrl + N，创建 login.jsp、LoginAction，使用MyEclipse的向导就可以了，<strong>记得选对正确的版本</strong></div>
				<div> </div>
				<div>在ActionForm配置页中选择类型为动态Form，并继承于DynaValidatorForm，新增两个属性：username、password，在创建jsp文件打上钩，将路径改为/login.jsp，然后下一步，改LoginAction的Input source改为/login.jsp，点击完成</div>
				<div> </div>
				<div>按下Ctrl + N 创建一个forwards，<strong>记得选对正确的版本</strong></div>
				<div>name 输入 indexGo</div>
				<div>路径选择 /index.jsp</div>
				<div> </div>
				<div>
						<strong>配置validator</strong>
				</div>
				<div>先添加Struts插件，使用向导</div>
				<div>Plugin class : org.apache.struts.validator.ValidatorPlugIn</div>
				<div>Property : pathnames</div>
				<div>Value : <font color="#008000">/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml</font></div>
				<div>这里需要两个xml文件</div>
				<div>
						<font color="#000000">现在创建“</font>
						<font color="#000000">validation.xml</font>
						<font color="#000000">”</font> 文件</div>
				<div> </div>
				<div>
						<div>在这里说明一点，我使用MyEclipse创建的Struts框架中缺少了validator-rules.xml文件，需要动拷贝到WEB-INF目录中</div>
						<div>此文件可以到<a href="http://struts.apache.org/"><font color="#8d8c8c">http://struts.apache.org/</font></a>下载</div>
						<div> </div>
				</div>
				<div>文件内容如下：</div>
				<div>
						<font color="#0000ff">
								<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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">form-validation</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">formset</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">form </span>
										<span style="COLOR: #ff0000">name</span>
										<span style="COLOR: #0000ff">="loginForm"</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">field </span>
										<span style="COLOR: #ff0000">property</span>
										<span style="COLOR: #0000ff">="username"</span>
										<span style="COLOR: #ff0000"> depends</span>
										<span style="COLOR: #0000ff">="required"</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">arg0 </span>
										<span style="COLOR: #ff0000">key</span>
										<span style="COLOR: #0000ff">="prompt.username"</span>
										<span style="COLOR: #ff0000"> </span>
										<span style="COLOR: #0000ff">/&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">field</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">field </span>
										<span style="COLOR: #ff0000">property</span>
										<span style="COLOR: #0000ff">="password"</span>
										<span style="COLOR: #ff0000"> depends</span>
										<span style="COLOR: #0000ff">="required"</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">arg0 </span>
										<span style="COLOR: #ff0000">key</span>
										<span style="COLOR: #0000ff">="prompt.password"</span>
										<span style="COLOR: #ff0000"> </span>
										<span style="COLOR: #0000ff">/&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">field</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">form</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">formset</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
										</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">form-validation</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</div>
						</font>
				</div>
				<div>
						<font color="#0000ff">
						</font> </div>
				<div>
						<font color="#000000">
								<strong>编辑资源文件</strong>“ApplicationResources.properties”</font>
				</div>
				<div>增加以下内容</div>
				<div> </div>
				<div>
						<font color="#0000ff">prompt.username=User Name<br />prompt.password=User Password</font>
				</div>
				<div>
						<font color="#0000ff">errors.required={0} is required.</font>
				</div>
				<div>
						<font color="#0000ff">
						</font> </div>
				<div>
						<font color="#000000">再创建中文件资源文件“ApplicationResources_zh_CN.properties”</font>
				</div>
				<p>增加以下内容 </p>
				<div>
						<font color="#0000ff">prompt.username=用户名称<br />prompt.password=登录密码</font>
				</div>
				<div>
						<font color="#0000ff">errors.required={0} 必需填写！</font>
				</div>
				<div>
						<font color="#0000ff">
						</font> </div>
				<div>
						<font color="#000000">修改struts-config.xml文件</font>
				</div>
				<div>在以下位置增加绿色字体部份</div>
				<div>&lt;action-mappings &gt;<br />    &lt;action<br />      attribute="loginForm"<br />      input="/login.jsp"<br />      name="loginForm"<br />      path="/login"<br />      scope="request"<br />      <font color="#008000">validate="true"<br /></font>      type="com.test.struts.action.LoginAction" /&gt;</div>
				<div>  &lt;/action-mappings&gt;</div>
				<div> </div>
				<div>这里说明提交的数据必需经过验证，而验证则是通过validator框架进行的。</div>
				<div> </div>
				<div>修改LoginAction.java文件的execute方法，内容如下</div>
				<div>
						<font color="#0000ff">public ActionForward execute(<br />  ActionMapping mapping,<br />  ActionForm form,<br />  HttpServletRequest request,<br />  HttpServletResponse response) {<br />  DynaValidatorForm loginForm = (DynaValidatorForm) form;<br />  <font color="#008000">String username=loginForm.getString("username");<br />  String password=loginForm.getString("password");<br />  if(username.equals("test")||password.equals("test")){<br />   return mapping.findForward("indexGo");<br />  }else{<br />   return mapping.getInputForward();<br />  }<br /></font> }</font>
				</div>
				<div> </div>
				<div>现在再修改一下login.jsp</div>
				<div>增加以下绿色字体部份</div>
				<div>&lt;%@ page language="java" <font color="#008000">contentType="text/html; charset=UTF-8"</font> %&gt;</div>
				<div> </div>
				<div>其中<font color="#008000">charset=UTF-8 </font><font color="#000000">是使用UTF-8的字符编码，这也是为了支持国际化而使用的。</font></div>
				<div> </div>
				<div>好了，现在可以启动Tomcat进行测试了</div>
				<div>
						<a href="http://localhost/login/">
								<font color="#8d8c8c">http://localhost/login/</font>
								<font color="#1d58d1">
								</font>
						</a> 这里说明一下，我的Tomcat已经装端口号改为80了，所以就不必使用<a href="http://localhost:8080/login/"><font color="#8d8c8c">http://localhost:8080/login/</font></a>这样的方法了。</div>
				<div> </div>
				<div>如果不输入任何数据而直接提交表单的话就可以看到效果了。</div>
				<div> </div>
				<div>
						<font color="#ff0000">好了，如果没有什么问题的话就继续往下看吧，如果有问题的话就得往上看了^_^</font>
				</div>
				<div> </div>
				<div>现在创建Spring框架了，在这里我将Spring所有的包全部加载进去，因为我还不知道具体用到哪些类，全部加进去方便点</div>
				<div> </div>
				<div>单选框选第二个，这样的话所有的类库和标签等都将拷贝到项目中去，这样方便以后的布署</div>
				<div>下一步后是创建配置文件，将文件放到“WebRoot/WEB-INF”目录下，文件名称为“applicationContext.xml”</div>
				<div> </div>
				<div> </div>
				<div>
						<div>配置struts-config.xml文件，添加（spring）的插件</div>
						<div> </div>
						<div>
								<font color="#0000ff">&lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;<br />    &lt;set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /&gt;<br />  &lt;/plug-in&gt;</font>
						</div>
						<div>
								<font color="#0000ff">
								</font> </div>
						<div>
								<font color="#0000ff">
								</font>  
<div><font color="#000000">修改LoginAction配置</font></div><div><font color="#0000ff"></font> </div><div><strong><font color="#000000">原：</font></strong></div><div><font color="#0000ff">&lt;action<br />      attribute="loginForm"<br />      input="/login.jsp"<br />      name="loginForm"<br />      path="/login"<br />      scope="request"<br />      validate="true"<br />      type="com.test.struts.action.LoginAction" /&gt;</font></div><div><font color="#0000ff"></font> </div><div><font color="#0000ff">  &lt;/action-mappings&gt;</font></div><div><font color="#0000ff"></font> </div><div><font color="#000000">改为：</font></div><div><div><font color="#0000ff">&lt;action<br />      attribute="loginForm"<br />      input="/login.jsp"<br />      name="loginForm"<br />      path="/login"<br />      scope="request"<br />      validate="true"<br />      type="<font color="#008000">org.springframework.web.struts.DelegatingActionProxy</font>" /&gt;</font></div><div><font color="#0000ff">  &lt;/action-mappings&gt;</font></div></div></div>
				</div>
				<div> </div>
				<div>  
<div><font color="#000000">绿色字体部份为修改内容</font></div><div><font color="#000000">这里将使用spring的代理器来对Action进行控制</font></div><div> </div><div>当提交到/login.do是将控制权交给了spring，然后由spring来决定是否转回到struts的Action</div><div> </div><div>现在来配置spring</div><div> </div><div><font color="#0000ff">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "</font><a href="http://www.springframework.org/dtd/spring-beans.dtd"><font color="#0000ff">http://www.springframework.org/dtd/spring-beans.dtd</font></a><font color="#0000ff">"&gt;</font></div><div><font color="#0000ff"></font> </div><div><font color="#0000ff">&lt;beans&gt;<br /> <font color="#008000">&lt;bean name="/login" class="com.test.struts.action.LoginAction" singleton="false"&gt;&lt;/bean&gt;</font></font></div><div><font color="#0000ff">&lt;/beans&gt;</font></div><div><font color="#0000ff"></font> </div><div><font color="#000000">绿色字体是关于转交控制权的配置内容</font></div><div> </div><div>属性singleton="false"，指明了Action 的实例获取方式为每次重新创建。解决了Struts中令人诟病的线程安全问题（Struts中，由一个Action实例处理所有的请求，这就导致了类公用资源在并发请求中的线程同步问题。）（摘自spring开发指南）</div><div> </div><div><font color="#800080">这时如果你要进行测试也是可以的，不过为了省点时间就不进行测试了。</font></div><div>  
<div><strong>建立数据库在 </strong><font size="2">这里我使用的是mysql4.1.13</font></div><div><font size="2"></font> </div><div>CREATE TABLE `user` (<br />  `ID` int(11) NOT NULL auto_increment,<br />  `USERNAME` varchar(50) NOT NULL default '',<br />  `PASSWORD` varchar(50) NOT NULL default '',<br />  PRIMARY KEY  (`ID`)<br />) ENGINE=MyISAM DEFAULT CHARSET=latin1; </div><div> </div><div>添加记录 insert into user (USERNAME,PASSWORD) values ('test','test')</div><div> </div><div><strong>创建Hibernate框架</strong></div><div>在配置界面中配置数据库的连接部份，重要的是点击链接将jdbc拷贝到lib目录中</div><div>使用MyEclipse的数据Database Explorer工具创建User.hmb.xml、AbstractUser.java、User.java映射文件</div><div>创建完成后可以将自动生成的hibernate.cfg.xml删除</div><div> </div><div><strong>创建UserDAO.java、UserDAOImp.java</strong></div><div><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">UserDAO.java<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">public interface UserDAO {<o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 1">   </span>public abstract boolean isValidUser(String username, String password);<o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">}<o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p> </o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">UserDAOImp.java<o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">import java.util.List;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">import org.springframework.orm.hibernate3.support.HibernateDaoSupport;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">import com.test.Hibernate.SessionFactory;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">public class UserDAOImp extends HibernateDaoSupport implements UserDAO {<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 1">    </span>private SessionFactory sessionFactory;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 1">    </span>private static String hql = "from User u where u.username=? ";<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 1">    </span>public boolean isValidUser(String username, String password) {<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 2">       </span>List userList = this.getHibernateTemplate().find(hql, username);</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 2">       </span>if (userList.size() &gt; 0) {<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 3">           </span>return true;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 2">       </span>}<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 2">       </span>return false;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 1">    </span>}<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">}<o:p></o:p></span></p></div><div> </div><div><strong>修改LoginAction.java文件</strong>，使用userDao的方法来进行用户验证</div><div>package com.test.struts.action;</div><div> </div><div>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</div><div> </div><div>import org.apache.struts.action.Action;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.validator.DynaValidatorForm;</div><div> </div><div><font color="#008000">import com.test.UserDAO;</font></div><div><br />public class LoginAction extends Action {</div><div><br /> <font color="#008000">private UserDAO userDAO</font>;</div><div> </div><div><font color="#008000"> public UserDAO getUserDAO() {<br />  return userDAO;<br /> }</font></div><div><font color="#008000"></font> </div><div><font color="#008000"> public void setUserDAO(UserDAO userDAO) {<br />  this.userDAO = userDAO;<br /> }</font></div><div> </div><div> public ActionForward execute(ActionMapping mapping, ActionForm form,<br />   HttpServletRequest request, HttpServletResponse response) {<br />  DynaValidatorForm loginForm = (DynaValidatorForm) form;<br />  // TODO Auto-generated method stub<br />  String username = (String) loginForm.get("username");<br />  String password = (String) loginForm.get("password");<br />  loginForm.set("password", null);<br />  <font color="#008000">if (userDAO.isValidUser(username,password)) {<br />   return mapping.findForward("indexGo");<br />  } else {<br />   return mapping.getInputForward();<br />  }<br /></font> }</div><div>}<br />绿色字体为修改部份</div><div> </div><div>现在剩下最后的spring配置了</div><div><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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="dataSource"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="org.apache.commons.dbcp.BasicDataSource"</span><span style="COLOR: #ff0000"> destroy-method</span><span style="COLOR: #0000ff">="close"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="driverClassName"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">com.mysql.jdbc.Driver</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="url"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">jdbc:mysql://localhost/test</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="username"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">root</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="password"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">root</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000"> 配置sessionFactory, 注意这里引入的包的不同  </span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="sessionFactory"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="dataSource"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="dataSource"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="mappingResources"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">com/test/Hibernate/User.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 /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="hibernateProperties"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">props</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="hibernate.dialect"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">org.hibernate.dialect.MySQLDialect</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="hibernate.show_sql"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">true</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">props</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="transactionManager"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="org.springframework.orm.hibernate3.HibernateTransactionManager"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="sessionFactory"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="sessionFactory"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="userDAO"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="com.test.UserDAOImp"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="sessionFactory"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="sessionFactory"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="userDAOProxy"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="transactionManager"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">bean</span><span style="COLOR: #0000ff">="transactionManager"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="target"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="userDAO"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="transactionAttributes"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">props</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="insert*"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">PROPAGATION_REQUIRED</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="get*"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">PROPAGATION_REQUIRED,readOnly</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="is*"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">PROPAGATION_REQUIRED,readOnly</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">props</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="/login"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="com.test.struts.action.LoginAction"</span><span style="COLOR: #ff0000"> singleton</span><span style="COLOR: #0000ff">="false"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="userDAO"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">bean</span><span style="COLOR: #0000ff">="userDAOProxy"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">&gt;</span></div></div><div> </div><div>现在可以进行测试了！</div><div> </div><div>在编写代码有配置内容时一定要注意 hibernate 和 hibernate3 ，这两个包的名字就只差一个字，千万不要有错，否则找错误可是很难的。</div></div></div>
		</div>
<img src ="http://www.blogjava.net/nbtymm/aggbug/52923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-06-15 09:53 <a href="http://www.blogjava.net/nbtymm/archive/2006/06/15/52923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AOP编程入门(转载)</title><link>http://www.blogjava.net/nbtymm/archive/2006/06/09/51700.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Fri, 09 Jun 2006 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/06/09/51700.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/51700.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/06/09/51700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/51700.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/51700.html</trackback:ping><description><![CDATA[
		<div>
				<p>Aspect Oriented Programming(AOP)，面向切面编程，是一个比较热门的话题。AOP主要实现的目的是针对业务处理过程中的切面进行提取，它所面对的是处理过程中的某个步骤或阶段，以获得逻辑过程中各部分之间低耦合性的隔离效果。比如我们最常见的就是日志记录了，举个例子，我们现在提供一个服务查询学生信息的，但是我们希望记录有谁进行了这个查询。如果按照传统的OOP的实现的话，那我们实现了一个查询学生信息的服务接口(StudentInfoService)和其实现类（StudentInfoServiceImpl.java），同时为了要进行记录的话，那我们在实现类(StudentInfoServiceImpl.java)中要添加其实现记录的过程。这样的话，假如我们要实现的服务有多个呢？那就要在每个实现的类都添加这些记录过程。这样做的话就会有点繁琐，而且每个实现类都与记录服务日志的行为紧耦合，违反了面向对象的规则。那么怎样才能把记录服务的行为与业务处理过程中分离出来呢？看起来好像就是查询学生的服务自己在进行，但是背后日志记录对这些行为进行记录，但是查询学生的服务不知道存在这些记录过程，这就是我们要讨论AOP的目的所在。AOP的编程，好像就是把我们在某个方面的功能提出来与一批对象进行隔离，这样与一批对象之间降低了耦合性，可以就某个功能进行编程。<br />    我们直接从代码入手吧，要实现以上的目标，我们可以使用一个动态代理类(Proxy)，通过拦截一个对象的行为并添加我们需要的功能来完成。Java中的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口为我们实现动态代理类提供了一个方案，但是该方案针对的对象要实现某些接口；如果针对的目的是类的话，cglib为我们提供了另外一个实现方案。等下会说明两者的区别。<br />一、接口的实现方案：<br />1）首先编写我们的业务接口（StudentInfoService.java）：<br />public interface StudentInfoService{<br /> void findInfo(String studentName);<br />}<br />     及其实现类（StudentInfoServiceImpl.java）：<br />public class StudentInfoServiceImpl implements StudentInfoService{<br /> public void findInfo(String name){<br />  System.out.println("你目前输入的名字是:"+name);<br /> }<br />}<br />2）现在我们需要一个日志功能，在findInfo行为之前执行并记录其行为，那么我们就首先要拦截该行为。在实际执行的过程中用一个代理类来替我们完成。Java中为我们提供了实现动态代理类的方案： 
</p>
				<p>1'处理拦截目的的类（MyHandler.java）<br />import org.apache.log4j.Logger;<br />import java.lang.reflect.InvocationHandler;<br />import java.lang.reflect.Proxy;<br />import java.lang.reflect.Method;</p>
				<p>public class MyHandler implements InvocationHandler{<br /> private Object proxyObj;<br /> private static Logger log=Logger.getLogger(MyHandler.class);<br /> <br /> public Object bind(Object obj){<br />  this.proxyObj=obj;<br />  return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);<br /> }<br /> <br /> public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{<br />  Object result=null;<br />  try{<br />   //请在这里插入代码，在方法前调用<br />   log.info("调用log日志方法"+method.getName());<br />   result=method.invoke(proxyObj,args); //原方法<br />   //请在这里插入代码，方法后调用<br />  }catch(Exception e){<br />   e.printStackTrace();<br />  }<br />  return result;<br /> }<br />}<br />2'我们实现一个工厂，为了方便我们使用该拦截类(AOPFactory.java)：<br />public class AOPFactory{<br /> private static Object getClassInstance(String clzName){<br />  Object obj=null;<br />  try{<br />   Class cls=Class.forName(clzName);<br />   obj=(Object)cls.newInstance();<br />  }catch(ClassNotFoundException cnfe){<br />   System.out.println("ClassNotFoundException:"+cnfe.getMessage());<br />  }catch(Exception e){<br />   e.printStackTrace();<br />  }<br />  return obj;<br /> }<br /> <br /> public static Object getAOPProxyedObject(String clzName){<br />  Object proxy=null;<br />  MyHandler handler=new MyHandler();<br />  Object obj=getClassInstance(clzName);<br />  if(obj!=null) {<br />   proxy=handler.bind(obj);<br />  }else{<br />   System.out.println("Can't get the proxyobj");<br />   //throw<br />  }<br />  return proxy;<br /> }<br />}</p>
				<p>3)基本的拦截与其工厂我们都实现了，现在测试（ClientTest.java）：<br />public class ClientTest{<br /> public static void main(String[] args){<br />  StudentInfoService studentInfo=(StudentInfoService)AOPFactory.getAOPProxyedObject("StudentInfoServiceImpl");<br />  studentInfo.findInfo("阿飞");<br /> }<br />}<br />输出结果（看你的log4j设置）：<br />[INFO]调用log日志方法findInfo<br />你目前输入的名字是:阿飞<br />     这样我们需要的效果就出来了，业务处理自己在进行，但是我们实现了日志功能，而业务处理(StudentInfoService)根本不知道存在该行为的。但是Java中提供的动态代理类的实现是针对实现了某些接口的类，如果没有实现接口的话，不能创建代理类，看以上部分：<br />return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);<br />看到了没有？obj.getClass().getInterfaces()要求实现了某些接口。以下提供哪些没有实现接口的实现方案：<br /><br />二、子类的实现方案。<br />      首先，请上网下CGLib的包，<a href="http://sourceforge.net/project/showfiles.php?group_id=56933"><font color="#000000"><u>http://sourceforge.net/project/showfiles.php?group_id=56933</u></font></a> 。设置好classpath路径，CGLib与java标准库提供的实现方案不同，cglib主要是基于实现类（如StudentInfoServiceImpl.java)扩展一个子类来实现。与Dynamic Proxy中的Proxy和InvocationHandler相对应，net.sf.cglib.proxy.Enhancer和MethodInterceptor在CGLib中负责完成代理对象创建和方法截获处理,产生的是目标类的子类而不是通过接口来实现方法拦截的，Enhancer主要是用于构造动态代理子类来实现拦截，MethodInterceptor（扩展了Callback接口）主要用于实现around advice（AOP中的概念）：<br />     1）我们的业务处理（StudentInfoServiceImpl.java）：<br />public class StudentInfoServiceImpl{<br /> public void findInfo(String name){<br />  System.out.println("你目前输入的名字是:"+name);<br /> }<br />}<br />     2）实行一个工具来处理日志功能（AOPInstrumenter.java）：<br />import net.sf.cglib.proxy.MethodInterceptor;<br />import net.sf.cglib.proxy.Enhancer;<br />import net.sf.cglib.proxy.MethodProxy;<br />import java.lang.reflect.Method;<br />import org.apache.log4j.Logger;</p>
				<p>public class AOPInstrumenter implements MethodInterceptor{<br /> private Logger log=Logger.getLogger(AOPInstrumenter.class);<br /> private Enhancer enhancer=new Enhancer();<br /> <br /> public Object getInstrumentedClass(Class clz){<br />  enhancer.setSuperclass(clz);<br />  enhancer.setCallback(this);<br />  return enhancer.create();<br /> }<br /> <br /> public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) throws Throwable{<br />  log.info("调用日志方法"+method.getName());<br />  Object result=proxy.invokeSuper(o,args);<br />  return result;<br /> }<br /> <br />}<br />     3）我们来测试一下（AOPTest.java）：<br />public class AOPTest{<br /> public static void main(String[] args){<br />  AOPInstrumenter instrumenter=new AOPInstrumenter();<br />  StudentInfoServiceImpl studentInfo=(StudentInfoServiceImpl)instrumenter.getInstrumentedClass(StudentInfoServiceImpl.class);<br />  studentInfo.findInfo("阿飞");<br /> }<br />}<br />   输出结果与以上相同。<br /> CGLib中为实现以上目的，主要提供的类<br />1)Enhancer：setCallback(Callback) ,setSuperclass(Class) ,create()返回动态子类Object<br />2)MethodInterceptor必须实现的接口：intercept(Object,Method,Object[],MethodProxy)返回的是原方法调用的结果。和Proxy原理一样。</p>
				<p>三、以上的两个简单实现AOP的方案都为你准备好了，你可以自己编写测试一下，以下简单介绍一下AOP的基本概念：<br />1）aspect（切面）：实现了cross-cutting功能，是针对切面的模块。最常见的是logging模块，这样，程序按功能被分为好几层，如果按传统的继承的话，商业模型继承日志模块的话根本没有什么意义，而通过创建一个logging切面就可以使用AOP来实现相同的功能了。<br />2）jointpoint（连接点）：连接点是切面插入应用程序的地方，该点能被方法调用，而且也会被抛出意外。连接点是应用程序提供给切面插入的地方，可以添加新的方法。比如以上我们的切点可以认为是findInfo(String)方法。<br />3）advice（处理逻辑）：advice是我们切面功能的实现，它通知程序新的行为。如在logging里，logging advice包括logging的实现代码，比如像写日志到一个文件中。advice在jointpoint处插入到应用程序中。以上我们在MyHandler.java中实现了advice的功能<br />4）pointcut（切点）：pointcut可以控制你把哪些advice应用于jointpoint上去，通常你使用pointcuts通过正则表达式来把明显的名字和模式进行匹配应用。决定了那个jointpoint会获得通知。<br />5）introduction：允许添加新的方法和属性到类中。<br />6）target（目标类）：是指那些将使用advice的类，一般是指独立的那些商务模型。比如以上的StudentInfoServiceImpl.</p>
				<p>7)proxy（代理类）：使用了proxy的模式。是指应用了advice的对象，看起来和target对象很相似。<br />8）weaving(插入）：是指应用aspects到一个target对象创建proxy对象的过程：complie time，classload time，runtime<br /></p>
				<p>
				</p>
		</div>
<img src ="http://www.blogjava.net/nbtymm/aggbug/51700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-06-09 15:33 <a href="http://www.blogjava.net/nbtymm/archive/2006/06/09/51700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>玩玩Spring之IOC(一)(转载)</title><link>http://www.blogjava.net/nbtymm/archive/2006/06/09/51655.html</link><dc:creator>nbt</dc:creator><author>nbt</author><pubDate>Fri, 09 Jun 2006 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/nbtymm/archive/2006/06/09/51655.html</guid><wfw:comment>http://www.blogjava.net/nbtymm/comments/51655.html</wfw:comment><comments>http://www.blogjava.net/nbtymm/archive/2006/06/09/51655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nbtymm/comments/commentRss/51655.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nbtymm/services/trackbacks/51655.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<table cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
												<tbody>
														<tr>
																<td class="title1" align="middle" width="100%" bgcolor="#eeeeee" colspan="3" height="40">
																</td>
														</tr>
														<tr>
																<td align="middle" width="100%" bgcolor="#eeeeee">
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
						<!-- end of article title -->
						<tr>
								<td valign="top" align="middle" width="100%">
										<!--start of article content -->
										<table width="98%" border="0">
												<tbody>
														<tr>
																<td class="text" align="left" width="100%">     Spring的功能是很强大的，在其“绝不发明自己认为好的轮子，而只发明自己认为不好的轮子”的指导思想下，通过充分实践了“一切实事求是、‘循证架构’的工作方式”的理论，基本上把轻量级的J2EE应用框架（如ORM、MVC等）进行了整合，并构架了一些常用的功能(如DAO)，形成了一个功能强大的J2EE轻量级企业应用框架。<br />　　然而，或许是大家对Spring掌握得还不透彻的缘故吧，看到很多软件企业中用到的Spring功能，基本上大多数都只是用其IOC功能，有时候附带用了其中的AOP事务管理功能。<br />　　IOC及AOP虽然不是Spring首创，然而其在这两块都是做得很不错的，应该说整个Spring框架就是围绕着其IOC实现及AOP实现架设起来的。我想，深入挖掘IOC、AOP以及Spring中的实现，使用等，对于初学者帮助会非常大，因此，从本期开始，大峡的《玩玩Spring系列》将伴随大家一起走进IOC及AOP的世界。<br />　　由于本人水平有限，文中难免有很多不足甚至错误之处，还请各位朋友不吝批评指教。<br /> <br /><b>一、IOC简介</b><br />　　IOC-全称Inversion of Control，中文解释：控制反转。另外，IOC又称DI(全称)Dependency Injection，中文解释：依赖注入。<br />　　呵呵，这些名词搞得有点像学古文的味道哈。很多大师还都说IOC中有一个著名的好莱坞理论：你呆着别动，到时我会找你。你呆着别动，到时我会找你。由于本人未到过好莱坞参加过社会实践，因此，这句话理解有点困难。<br />　　IOC是一种新的设计模式，即IOC模式，系统中通过引入实现了IOC模式的IOC容器，即可由IOC容器来管理对象的生命周期、依赖关系等，从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。其中一个特点就是通过文本的配件文件进行应用程序组件间相互关系的配置，而不用重新修改并编译具体的Java代码。<br />　　当前比较知名的IOC容器有：Pico Container、Avalon 、Spring、JBoss、HiveMind、EJB等，国内由板桥里人负责的国产开源项目Jdon框架，也是具有IOC容器功能(由于没来得及认真研读其源码，似乎jdon中IOC部份是调用Pico的IOC容器功能来实现的)。<br />　　在上面的几个IOC容器中，轻量级的有Pico Container、Avalon、Spring、HiveMind等，超重量级的有EJB，而半轻半重的有容器有JBoss，Jdon等。<br />　　<br />　　IOC究竟是什么？IOC是如何产生的?用在什么场合?为什么我们以前不用IOC，而现在要用IOC？“物有本末，事有终始”，为了更加透彻的理解这一问题，大峡打算从自己所理解的面向对象(OO)设计及编程发展历程来进行分析，也许这样能让IOC的初学者更加了解IOC的发展的前因后果，争取做到“知其然，知其所以然，使其然!”。<br />　　若大家等不急了，就直接百度一下有关IOC的其它文章，这方面国内很多先驱们已经作了很多介绍。如冰云的《IOC详解》、板桥里人的设计模式及IOC理论等。<br /> <br /><b>二、 最老的OO编程</b><br />　　记得曾经看《Think in Java》最早版本的时候，里面有这么一句让人振奋话：一切都是对象。这时我们OO编程的核心是围绕着面向对象编程的三个特性即“继承”、“封装”、“多态”来展开的。<br /><b>2.1 封装</b><br />　　那时我们学会了对现实就的事物及软件模型进行了抽象。比如要描述一只猫，那么这支猫应该有“颜色”、“重量”、“公母”、“脾气”、“出生日期”等属性，另外还有“跑”、“吃”、“叫”、“猫捉老鼠”等方法。如Java代码来表示，大致就是如下：<br />public Class Cat<br />{<br />private String color;//颜色<br />private String weight;//重量<br />private String sex;//公母<br />private String temper;//脾气<br />private String birthday;//出生日期<br />private void run ();//跑<br />private void eat (Food food); //吃(食物)<br />private void shout(int type);//叫(类别)<br />private boolean chase(Mice mice);//猫捉老鼠<br />}<br /> <br /><b>2.2 继承</b><br />　　最早的OO编程时期，我们还会引入继承，还经常鼓励大家多用继续，认为继承就是OO编程思想的核心。继承的核心就是围绕着如何把类与类之间具有共同特性的部份抽象到基类中。认为这样不但能使用了OO的特性，还减少了很多子类的代码。<br />　　我们通过日常生活的常识知道，猫是一种动物，因此动物有的特性他基本上都有。于是，如果我们的系统中不但有猫，还会有很多其它的动物出现。我们就会设计一个动物类，把所有动物的共性抽象到一个基类中。这里，猫及动物基类的代码大致如下：<br />public abstract Class Animal{<br />private String color;//颜色<br />private String weight;//重量<br />private String sex;//公母<br />private String temper;//脾气<br />private String birthday;//出生日期<br />private void run ();//跑<br />private void eat (Food food); //吃(食物)<br />private void shout(int type);//叫(类别)<br />}<br />public Class Cat extends Animal<br /> private int power;//能力<br /> private int agility;//敏捷度<br />   //  猫捉老鼠是特有的方法<br /> private boolean chase(Mice mice) {<br />  return true;<br /> };<br />}<br /> <br /> <br /><b>2.3 多态</b><br />　　这时我们还会不时使用到OO的另外一个特性多态。多态是很重要的一门技术，然而很多时候却没有很好的理解并使用，回头看以前的代码，我们看到有很多地方属于故弄玄虚的嫌疑。<br />　　接上面的例子，假如我们要写一个喂养宠物(有猫、狗、猪、豹、老鼠等)的程序。利用Java的多态特性，我们的大致代码如下：<br />public class PetManage {<br /> //喂食我的宠物<br /> public void feeding(Animal a)<br /> {  <br /> } <br /> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) { <br />  Animal myPet=new Cat();<br />  PetManage pm=new PetManage();     <br />  pm.feeding(myPet);<br /> }<br />}<br />　　通过使用多态特性，哪一天若我们的不喜欢猫，而是喜欢养猪的时候，只要把new Cat()变成new Pig()，即可。<br /> <br /><b>2.4 对象生命周期</b><br />　　这一阶段的OO程序中，我们知道要用一个对象的时候，就要使用Java中的关键字new来生成一个来用即可。OO对于我们来说，一切都是那么简单，很多时候甚至感觉OO跟OP的编程方法也没太大区别。代码如下：<br />Cat myCat=new Cat();//创建一支具体的猫<br />myCat.shout();//叫一声<br />　　此时，我们对Java虚拟是非常信任的，我们的思想也很单纯，我们知道Java对象的生命开始于new关键词。我们不太关心对象生命的结束，我们知道Java有一个比C语言历害、智能化的垃圾收集器，他会帮我们自己的清理内存中不用的对象。<br />　　当然，也有的人由于对垃圾收集器忠诚度的怀疑，不放心垃圾收集器的能力，于是在程序中经常要加一句类似“myPet=null”的代码来结束对象的生命。<br />　　当然，我们也知道有一些外部资源如数据库连接等，需要手动熟悉资源。于是知道在使用类似资源的时候必须都加上一句：conn.close()，有时候还要在close()后面再加一句：conn=null。呵呵，非常有意思。<br /> <br /><b>2.5小结</b><br />　　现在看来，其实那时确实犯了很多幼稚的错误，也走了不少的弯路，做了很多画蛇添足的工作，写了很多难与维护的代码。<br />　　对比今天的IOC模式，若要从早的OO方法中硬要找一个类似Spring的容器的话，那就是：“程序员＋JVM本身”。是程序员以及JVM一起我们管理对象的生命周期、对象之间的关系等。那时候若有任何变动都需要改代码，（虽然好的设计代码修改会非常少，但也得改！），然后编译，然后拿到测试环境及用户环境中执行。如此反复，年日复一日、年复一年。<br />　　那时我们的代码复用用得最多的就是OO的继承功能，另外还有很多OP方法中带过来的函数。<br />　　本文中涉及到的几个简单源码，请到EasyJF开源团队官网下载，地址：<br />　　<a class="l2" href="http://www.easyjf.com/html/bbs/20060602/12718636-1843943.htm?ejid=1287314863003738" target="_blank"><font color="#002c99">http://www.easyjf.com/html/bbs/20060602/12718636-1843943.htm?ejid=1287314863003738</font></a><br /> <br />　　<br /></td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/nbtymm/aggbug/51655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nbtymm/" target="_blank">nbt</a> 2006-06-09 11:57 <a href="http://www.blogjava.net/nbtymm/archive/2006/06/09/51655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>