﻿<?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-龙行天下-随笔分类-Java Web</title><link>http://www.blogjava.net/feingto/category/10712.html</link><description>&amp;nbsp;&amp;nbsp;政  博</description><language>zh-cn</language><lastBuildDate>Thu, 03 Jan 2008 02:25:31 GMT</lastBuildDate><pubDate>Thu, 03 Jan 2008 02:25:31 GMT</pubDate><ttl>60</ttl><item><title>怎么避免浏览器缓存静态文件</title><link>http://www.blogjava.net/feingto/archive/2008/01/03/172357.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Thu, 03 Jan 2008 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2008/01/03/172357.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/172357.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2008/01/03/172357.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/172357.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/172357.html</trackback:ping><description><![CDATA[<div class="postbody">
<p>对于动态文件,比如 index.asp?id=...&nbsp; 或者 index.aspx?id=... 相信有经验的程序员都知道怎样禁止浏览器缓存数据了.<br />
但是对于静态文件(css,jpg,gif等等), 在什么场合下面我们需要禁止浏览器缓存他们,怎么做?<br />
<br />
本文讨论的主题是如何防缓存, 尤其是如何防止静态文件被缓存..<br />
<br />
<br />
在&nbsp; <a href="http://www.cnblogs.com/ashun/archive/2006/12/04/use_cache.html" target="_blank">RE:对博客园URL的一些调整建议, 二级域名不利于客户端浏览器缓存</a> 一文中,我提到了怎么最大化的<br />
利用浏览器缓存功能,来提高客户端浏览速度, 减轻服务器负担的.<br />
<br />
但是事物总是一分为二的,并不是所有的场合都要使用缓存的. 有时候我们的数据被缓存了反而会给我们带来麻烦.<br />
<br />
对于动态数据（从数据库读取生成的那些），我们可以通过以下方法来禁止浏览器缓存。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">'</span><span style="color: #008000">asp&nbsp;为例&nbsp;禁止缓存</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
Response.Buffer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">True</span><span style="color: #000000">&nbsp;<br />
Response.ExpiresAbsolute&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">Now</span><span style="color: #000000">()&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;<br />
Response.Expires&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;<br />
Response.CacheControl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">no-cache</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br />
Response.AddHeader&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Pragma</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">No-Cache</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span></div>
<p>对于Ajax 的请求（不管是静态数据还是动态数据）:</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">//</span><span style="color: #008000">以下三种方法使用其中任何一种方法都可以</span><span style="color: #008000"><br />
</span><span style="color: #000000">xmlhttp.setRequestHeader(</span><span style="color: #000000">"</span><span style="color: #000000">Cache-Control</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">no-cache</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;<br />
</span><span style="color: #008000">//</span><span style="color: #008000">或者</span><span style="color: #008000"><br />
</span><span style="color: #000000">xmlhttp.setRequestHeader(</span><span style="color: #000000">"</span><span style="color: #000000">If-Modified-Since</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008000">//</span><span style="color: #008000">或者</span><span style="color: #008000"><br />
</span><span style="color: #000000">xmlhttp.Open(url</span><span style="color: #000000">+</span><span style="color: #000000">'</span><span style="color: #000000">?</span><span style="color: #000000">rnd</span><span style="color: #000000">=</span><span style="color: #000000">'</span><span style="color: #000000">+</span><span style="color: #000000">Math.random(),....)<br />
</span></div>
<p>如果使用 prototype.js&nbsp; ,&nbsp;用类似这样的代码&nbsp;<br />
new Ajax.Request(url,{method:"get",requestHeaders:[<span style="color: #000000">"</span><span style="color: #000000">Cache-Control</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">no-cache</span><span style="color: #000000">"</span>]})<br />
或者<br />
new Ajax.Request(url,{method:"get",requestHeaders:[<span style="color: #000000"><span style="color: #000000">"</span><span style="color: #000000">If-Modified-Since</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span></span>]})<br />
&nbsp;<br />
<br />
什么情况下，要禁止静态文件缓存：<br />
1、经常可能要改动的 js, css.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如 一个html 文件， test.html 在 1.0版本中。可能是这样<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;script src="common.js"&gt;&lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 修改后&nbsp; v1.1版本：<br />
&nbsp;&lt;script src="common.js"&gt;&lt;/script&gt;<br />
&nbsp;&lt;script src="foo.js"&gt;&lt;/script&gt;<br />
&nbsp;&nbsp; 新增加了一个foo.js&nbsp; 同时，也改动了common.js , 在common.js 中定义了新的类，并在foo.js 中使用了common.js.&nbsp; <br />
<br />
在这种情况下如果以前用户浏览过 1.0版本的 html 文件，那么他的浏览器自动缓存了 common.js<br />
当他浏览新版本的时候，因为使用的是 v1.1的 foo.js 和 v1.0的 common.js ，这样将导致脚本出错。<br />
<br />
<br />
解决方法探讨：<br />
&nbsp;&nbsp;因为css,js 是通过 &lt;script src=....&gt; 这种方式加载的，所以，很难使用 asp 的那种服务器端禁止缓存的办法。也很难使用ajax的通过设置 http请求头的办法禁止使用缓存。<br />
<br />
看来随机数是个好办法。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">//</span><span style="color: #008000">方法一：</span><span style="color: #008000"><br />
</span><span style="color: #000000">document.write(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;script&nbsp;src='test.js?rnd=</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">Math.random()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">'&gt;&lt;/s</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">cript&gt;</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<br />
</span><span style="color: #008000">//</span><span style="color: #008000">方法二：</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;js</span><span style="color: #000000">=</span><span style="color: #000000">document.createElement(</span><span style="color: #000000">"</span><span style="color: #000000">script</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
js.src</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">test.js</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">Math.random()<br />
document.body.appendChild(js)</span></div>
<p><br />
但是，如果采用随机数的话， js文件将永远得不到缓存，每次都必须重新从服务器加载，即使没有任何更改。<br />
大家如果经常上国外网站的话，可以看到他们通常采用这样的方式来解决：<br />
&lt;script src="test.js?ver=113"&gt;&lt;/script&gt;<br />
其中 ver=113 的 113就是版本号，一般都是采用 CVS 或其他工具生成的开发版本号。<br />
<br />
这样真正做到了应该缓存的时候缓存静态文件，当版本有更新的时候从获取最新的版本，并更新缓存。<br />
对于图像 &lt;img src="test.jps?ver=在CVS的版本号"&gt; 来有效利用和更新缓存.<br />
<br />
<br />
唉，现在在CSDN的Web版，不知道有多少人在重复问着同一个问题。&#8220;怎么通过程序删除清空客户端的浏览器缓存&#8221;.........</p>
<p>&nbsp;</p>
<p>未完待续： <br />
<br />
下一篇：&nbsp; 利用浏览器缓存来改善用户体验。。。。Ajax模式之预先加载<br />
<br />
敬请关注，等我写完再加上链接<br />
</p>
</div>
<img src ="http://www.blogjava.net/feingto/aggbug/172357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2008-01-03 09:19 <a href="http://www.blogjava.net/feingto/archive/2008/01/03/172357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中的时间操作</title><link>http://www.blogjava.net/feingto/archive/2006/05/10/45375.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Wed, 10 May 2006 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2006/05/10/45375.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/45375.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2006/05/10/45375.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/45375.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/45375.html</trackback:ping><description><![CDATA[		<p>jsp中的时间操作</p>
		<p>经常看见jsp版里有人问时间操作的问题，这些问题一般包括：取当前时间，把一个指定的字符串时间转化成时间类型，求两个时间之间的天数，求一段时间以前的时间，求一段时间以后的时间，在这里就把这些问题汇总一下。<br />&lt;%@&#160; page&#160; contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.text.*"%&gt;<br />&lt;%@ page import="java.util.*"%&gt;<br />&lt;%<br />//字符串转化成时间类型（字符串可以是任意类型，只要和SimpleDateFormat中的格式一致即可）<br />java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("M/dd/yyyy hh:mm:ss a",java.util.Locale.US);<br />java.util.Date d = sdf.parse("5/13/2003 10:31:37 AM");&#160; <br />out.println(d);<br />out.println("&lt;br&gt;");<br />SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");<br />String mDateTime1=formatter.format(d);<br />out.println(mDateTime1);<br />out.println("&lt;br&gt;");<br />out.println(d.getTime());<br />out.println("&lt;br&gt;");<br />//当前时间<br />Calendar cal&#160; = Calendar.getInstance();<br />//&#160; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd&#160; HH:mm:ss");<br />SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd&#160; HH:mm:ss G E D F w W a E F");<br />String mDateTime=formatter.format(cal.getTime());<br />out.println(mDateTime);<br />out.println("&lt;br&gt;");<br />//1年前日期<br />java.util.Date myDate=new java.util.Date();&#160; <br />long myTime=(myDate.getTime()/1000)-60*60*24*365;<br />myDate.setTime(myTime*1000);<br />String mDate=formatter.format(myDate);<br />out.println(mDate);<br />out.println("&lt;br&gt;");<br />//明天日期<br />myDate=new java.util.Date(); <br />myTime=(myDate.getTime()/1000)+60*60*24;<br />myDate.setTime(myTime*1000);<br />mDate=formatter.format(myDate);<br />out.println(mDate);<br />out.println("&lt;br&gt;");<br />//两个时间之间的天数<br />SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");<br />java.util.Date date= myFormatter.parse("2003-05-1"); <br />java.util.Date mydate= myFormatter.parse("1899-12-30");<br />long&#160; day=(date.getTime()-mydate.getTime())/(24*60*60*1000);<br />out.println(day);<br />out.println("&lt;br&gt;");<br />//加半小时<br />SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");<br />java.util.Date date1 = format.parse("2002-02-28 23:16:00");<br />long Time=(date1.getTime()/1000)+60*30;<br />date1.setTime(Time*1000);<br />String mydate1=formatter.format(date1);<br />out.println(mydate1);<br />out.println("&lt;br&gt;");<br />//年月周求日期<br />SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM F E");<br />java.util.Date date2= formatter2.parse("2003-05 5 星期五"); <br />SimpleDateFormat formatter3 = new SimpleDateFormat("yyyy-MM-dd");<br />String mydate2=formatter3.format(date2);<br />out.println(mydate2);<br />out.println("&lt;br&gt;");<br />//求是星期几<br />mydate= myFormatter.parse("2001-1-1");<br />SimpleDateFormat formatter4 = new SimpleDateFormat("E");<br />String mydate3=formatter4.format(mydate);<br />out.println(mydate3);<br />out.println("&lt;br&gt;");<br />%&gt; </p>
 <img src ="http://www.blogjava.net/feingto/aggbug/45375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2006-05-10 10:41 <a href="http://www.blogjava.net/feingto/archive/2006/05/10/45375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate的中文问题的解决方案</title><link>http://www.blogjava.net/feingto/archive/2006/05/08/45003.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Mon, 08 May 2006 06:42:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2006/05/08/45003.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/45003.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2006/05/08/45003.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/45003.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/45003.html</trackback:ping><description><![CDATA[
		<p>系统配置:win2k3 server,jsdk 1.5.0 rc,mysql 4.0.20a,hibernate 2.1.0 ,elcipse 3.0.1<br />问题描述:在使用hibernate作为数据持久层的方案时，照样会遇到中文问题，具体情况时插入到数据库中的汉字显示为??，显示数据时汉字为??<br />探索: 经过试验发现与汉字编码有关的地方有以下两处，一个是数据库连接url ，一个是编程时获取Configuration 类的实例的语句的方式。<br />方案1:<br />    * 编程时获取Configuration 类的实例的语句为<br />    * new Configuration().addClass(xx.class);<br />    必须在hibernate.properties文件里数据库连接url后加上?characterEncoding=gbk&amp;useUnicode=true<br />方案2:<br />    * 编程时获取Configuration 类的实例的语句为<br />    * new Configuration().configure().<br />    在hibernate.cfg.xml文件的&lt;session-factory/&gt;块中设置<br />        &lt;property name="connection.useUnicode"&gt;true&lt;/property&gt; <br />        &lt;property name="connection.characterEncoding"&gt;UTF-8&lt;/property&gt;<br />    或编程时写:<br />      Properties extraProperties = new Properties(); <br />      extraProperties.put("hibernate.connection.useUnicode", "true"); <br />      extraProperties.put("hibernate.connection.characterEncoding", "UTF-8"); <br />      myConfiguration.addProperties(extraProperties);</p>
		<p>原来怀疑与xml页面的编码有关试了一下，好像不起作用。<br /></p>
<img src ="http://www.blogjava.net/feingto/aggbug/45003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2006-05-08 14:42 <a href="http://www.blogjava.net/feingto/archive/2006/05/08/45003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts框架内实现图片上传 (转载:http://www.blogjava.net/Todayfreeman/)</title><link>http://www.blogjava.net/feingto/archive/2006/05/03/44466.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Wed, 03 May 2006 12:09:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2006/05/03/44466.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/44466.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2006/05/03/44466.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/44466.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/44466.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>
						<font size="2">这个问题让我郁闷了两三天时间,最后才发现问题是在JSP端  &lt;html:form action="/uploadsAction"  enctype="multipart/form-data"  &gt;<br />标签如果少了"  enctype="multipart/form-data"  服务器就会报错,<br />下面把代码贴出来.<br /><br />JSP端<br /> &lt;html:errors /&gt;<br />          &lt;html:form action="/uploadsAction"  enctype="multipart/form-data"  &gt;<br />            &lt;html:file property="theFile" /&gt;  <br />             &lt;html:radio property="upType" value="a" /&gt;CSVFileReader<br />             &lt;html:radio property="upType" value="b" /&gt;FileUp       <br />            &lt;html:submit value="OK"  /&gt;<br />          &lt;/html:form&gt;<br />FormBean中将属性定义为FormFile,geter seter 方法依旧.<br />Action 中的代码如下:实现将图片上传至UPLOAD文件夹内 如果文件大于20K或是宽＆高超过规定范围的,会重新勾画.实现对上传图片的控制.<br />当然这只是测试Action没有跳转页面..<br /><br />package upload;</font>
				</p>
				<p>
						<font size="2">import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.action.ActionForm;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.Action;<br />import org.apache.struts.upload.*;<br />import java.io.IOException;<br />import java.awt.Image;<br />import java.awt.image.BufferedImage;<br />import com.sun.image.codec.jpeg.JPEGImageEncoder;<br />import com.sun.image.codec.jpeg.JPEGCodec;</font>
				</p>
				<p>
						<font size="2">import java.io.File;<br />import java.io.BufferedInputStream;<br />import java.io.BufferedOutputStream;<br />import java.io.FileOutputStream;</font>
				</p>
				<p>
						<font size="2">public class UploadAction extends Action {<br />    public ActionForward execute(ActionMapping actionMapping,<br />                                 ActionForm actionForm,<br />                                 HttpServletRequest servletRequest,<br />                                 HttpServletResponse servletResponse)throws Exception {<br />        System.out.println("asdasdasdasdasdasd");<br />        UploadForm uploadForm = (UploadForm) actionForm;<br />        FormFile pic =  uploadForm.getPic();<br />        String picname = pic.getFileName();<br />        String uploadFileName = servletRequest.getSession()<br />                                .getServletContext()<br />                                .getRealPath("upload")+"<a href="file://%22+picname/"><font color="#cc9966">\\"+picname</font></a>;<br />        File upliadFile = new File(uploadFileName);<br />        BufferedInputStream bis = null;<br />        Image image = null;<br />        BufferedOutputStream bos = null;<br />        try{<br />        if(pic.getFileSize()&lt;2*1024*1024){<br />        bis = new BufferedInputStream(pic.getInputStream());<br />        image = javax.imageio.ImageIO.read(bis);<br />        int width = image.getWidth(null);<br />        int height = image.getHeight(null);<br />        int w = 160;<br />        int h = 120;<br />        if(width&gt;w||height&gt;h){<br />        BufferedImage bi = new BufferedImage(w,h,<br />                                             BufferedImage.TYPE_INT_RGB);<br />        bi.getGraphics().drawImage(image,0,0,w,h,null);<br />        bos = new BufferedOutputStream(new FileOutputStream(<br />       upliadFile));<br />        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);<br />     encoder.encode(bi);<br />        System.out.println(width * height);<br />        }else{<br />        bos = new BufferedOutputStream(new FileOutputStream(upliadFile));<br />        byte[] date = new byte[5*1024];<br />        int len = bis.read(date);<br />        while (len!=-1){<br />            bos.write(date);<br />            len = bis.read(date);<br />        }<br />        }<br />        }<br />             return actionMapping.findForward("ok");<br />        }catch(Exception e){<br />        e.printStackTrace();<br />    } finally {<br />        try {<br />            if (bis != null)<br />                bis.close();<br />        } catch (IOException e1) {</font>
				</p>
				<p>
						<font size="2">            e1.printStackTrace();<br />        }<br />        try {<br />            if (bos != null)<br />                bos.close();<br />        } catch (IOException e2) {</font>
				</p>
				<p>
						<font size="2">            e2.printStackTrace();<br />        }<br />    }</font>
				</p>
				<p>
						<font size="2">        return actionMapping.findForward("ok");<br />    }<br />}<br /></font>
				</p>
		</div>
<img src ="http://www.blogjava.net/feingto/aggbug/44466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2006-05-03 20:09 <a href="http://www.blogjava.net/feingto/archive/2006/05/03/44466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts1.2中配置数据源</title><link>http://www.blogjava.net/feingto/archive/2006/05/03/44465.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Wed, 03 May 2006 12:05:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2006/05/03/44465.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/44465.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2006/05/03/44465.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/44465.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/44465.html</trackback:ping><description><![CDATA[		<p>软件环境：Tomcat5.5.15,Eclipse3.1.2,MyEclipse4.1,MySQL5.0.15,Resin3.0.18</p>
		<p>配置过程：</p>
		<p>一、下载必要的jar包。有四个包要下载（网上有贴子说只要下面前三个包就可以了，但我在配置的时候如果没有第四个包会报错）。<br /><a href="http://apache.linuxforum.net/dist/jakarta/commons/dbcp/binaries/commons-dbcp-1.2.zip">http://apache.linuxforum.net/dist/jakarta/commons/dbcp/binaries/commons-dbcp-1.2.zip</a><br /><a href="http://apache.linuxforum.net/dist/jakarta/commons/pool/binaries/commons-pool-1.2.zip">http://apache.linuxforum.net/dist/jakarta/commons/pool/binaries/commons-pool-1.2.zip</a><br /><a href="http://apache.linuxforum.net/dist/jakarta/struts/struts-legacy/struts-legacy-1.0.zip">http://apache.linuxforum.net/dist/jakarta/struts/struts-legacy/struts-legacy-1.0.zip</a><br /><a href="http://apache.linuxforum.net/dist/jakarta/commons/collections/binaries/commons-collections-3.1.zip">http://apache.linuxforum.net/dist/jakarta/commons/collections/binaries/commons-collections-3.1.zip</a><br />把这四个jar包放到web应用的WEB-INF/lib目录下，还有要把MySQL的驱动程序包也放到这里（也可以把数据库的驱动包放到%Tomcat_Home%/common/lib目录下或%Resin_Home%/lib目录下，这样在启动Web服务器的时候就会加载这个包，服务器和Web应用都可以使用驱动程序类）</p>
		<p>二、在struts-config.xml中添加Data Source。MyEclipse的Design模式下可以可视化地编辑struts-config.xml和添加Data Source，但它在struts-config.xml中生成的数据源的代码是错误的！就是因为这个耽误了我很多时间！<br />我们手工编辑代码：</p>
		<p>&#160; &lt;data-sources&gt;<br />&#160;&#160;&#160; &lt;data-source key="datasource" type="org.apache.commons.dbcp.BasicDataSource"&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="password" value="admin" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="minCount" value="3" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="maxCount" value="10" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="username" value="admin" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="driverClassName" value="com.mysql.jdbc.Driver" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="description" value="test" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="url" value="jdbc:mysql://localhost/test" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="readOnly" value="false" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="autoCommit" value="true" /&gt;<br />&#160;&#160;&#160; &lt;/data-source&gt;<br />&#160; &lt;/data-sources&gt;</p>
		<p>如果要配置多个data source，可以给每个data source指定不同的key，然后在程序中根据key指定要引用的数据源。</p>
		<p>三、测试数据源。配置好以后就可以在ActionServlet中使用了。</p>
		<p>&#160; DataSource ds = getDataSource(request,"datasource");<br />&#160; Connection conn = ds.getConnection();<br />&#160; Statement stmt = conn.createStatement();<br />&#160; ResultSet rs = stmt.executeQuery("SQL String");</p>
		<p>附： Struts1.1中struts-config.xml的配置：</p>
		<p>&#160; &lt;data-sources &gt;<br />&#160;&#160;&#160; &lt;data-source key="datasource" type="org.apache.struts.util.GenericDataSource"&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="password" value="admin" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="minCount" value="2" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="maxCount" value="10" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="user" value="admin" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="driverClass" value="com.mysql.jdbc.Driver" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="description" value="test" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="url" value="jdbc:mysql://localhost/test" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="readOnly" value="false" /&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;set-property property="autoCommit" value="true" /&gt;<br />&#160;&#160;&#160; &lt;/data-source&gt;<br />&#160; &lt;/data-sources&gt;</p>
		<p>注意：蓝色字体的部分是1.1和1.2在配置上不一样的地方。<br /></p>
  <img src ="http://www.blogjava.net/feingto/aggbug/44465.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2006-05-03 20:05 <a href="http://www.blogjava.net/feingto/archive/2006/05/03/44465.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个高效简洁的Struts分页方法</title><link>http://www.blogjava.net/feingto/archive/2006/05/03/44462.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Wed, 03 May 2006 12:04:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2006/05/03/44462.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/44462.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2006/05/03/44462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/44462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/44462.html</trackback:ping><description><![CDATA[在网上看了几个Structs分页，感觉不是很完善，于是根据自己的经验，写了一个相对高效简洁的分页方法。由于本人水平有限，如果大家有什么更好的想法，欢迎不吝赐教。<br />　　<br />　　一、 开发环境<br />　　<br />　　我的开发环境是：JBuilder x + Weblogic 8.1 + Oracle 9i + Windows 2003 ，如果朋友们的开发环境不一样亦无妨。<br />　　<br />　　二、开发思路<br />　　<br />　　既然讲的是Struts，那自然离不了MVC，分页显示也是如此。<br />　　<br />　　1、 建立数据库和对应的表，本例的表是TCertificate。<br />　　<br />　　2、 建立适当的模型组件，对应你要查询数据库中的表。这部分由DAO数据访问层来实现，如果有的朋友对DAO不熟悉可以查询一下相关资料。本例由CertificateDAO.java来实现。<br />　　<br />　　3 、建立分页所需要的模型组件，由javaBean来充当，并与CertificateDAO实现分离。网上介绍的很多方法，都存在着数据与分页组件藕合的现象，这也是本方法与其它分页方法的主要不同之处。<br />　　<br />　　4、建立控制器组件，这部分由Struts 中的Action来实现。主要负责将实例化CertificateDAO，只取要显示的数据记录，存入ArrayList对象然后返回，并放到 request中。而分页部分则根据分页条件，单独进行构造，避免了与DAO混在一起的情况发生。网上其它介绍的一些分页方法中，基本上都是一次性读出所有查询的数据，然后再由分页相关组件进行构造。这样，如果数据量大的话，很容易形成瓶颈。在本例中由于不是一次性地读出查询的所有数据，而只是读出一个页面要显示的数据记录，这就节省了很多不必要的数据传输，提高了效率。本例中为CertificateAction.java。<br />　　<br />　　 5、建立视图组件，这部分由jsp来充当，为了不出现java 代码，我们使用Struts提供的标签库，主要负责从request中取出刚刚放入的对象，通过反复调用CertificateAction以及 action参数，而实现分页显示。本例中为listcertificate.jsp。<br />　　<br />　　6、 建立并配置struts-config.xml。<br />　　<br />　　三、实例代码<br />　　<br />　　确定好上面的开发思路后，代码的实现就有单可循了。<br />　　<br />　　1、建数据库和相应的表。<br />　　<br />　　2、数据逻辑层的相关代码。<br />　　<br />　　1）、通用的DAO类：CommonDAO.java<br />　　<br />　　这是一个很多DAO都要继承到的通用DAO类，是我根据实践总结出来的，为了减少篇幅，这里只显示和本例相关的代码。<br />　　<br />　　java代码:<br />　　<br />　　代码：<br />　　--------------------------------------------------------------------------------<br />　　package com.xindeco.business ;<br />　　import java.io.*;<br />　　import java.sql.*;<br />　　import java.util.*;<br />　　import javax.sql.*;<br />　　import java.lang.IllegalAccessException;<br />　　import java.lang.reflect.InvocationTargetException;<br />　　import org.apache.commons.beanutils.BeanUtils;<br />　　public class DAO<br />　　{<br />　　protected DataSource ds;<br />　　/**<br />　　* 说明:取得当前查询的总记录数<br />　　*/<br />　　public int getRows ()<br />　　{<br />　　return this.count;<br />　　}<br />　　public void rsHandler (ResultSet rs, int offset, int limit)<br />　　{<br />　　try<br />　　{<br />　　count = 0;<br />　　rs.absolute ( -1) ;<br />　　count = rs.getRow () ;<br />　　if (offset &lt;= 0)<br />　　{<br />　　rs.beforeFirst () ;<br />　　}<br />　　else<br />　　{<br />　　rs.absolute (offset) ;<br />　　}<br />　　}<br />　　catch (Exception e)<br />　　{<br />　　e.printStackTrace () ;<br />　　}<br />　　}<br />　　public DAO(DataSource ds) {<br />　　this.ds = ds;<br />　　}<br />　　<br />　　public void setDataSource(DataSource ds) {<br />　　this.ds = ds;<br />　　}<br />　　<br />　　protected void close(ResultSet rs) {<br />　　if (rs != null) {<br />　　try {<br />　　rs.close();<br />　　} catch (SQLException e) {<br />　　}<br />　　rs = null;<br />　　}<br />　　}<br />　　<br />　　protected void close(PreparedStatement pstmt) {<br />　　if (pstmt != null) {<br />　　try {<br />　　pstmt.close();<br />　　} catch (SQLException e) {<br />　　}<br />　　pstmt = null;<br />　　}<br />　　}<br />　　protected void close(Connection conn) {<br />　　if (conn != null) {<br />　　try {<br />　　conn.close();<br />　　} catch (SQLException e) {<br />　　e.printStackTrace();<br />　　}<br />　　conn = null;<br />　　}<br />　　}<br />　　<br />　　protected void rollback(Connection conn) {<br />　　if (conn != null) {<br />　　try {<br />　　conn.rollback();<br />　　} catch (SQLException e) {<br />　　e.printStackTrace();<br />　　}<br />　　conn = null;<br />　　}<br />　　}<br />　　}<br />　　<br />　　这个类主要是通过子类传进来的先进结果集，取得查询的记录总数，并对数据库连接进行简单的管理。<br />　　<br />　　2）、对数据库进行访问：CertificateDAO.java<br />　　<br />　　java代码:<br />　　<br />　　代码：<br />　　--------------------------------------------------------------------------------<br />　　package com.xindeco.business;<br />　　<br />　　import java.io.*;<br />　　import java.sql.*;<br />　　import java.util.*;<br />　　import javax.sql.*;<br />　　<br />　　import com.xindeco.common.dbconn.DbConn;<br />　　<br />　　public class CertificateDAO extends DAO<br />　　{<br />　　<br />　　public NationDAO(DataSource ds) {<br />　　super(ds);<br />　　}<br />　　<br />　　public List findCertificateList(int offset,int limit) throws SQLException<br />　　{<br />　　int countRows = 0 ;<br />　　ArrayList list = null ;<br />　　Connection conn = null;<br />　　PreparedStatement pstmt = null;<br />　　ResultSet rs = null;<br />　　try<br />　　{<br />　　conn = ds.getConnection();<br />　　String sql =<br />　　"SELECT certificateID, certificateCode,certificateName,photoURL,"<br />　　+ "description,graduateID FROM TCertificate " ;<br />　　pstmt = conn.prepareStatement(sql);<br />　　rs = pstmt.executeQuery();<br />　　/*对游标进行处理，rsHandler 方法在父类DAO中*/<br />　　this.rsHandler(rs,offset,limit);<br />　　if (rs != null &amp;&amp; rs.next ())<br />　　{<br />　　list = new ArrayList () ;<br />　　do<br />　　{<br />　　countRows++ ;<br />　　list.add (rs2VO (rs)) ;<br />　　}<br />　　while ( (countRows++ &lt; limit) &amp;&amp; rs.next ()) ;<br />　　}<br />　　close(rs);<br />　　close(pstmt);<br />　　} catch (SQLException e) {<br />　　close(rs);<br />　　close(pstmt);<br />　　rollback(conn);<br />　　e.printStackTrace();<br />　　}<br />　　finally {<br />　　close(conn);<br />　　}<br />　　return list ;<br />　　}<br />　　<br />　　private CertificateVO rs2VO (ResultSet rs)<br />　　{<br />　　try<br />　　{<br />　　CertificateVO certificateVO = new CertificateVO () ;<br />　　certificateVO.setCertificateID (rs.getInt ("certificateID")) ;<br />　　certificateVO.setCertificateCode (rs.getString ("certificateCode")) ;<br />　　certificateVO.setCertificateName (rs.getString ("certificateName")) ;<br />　　certificateVO.setPhotoURL (rs.getString ("photoURL")) ;<br />　　certificateVO.setDescription (rs.getString ("description")) ;<br />　　certificateVO.setGraduateID (rs.getInt ("graduateID")) ;<br />　　return certificateVO ;<br />　　}<br />　　catch (Exception ex)<br />　　{<br />　　ex.printStackTrace () ;<br />　　return null ;<br />　　}<br />　　}<br />　　}<br />　　<br />　　findCertificateList(int offset,int limit)是查得所有要显示的数据，并放入ArrayList中。看过网上有些例子，把数据记录放入ArrayList的动作过程直接在while循环体里完成，如果字段多的话，会造成方法过于宠大，又不美观。这里，数据记录放入ArrayList的动作过程由rs2VO方法完成，就比较整洁了。另外，if (rs != null &amp;&amp; rs.next ()) 配合while ( (countRows++ &lt; limit) &amp;&amp; rs.next ()) 是为了程序的健壮性考虑的，稍分析一下不难得出结论。<br />　　<br />　　3、建立控制器组件：CertificateAction.java<br />　　<br />　　java代码:<br />　　<br />　　代码：<br />　　--------------------------------------------------------------------------------<br />　　package com.xindeco.presentation;<br />　　<br />　　import javax.sql.* ;<br />　　import java.util.* ;<br />　　<br />　　import javax.servlet.http.* ;<br />　　import javax.servlet.* ;<br />　　<br />　　import org.apache.struts.action.* ;<br />　　import org.apache.struts.util.* ;<br />　　<br />　　import com.xindeco.common.Pager;<br />　　import com.xindeco.business.graduatedata.CertificateDAO ;<br />　　<br />　　public class CertificateAction<br />　　extends Action<br />　　{<br />　　private static final int PAGE_LENGTH = 5 ; //每页显示5条记录<br />　　public ActionForward execute (ActionMapping mapping, Actionform form,<br />　　HttpServletRequest request,<br />　　HttpServletResponse response)<br />　　{<br />　　ActionForward myforward = null ;<br />　　String myaction = mapping.getParameter () ;<br />　　<br />　　if (isCancelled (request))<br />　　{<br />　　return mapping.findForward ("failure") ;<br />　　}<br />　　if ("".equalsIgnoreCase (myaction))<br />　　{<br />　　myforward = mapping.findForward ("failure") ;<br />　　}<br />　　else if　　　　("LIST".equalsIgnoreCase (myaction))<br />　　{<br />　　myforward = performList (mapping, form, request, response) ;<br />　　}<br />　　else<br />　　{<br />　　myforward = mapping.findForward ("failure") ;<br />　　}<br />　　return myforward ;<br />　　}<br />　　<br />　　private ActionForward performList (ActionMapping mapping,<br />　　Actionform actionform,<br />　　HttpServletRequest request,<br />　　HttpServletResponse response)<br />　　{<br />　　try<br />　　{<br />　　DataSource ds = (DataSource) servlet.getServletContext().getAttribute(Action.DATA_SOURCE_KEY);<br />　　<br />　　CertificateDAO　 certificateDAO　= new CertificateDAO　(ds) ;<br />　　<br />　　int offset = 0;　 //翻页时的起始记录所在游标<br />　　int length = PAGE_LENGTH;<br />　　String pageOffset = request.getParameter("pager.offset");<br />　　if (pageOffset == null || pageOffset.equals("")) {<br />　　offset = 0;<br />　　} else {<br />　　offset = Integer.parseInt(pageOffset);<br />　　}<br />　　List certificateList = certificateDAO .findCertificateList (offset,length) ;<br />　　int size = certificateDAO.getRows(); //　取得总记录数<br />　　String url = request.getContextPath()+"/"+mapping.getPath()+".do";<br />　　String pagerHeader = Pager.generate(offset, size, length, url); //分页处理<br />　　<br />　　request.setAttribute ("pager", pagerHeader) ;<br />　　request.setAttribute ("list", certificateList) ;<br />　　}<br />　　catch (Exception e)<br />　　{<br />　　e.printStackTrace();<br />　　return mapping.findForward ("error") ;<br />　　}<br />　　return mapping.findForward ("success") ;<br />　　}<br />　　}<br />　　<br />　　CertificateAction.java主要是把数据从DAO中取出，并放入一个ArrayList 中，然后通过配置文件再软件View的JSP页。<br />　　<br />　　5、建立视图listcertificate.jsp文件。<br />　　<br />　　jsp代码:<br />　　<br />　　代码：<br />　　--------------------------------------------------------------------------------<br />　　<br />　　&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />　　&lt;%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %&gt;<br />　　&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt;<br />　　&lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %&gt;<br />　　&lt;%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %&gt;<br />　　<br />　　&lt;table bgcolor="#666666" cellpadding="1" cellspacing="0" border="0" width="500"&gt;<br />　　&lt;tr&gt;<br />　　&lt;td&gt;<br />　　&lt;table cellpadding="0" cellspacing="0" border="0" width="500"&gt;<br />　　&lt;tr&gt;<br />　　&lt;td bgcolor="#fecc51"&gt;&amp;&lt;/td&gt;<br />　　&lt;/tr&gt;<br />　　&lt;/table&gt;<br />　　&lt;/td&gt;<br />　　&lt;/tr&gt;<br />　　&lt;tr&gt;<br />　　&lt;td&gt;<br />　　&lt;table cellpadding="0" cellspacing="0" border="0" width="500"&gt;<br />　　&lt;tr&gt;<br />　　&lt;td bgcolor="#d6e0ed"&gt;<br />　　&amp;&amp;&lt;bean:message key="label.list4certificate"/&gt;<br />　　&lt;/td&gt;<br />　　&lt;/tr&gt;<br />　　&lt;tr bgcolor="#FFFFFF"&gt;<br />　　&lt;td width="5%"&gt;&lt;/td&gt;&lt;td width="19%"&gt;&lt;/td&gt;&lt;td width="76%"&gt;&lt;/td&gt;<br />　　&lt;/tr&gt;<br />　　&lt;tr&gt;<br />　　&lt;td&gt;<br />　　&lt;table bgcolor="#f2f2f2" width="500" cellspacing="0" border="0"&gt;<br />　　&lt;tr bgcolor="#bacce1"&gt;<br />　　&lt;td&gt;&lt;b&gt;&lt;bean:message key="Certificate.select"/&gt; &lt;/b&gt;&lt;/td&gt;<br />　　&lt;td&gt;&lt;b&gt;&lt;bean:message key="Certificate.certificateID"/&gt; &lt;/b&gt;&lt;/td&gt;<br />　　&lt;td&gt;&lt;b&gt;&lt;bean:message key="Certificate.certificateCode"/&gt;&lt;/b&gt;&lt;/td&gt;<br />　　&lt;td&gt;&lt;b&gt;&lt;bean:message key="Certificate.certificateName"/&gt;&lt;/b&gt;&lt;/td&gt;<br />　　&lt;td&gt;&lt;b&gt;&lt;bean:message key="Certificate.view"/&gt;&lt;/b&gt;&lt;/td&gt;<br />　　&lt;/tr&gt;<br />　　<br />　　&lt;bean:write name="pager" property="description"/&gt;<br />　　&lt;logic:equal name="pager" property="hasPrevious" value="true"&gt;<br />　　&lt;a href="/graduatedata/list.do?viewPage=&lt;bean:write name="pager" property="previousPage"/&gt;" class="a02"&gt;<br />　　Previous<br />　　&lt;/a&gt;<br />　　&lt;/logic:equal&gt;<br />　　&lt;logic:equal name="pager" property="hasNext" value="true"&gt;<br />　　&lt;a href="/graduatedata/list.do?viewPage=&lt;bean:write name="pager" property="nextPage"/&gt;" class="a02"&gt;<br />　　Next<br />　　&lt;/a&gt;<br />　　&lt;/logic:equal&gt;<br />　　<br />　　&lt;logic:notEmpty name="list" scope="request"&gt;<br />　　&lt;logic:iterate id="certificate" name="list" type="com.xindeco.business.graduatedata.CertificateVO"scope="request"&gt;<br />　　&lt;tr bgcolor="#FFFFFF"&gt;<br />　　&lt;td&gt;&lt;html:text property="name" value="&lt;bean:write name="certificate" property="certificateID" scope="page"/&gt;"/&gt;<br />　　&lt;/td&gt;<br />　　&lt;td&gt; &lt;bean:write name="certificate" property="certificateID" scope="page"/&gt;&lt;/td&gt;<br />　　&lt;td&gt; &lt;bean:write name="certificate" property="certificateCode" scope="page"/&gt;&lt;/td&gt;<br />　　&lt;td&gt; &lt;bean:write name="certificate" property="certificateName" scope="page"/&gt;&lt;/td&gt;<br />　　&lt;td&gt; &lt;bean:write name="certificate" property="photoURL" scope="page"/&gt;&lt;/td&gt;<br />　　&lt;/tr&gt;<br />　　&lt;/logic:iterate&gt;<br />　　&lt;/logic:notEmpty&gt;<br />　　&lt;/table&gt;<br />　　&lt;/td&gt;<br />　　&lt;/tr&gt;<br />　　&lt;/table&gt;<br />　　&lt;/td&gt;<br />　　&lt;/tr&gt;<br />　　&lt;/table&gt;<br />　　<br />　　6、对应的配置文件struts-config.xml。<br />　　<br />　　java代码:<br />　　<br />　　代码：<br />　　--------------------------------------------------------------------------------<br />　　&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />　　&lt;!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "<a href="http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd</a>"&gt;<br />　　&lt;struts-config&gt;<br />　　&lt;form-beans&gt;<br />　　&lt;form-bean name="certificateform" type="com.xindeco.presentation.graduatedata.Certificateform" /&gt;<br />　　&lt;/form-beans&gt;<br />　　&lt;global-forwards&gt;<br />　　&lt;forward name="error" path="/error/error.jsp" /&gt;<br />　　&lt;/global-forwards&gt;<br />　　&lt;action-mappings&gt;<br />　　&lt;action name="certificateform" parameter="LIST" path="/graduatedata/list" scope="request" type="com.xindeco.presentation.graduatedata.CertificateAction" validate="true"&gt;<br />　　&lt;forward name="success" path="/graduatedata/listcertificate.jsp" /&gt;<br />　　&lt;/action&gt;<br />　　&lt;/action-mappings&gt;<br />　　……<br />　　&lt;/struts-config&gt;<br />　　<br />　　7、最后当然是最重要的分页代码了：Pager.java<br />　　<br />　　java代码:<br />　　<br />　　代码：<br />　　--------------------------------------------------------------------------------<br />　　package com.xindeco.common;<br />　　<br />　　import java.util.* ;<br />　　public class Pager {<br />　　private static int MAX_PAGE_INDEX = 10; //页脚显示多少页<br />　　private static String HEADER = "Result page";<br />　　<br />　　public static String generate(int offset, int length, int size, String url) {<br />　　if (length &gt; size) {<br />　　String pref;<br />　　if (url.indexOf("?") &gt; -1) {<br />　　pref = "&amp;";<br />　　} else {<br />　　pref = "?";<br />　　}<br />　　String header = "&lt;font face='Helvetica' size='-1'&gt;"+HEADER+": ";<br />　　if (offset &gt; 0) {<br />　　header += "&amp;&lt;a href=\""+url+pref+"pager.offset="+(offset-size)+"\"&gt;[&lt;&lt; Prev]&lt;/a&gt;\n";<br />　　}<br />　　int start;<br />　　int radius = MAX_PAGE_INDEX/2*size;<br />　　if (offset &lt; radius) {<br />　　start = 0;<br />　　} else if(offset &lt; length-radius) {<br />　　start = offset - radius;<br />　　} else {<br />　　start = (length/size-MAX_PAGE_INDEX)*size;<br />　　}<br />　　for(int i=start;i&lt;length &amp;&amp; i &lt; start + MAX_PAGE_INDEX*size;i+=size) {<br />　　if (i == offset) {<br />　　header += "&lt;b&gt;"+(i/size+1)+"&lt;/b&gt;\n";<br />　　} else {<br />　　header += "&amp;&lt;a href=\""+url+pref+"pager.offset="+i+"\"&gt;"+(i/size+1)+"&lt;/a&gt;\n";<br />　　}<br />　　}<br />　　if(offset &lt; length - size) {<br />　　header += "&amp;&lt;a href=\""+url+pref+"pager.offset="+((int)offset+(int)size)+"\"&gt;[Next &gt;&gt;]&lt;/a&gt;\n";<br />　　}<br />　　header += "&lt;/font&gt;";<br />　　return header;<br />　　} else {<br />　　return "";<br />　　}<br />　　}<br />　　}<br />　　<br />　　这部分代码的实现相当简洁，但已经足够完成所需了。 <img src ="http://www.blogjava.net/feingto/aggbug/44462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2006-05-03 20:04 <a href="http://www.blogjava.net/feingto/archive/2006/05/03/44462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts中的分页实例</title><link>http://www.blogjava.net/feingto/archive/2006/05/03/44463.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Wed, 03 May 2006 12:04:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2006/05/03/44463.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/44463.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2006/05/03/44463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/44463.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/44463.html</trackback:ping><description><![CDATA[
		<p>struts中的分页实例  <br />   <br />    这仅是一个入门实例，简洁实用，从网上整理而来，供参考。这里仅列出部分文件，其它文件、数据库及目录结构请从本站下载。 <br />一、struts-config.xml配置，主要是配数据库,这里用access。 <br />&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt; </p>
		<p>&lt;!DOCTYPE struts-config PUBLIC <br />          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" <br />          "<a href="http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd</a>"&gt; </p>
		<p>
				<br />&lt;struts-config&gt; <br />&lt;data-sources&gt; <br />   &lt;data-source key="dataSource" type="org.apache.commons.dbcp.BasicDataSource"&gt; <br />            &lt;set-property property="driverClassName" value="sun.jdbc.odbc.JdbcOdbcDriver" /&gt; <br />            &lt;set-property property="url" value="jdbc:odbc:page" /&gt; <br />            &lt;set-property property="username" value="admin" /&gt; <br />            &lt;set-property property="password" value="" /&gt; <br />            &lt;set-property property="maxActive" value="20" /&gt; <br />            &lt;set-property property="maxWait" value="5000" /&gt; <br />            &lt;set-property property="defaultAutoCommit" value="true" /&gt; <br />            &lt;set-property property="defaultReadOnly" value="false" /&gt; <br />            &lt;set-property property="validationQuery" value="SELECT 1" /&gt; <br />            &lt;set-property property="removeAbandoned" value="true" /&gt; <br />            &lt;set-property property="removeAbandonedTimeout" value="120" /&gt;             <br />            &lt;set-property property="encoding" value="false" /&gt;             <br />        &lt;/data-source&gt; </p>
		<p> &lt;/data-sources&gt; <br />  &lt;form-beans&gt; <br />  &lt;/form-beans&gt; <br />  &lt;global-forwards&gt; <br />  &lt;/global-forwards&gt; </p>
		<p>  &lt;action-mappings&gt; <br />  &lt;action path="/page" type="page.DataSourceAction" scope="request"&gt; <br />  &lt;forward name="success" path="/pagetest.jsp"/&gt; <br />  &lt;/action&gt; <br />  &lt;/action-mappings&gt; </p>
		<p>  &lt;controller&gt; <br />  &lt;/controller&gt; <br />&lt;/struts-config&gt; </p>
		<p>二、Action类 <br />用 page.do?start=1 来显示第一个页面  <br />参数说明：  <br />  list：信息列表  <br />  start：开始位置  <br />  page：每页显示的信息数目  <br />  pages: 总页数 <br />  previous：上页开始位置  <br />  next：下页开始位置  </p>
		<p>package page; <br />import org.apache.struts.action.*; <br />import javax.servlet.http.*; </p>
		<p>import java.util.*; <br />import javax.sql.*; <br />import java.sql.*; <br />import bean.*; </p>
		<p>public class DataSourceAction extends Action { </p>
		<p> public DataSourceAction(){} <br />  <br /> public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,<br /> HttpServletResponse response) throws Exception {    <br />  try{ <br />      DataSource ds=this.getDataSource(request,"dataSource");    <br />      Connection con = ds.getConnection(); <br />      Statement stmt = con.createStatement(); <br />      ResultSet resultSet = stmt.executeQuery("select count(*) from book" );  <br />      resultSet.next();  <br />      int data_num=resultSet.getInt(1);  <br />      int start=1; <br />      int page = 4; //每页的记录数。 <br />      int pages=data_num/page; <br />      if(data_num%page!=0) <br />         pages++; <br />      if(request.getParameter("start")!=null) <br />          start = Integer.parseInt(request.getParameter("start"));  <br />      if(request.getParameter("go")!=null){ <br />                int go = Integer.parseInt(request.getParameter("go"));  <br />                if(go&lt;=1) <br />                  start=1; <br />                else if(go&gt;pages) <br />                  start=(pages-1)*page+1; <br />                else  <br />                   start=(go-1)*page+1; <br />       }  <br />      <br />      String sql = "SELECT * FROM book where id&gt;="+start+" and id&lt;"+(start+page); <br />      resultSet = stmt.executeQuery(sql);   <br />      ArrayList list = new java.util.ArrayList();  <br />      while(resultSet.next()) <br />      {   <br />        int id=resultSet.getInt("id"); <br />        String name = resultSet.getString("name"); <br />        String author = resultSet.getString("author"); <br />        String price = resultSet.getString("price"); <br />        System.out.println("开始数据封装：name="+name+"author="+author+"price="+price); <br />        Book book= new Book(id,name,author,price);        <br />        list.add(book); <br />      } <br />    con.close(); <br />    request.setAttribute("pages",new Integer(pages)); <br />    request.setAttribute("list",list); <br />    //request.setAttribute("start", new Integer(start));  <br />    request.setAttribute("page", new Integer(page));  </p>
		<p>        // if there is a previous page, set the previous variable  <br />        int previous = start-page;  <br />        if ( previous&gt;=0 ){  <br />            request.setAttribute("previous", new Integer(previous));  <br />            System.out.println ("previous:" + previous);  <br />        }  </p>
		<p>        // if there is a next page, set the next variable  <br />        int next = start+page;  <br />        if ( next&lt;=data_num ){  <br />            request.setAttribute("next", new Integer(next));  <br />            System.out.println ("next:" + next);  <br />        }  </p>
		<p>   }catch(SQLException e){ <br />          e.printStackTrace(); <br />          System.out.println("数据库连接出现异常"); <br />      }  <br />    <br />             return (mapping.findForward("success")); <br />  }  <br />} </p>
		<p>
				<br />三、bean类Book.java <br />package bean; <br />import java.sql.*; <br />import java.util.ArrayList; <br />public class Book { <br /> int id; <br /> private String bookname; //书名 <br /> private String author;   //作者 <br /> private String price;    //价格 <br />  <br />public Book(int id,String name,String author,String price){ <br /> this.id=id; <br /> this.bookname=name; <br /> this.author=author; <br /> this.price=price; <br />} </p>
		<p>public int getId(){  <br />        return id;  <br />    }  </p>
		<p> public String getAuthor() { <br />  return author; <br /> } </p>
		<p> public void setAuthor(String author) { <br />  this.author = author; <br /> } </p>
		<p> public String getBookname() { <br />  return bookname; <br /> } </p>
		<p> public void setBookname(String bookname) { <br />  this.bookname = bookname; <br /> } <br />  <br /> public String getPrice(){ <br />     return this.price;  <br /> } <br />  <br /> public void setPrice(String price){ <br />     this.price=price;  <br /> } <br />  <br />} <br />四、分页的jsp页面pagetest.jsp,用了jstl中的c标记。 <br />&lt;%@ page contentType="text/html; charset=gb2312" language="java"%&gt; <br />&lt;%@ page import="java.util.*" %&gt; <br />&lt;%@ page import="bean.*" %&gt; <br />&lt;%@ taglib prefix="c" uri="<a href="http://java.sun.com/jstl/core">http://java.sun.com/jstl/core</a>" %&gt; <br />&lt;%@ taglib uri="/tags/struts-bean" prefix="bean" %&gt; <br />&lt;%@ taglib uri="/tags/struts-html" prefix="html" %&gt; <br />&lt;%@ taglib uri="/tags/struts-logic" prefix="logic" %&gt; </p>
		<p>&lt;logic:iterate id="book" name="list" type="bean.Book"&gt;  <br />            &lt;br&gt;&lt;html:link   <br />                    paramId="id" paramName="book" paramProperty="id"  <br />                    page="/messagedetail.do"&gt;  <br />                    &lt;bean:write name="book" property="bookname" /&gt;  <br />                &lt;/html:link&gt;  <br />&lt;/logic:iterate&gt;  </p>
		<p>&lt;form action="/TestPage/page.do"&gt; <br />   &lt;logic:present name="previous"&gt;  <br />            &lt;html:link   <br />                    paramId="start" paramName="previous"  <br />                    page="/page.do"&gt;  <br />                    上一页  <br />                &lt;/html:link&gt;  <br />   &lt;/logic:present&gt;  </p>
		<p>   &lt;logic:present name="next"&gt;  <br />              &lt;html:link   <br />                    paramId="start" paramName="next"  <br />                    page="/page.do"&gt;  <br />                    下一页  <br />                &lt;/html:link&gt;  <br />   &lt;/logic:present&gt;  </p>
		<p>每页&lt;c:out value="${page}"/&gt;条记录,共&lt;c:out value="${pages}"/&gt;页  跳到&lt;input type="text"  name="go" size="3" maxlength="30" &gt; <br />&lt;input type="submit" value="go" &gt; <br />&lt;/form&gt; <br />          </p>
		<p> </p>
		<p>OK!!!! <br />五、测试，请下载本实例的目录结构TestPage,放入tomcat的webapps下，在浏览器中输入： <br />    <a href="http://127.0.0.1:8080/TestPage/page.do">http://127.0.0.1:8080/TestPage/page.do</a>  <br />来源： java学习室<br /> </p>
<img src ="http://www.blogjava.net/feingto/aggbug/44463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2006-05-03 20:04 <a href="http://www.blogjava.net/feingto/archive/2006/05/03/44463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts+Hibernate开发实践 分页的实现</title><link>http://www.blogjava.net/feingto/archive/2006/05/03/44464.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Wed, 03 May 2006 12:04:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2006/05/03/44464.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/44464.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2006/05/03/44464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/44464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/44464.html</trackback:ping><description><![CDATA[
		<p>在进行web应用开发的时候经常要进行分页处理，经常看到一些人在问分页处理的问题，现在我把自己的处理方法写在这儿，希望能对需要进行分页处理的朋友有所帮助。 </p>
		<p>一、在struts中分页有两种结构： <br />    1. 在Action中通过DAO查询出所有的记录，然后加到session或request对象中，传到客户端，由JSP进行分页。这种方法对于在数据量少的时候很方便，也不影响速度。 <br />    2.在Action中每次通过DAO只查询出一页的记录，再传给JSP页面。这种结构对于数据量大的程序很好，但对于数据量小的情况，会增加对服务器的请求，加大服务器的负载。 <br />      <br />二、Hibernate查询 <br />    由于在Hibernate中直接提供了对数据库定点定量的查询方法，所以我采用的是第2种方法。 </p>
		<p>如： <br />从第1万条开始取出100条记录 <br />Query q = session.createQuery("from Cat as c"); <br />q.setFirstResult(10000); <br />q.setMaxResults(100); <br />List l = q.list(); </p>
		<p>三、具体实现 </p>
		<p> 1.Pager类 </p>
		<p>package com.jpcf.db.helper; </p>
		<p>import java.math.*; </p>
		<p>public class Pager { <br />  private int totalRows; //总行数 <br />  private int pageSize = 10; //每页显示的行数 <br />  private int currentPage; //当前页号 <br />  private int totalPages; //总页数 <br />  private int startRow; //当前页在数据库中的起始行 </p>
		<p>  public Pager() { <br />  } </p>
		<p>  public Pager(int _totalRows) { <br />    totalRows = _totalRows; <br />    totalPages=totalRows/pageSize; <br />    int mod=totalRows%pageSize; <br />    if(mod&gt;0){ <br />      totalPages++; <br />    } <br />    currentPage = 1; <br />    startRow = 0; <br />  } </p>
		<p>  public int getStartRow() { <br />    return startRow; <br />  } </p>
		<p>  public int getTotalPages() { <br />    return totalPages; <br />  } </p>
		<p>  public int getCurrentPage() { <br />    return currentPage; <br />  } </p>
		<p>  public int getPageSize() { <br />    return pageSize; <br />  } </p>
		<p>  public void setTotalRows(int totalRows) { <br />    this.totalRows = totalRows; <br />  } </p>
		<p>  public void setStartRow(int startRow) { <br />    this.startRow = startRow; <br />  } </p>
		<p>  public void setTotalPages(int totalPages) { <br />    this.totalPages = totalPages; <br />  } </p>
		<p>  public void setCurrentPage(int currentPage) { <br />    this.currentPage = currentPage; <br />  } </p>
		<p>  public void setPageSize(int pageSize) { <br />    this.pageSize = pageSize; <br />  } </p>
		<p>  public int getTotalRows() { <br />    return totalRows; <br />  } </p>
		<p>  public void first() { <br />    currentPage = 1; <br />    startRow = 0; <br />  } </p>
		<p>  public void previous() { <br />    if (currentPage == 1) { <br />      return; <br />    } <br />    currentPage--; <br />    startRow = (currentPage - 1) * pageSize; <br />  } </p>
		<p>  public void next() { <br />    if (currentPage &lt; totalPages) { <br />      currentPage++; <br />    } <br />    startRow = (currentPage - 1) * pageSize; <br />  } </p>
		<p>  public void last() { <br />    currentPage = totalPages; <br />    startRow = (currentPage - 1) * pageSize; <br />  } </p>
		<p>  public void refresh(int _currentPage) { <br />    currentPage = _currentPage; <br />    if (currentPage &gt; totalPages) { <br />      last(); <br />    } <br />  } </p>
		<p>} </p>
		<p>Pager类用于计算首页、前一页、下一页、尾页的在数据库中的起始行，当前的页码。 </p>
		<p>2.PagerHelp类 </p>
		<p>package com.jpcf.db.helper; </p>
		<p>import javax.servlet.http.*; </p>
		<p>public class PagerHelper { </p>
		<p>  public static Pager getPager(HttpServletRequest httpServletRequest,int totalRows) { </p>
		<p>    //定义pager对象，用于传到页面 <br />    Pager pager = new Pager(totalRows); </p>
		<p>    //从Request对象中获取当前页号 <br />    String currentPage = httpServletRequest.getParameter("currentPage"); </p>
		<p>    //如果当前页号为空，表示为首次查询该页 <br />    //如果不为空，则刷新pager对象，输入当前页号等信息 <br />    if (currentPage != null) { <br />      pager.refresh(Integer.parseInt(currentPage)); <br />    } </p>
		<p>    //获取当前执行的方法，首页，前一页，后一页，尾页。 <br />    String pagerMethod = httpServletRequest.getParameter("pageMethod"); </p>
		<p>    if (pagerMethod != null) { <br />      if (pagerMethod.equals("first")) { <br />        pager.first(); <br />      } else if (pagerMethod.equals("previous")) { <br />        pager.previous(); <br />      } else if (pagerMethod.equals("next")) { <br />        pager.next(); <br />      } else if (pagerMethod.equals("last")) { <br />        pager.last(); <br />      } <br />    } <br />    return pager; <br />  } <br />} </p>
		<p>PageHelper这个类，我不用说应该也知道用来干嘛了 </p>
		<p>3.DAO类 </p>
		<p>package com.jpcf.db.dao; </p>
		<p>import com.jpcf.db.model.*; <br />import com.jpcf.db.helper.HibernateUtil; <br />import net.sf.hibernate.*; <br />import java.util.*; <br />import com.jpcf.db.controller.*; </p>
		<p>public class VehiclePropertyDAO { </p>
		<p>  public Collection findWithPage(int pageSize, int startRow) throws HibernateException { <br />    Collection vehicleList = null; <br />    Transaction tx = null; <br />    try { <br />      Session session = HibernateUtil.currentSession(); <br />      tx = session.beginTransaction(); <br />      Query q = session.createQuery("from VehicleProperty vp"); <br />      q.setFirstResult(startRow); <br />      q.setMaxResults(pageSize); <br />      vehicleList = q.list(); <br />      tx.commit(); <br />    } catch (HibernateException he) { <br />      if (tx != null) { <br />        tx.rollback(); <br />      } <br />      throw he; <br />    } finally { <br />      HibernateUtil.closeSession(); <br />    } <br />    return vehicleList; <br />  } </p>
		<p>  public int getRows(String query) throws HibernateException { <br />    int totalRows = 0; <br />    Transaction tx = null; <br />    try { <br />      Session session = HibernateUtil.currentSession(); <br />      tx = session.beginTransaction(); <br />      totalRows = ((Integer) session.iterate(query).next()).intValue(); <br />      tx.commit(); <br />    } catch (HibernateException he) { <br />      if (tx != null) { <br />        tx.rollback(); <br />      } <br />      throw he; <br />    } finally { <br />      HibernateUtil.closeSession(); <br />    } </p>
		<p>    return totalRows; <br />  } </p>
		<p>} <br />DAO类我就贴这些分页需要的代码了。 <br />“from VehicleProperty vp”也可以用一个参数传进来，有兴趣的自己改一下吧 </p>
		<p>4.Action </p>
		<p>下面是在Action中用到的代码： <br />  public ActionForward execute(ActionMapping actionMapping, <br />                                     ActionForm actionForm, <br />                                     HttpServletRequest httpServletRequest, <br />                                     HttpServletResponse httpServletresponse) { <br />     Collection clInfos = null;//用于输出到页面的记录集合 <br />     int totalRows;//记录总行数 <br />     VehiclePropertyDAO vehicleDAO = new VehiclePropertyDAO(); </p>
		<p>    //取得当前表中的总行数 <br />    try { <br />      totalRows = vehicleDAO.getRows("select count(*) from VehicleProperty"); <br />    } catch (Exception ex) { <br />      servlet.log(ex.toString()); <br />      return actionMapping.findForward(Constants.FAILURE); <br />    } </p>
		<p>    //通过PagerHelper类来获取用于输出到页面的pager对象 <br />    Pager pager=PagerHelper.getPager(httpServletRequest,totalRows); </p>
		<p>    //取出从startRow开始的pageSize行记录 <br />    try { <br />      clInfos = vehicleDAO.findWithPage(pager.getPageSize(), pager.getStartRow()); <br />    } catch (Exception ex) { <br />      servlet.log(ex.toString()); <br />      return actionMapping.findForward(Constants.FAILURE); <br />    } </p>
		<p>    //把输出的记录集和pager对象保存到request对象中 <br />    httpServletRequest.setAttribute("CLINFOS", clInfos); <br />    httpServletRequest.setAttribute("PAGER", pager); </p>
		<p>    return actionMapping.findForward(Constants.SUCCESS); <br />  } </p>
		<p>   查询语句select count(*) from VehicleProperty 也可以换成你需要的任意的条件（select count(*)  </p>
		<p>from VehicleProperty where ..) </p>
		<p>
				<br />5.JSP页面使用 </p>
		<p>下面就是在JSP中的应用了： </p>
		<p>&lt;td colspan="8" align="right" class="head"&gt; <br />   第&lt;bean:write name="PAGER" property="currentPage"/&gt;页  <br />   共&lt;bean:write name="PAGER" property="totalPages"/&gt;页  <br />   &lt;html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;pageMethod=first"  <br />paramName="PAGER" paramProperty="currentPage" paramId="currentPage"&gt;首页&lt;/html:link&gt; <br />   &lt;html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;pageMethod=previous"  <br />paramName="PAGER" paramProperty="currentPage" paramId="currentPage"&gt;上一页&lt;/html:link&gt; <br />   &lt;html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;pageMethod=next"  <br />paramName="PAGER" paramProperty="currentPage" paramId="currentPage"&gt;下一页&lt;/html:link&gt; <br />   &lt;html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;pageMethod=last"  <br />paramName="PAGER" paramProperty="currentPage" paramId="currentPage"&gt;尾页&lt;/html:link&gt; <br />&lt;/td&gt; </p>
		<p>   解释一下这一行:"/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;pageMethod=first <br />method=queryWithPage 是由于我的Action继承的是DispatchAction,需要一个method参数 <br />pageMethod=first 是用来在PageHelper类中判断执行哪个操作 </p>
		<p>四、总结 </p>
		<p>    我做的这个也只是一个借鉴，还有很多没有实现的，比如还可以加一下 go 直接到第n页的功能。 <br />    其实最关键的是把当前页号和要执行的是功能(上一页，下一页)的参数从页面传进来，在Action中就可以根据这两个参数去取下一个页面上要显示的记录集了。 </p>
<img src ="http://www.blogjava.net/feingto/aggbug/44464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2006-05-03 20:04 <a href="http://www.blogjava.net/feingto/archive/2006/05/03/44464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate查询解决方案</title><link>http://www.blogjava.net/feingto/archive/2006/05/03/44460.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Wed, 03 May 2006 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2006/05/03/44460.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/44460.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2006/05/03/44460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/44460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/44460.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第一部分：																						Hibernate																				提供的查询接口或其方法												（此部分不做深究，请参考						hibernate						手册）																				             1														。...&nbsp;&nbsp;<a href='http://www.blogjava.net/feingto/archive/2006/05/03/44460.html'>阅读全文</a><img src ="http://www.blogjava.net/feingto/aggbug/44460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2006-05-03 20:03 <a href="http://www.blogjava.net/feingto/archive/2006/05/03/44460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用struts上传文件</title><link>http://www.blogjava.net/feingto/archive/2006/05/03/44461.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Wed, 03 May 2006 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2006/05/03/44461.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/44461.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2006/05/03/44461.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/44461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/44461.html</trackback:ping><description><![CDATA[
		<p>用到的类import org.apache.struts.upload.FormFile; </p>
		<p>Jsp上传页面： </p>
		<p>  </p>
		<p>&lt;%@ page contentType="text/html; charset=GBK" %&gt; </p>
		<p>&lt;html&gt; </p>
		<p>&lt;head&gt; </p>
		<p>&lt;title&gt; </p>
		<p>strutsUploadForm </p>
		<p>&lt;/title&gt; </p>
		<p>&lt;/head&gt; </p>
		<p>&lt;body bgcolor="#ffffff"&gt; </p>
		<p>&lt;h1&gt; </p>
		<p>上传测试 </p>
		<p>&lt;/h1&gt; </p>
		<p>&lt;form action="uploadTestAction.do" method="post" enctype="multipart/form-data" name="form1"&gt; </p>
		<p>  &lt;p&gt;文本 </p>
		<p>    &lt;input name="theText" type="text" id="theText"&gt; </p>
		<p>&lt;/p&gt; </p>
		<p>  &lt;p&gt;文件 </p>
		<p>    &lt;input name="theFile" type="file" id="theFile"&gt; </p>
		<p>&lt;/p&gt; </p>
		<p>  &lt;p&gt;保存到 </p>
		<p>    &lt;input name="saveTo" type="text" id="saveTo"&gt; </p>
		<p>&lt;/p&gt; </p>
		<p>  &lt;p&gt; </p>
		<p>    &lt;input type="submit" name="Submit" value="提交"&gt; </p>
		<p>&lt;/p&gt; </p>
		<p>&lt;/form&gt; </p>
		<p>&lt;/body&gt; </p>
		<p>&lt;/html&gt; </p>
		<p>  </p>
		<p>  </p>
		<p>actionForm </p>
		<p>  </p>
		<p>package hehe; </p>
		<p>  </p>
		<p>import org.apache.struts.action.*; </p>
		<p>import javax.servlet.http.*; </p>
		<p>import org.apache.struts.upload.FormFile; </p>
		<p>  </p>
		<p>public class UploadTestForm extends ActionForm { </p>
		<p>  private String saveTo; </p>
		<p>  private String theText; </p>
		<p>  private org.apache.struts.upload.FormFile theFile;//文件框对应的是formFile类型 </p>
		<p>  public String getSaveTo() { </p>
		<p>    return saveTo; </p>
		<p>  } </p>
		<p>  public void setSaveTo(String saveTo) { </p>
		<p>    this.saveTo = saveTo; </p>
		<p>  } </p>
		<p>  public org.apache.struts.upload.FormFile getTheFile() { </p>
		<p>    return theFile; </p>
		<p>  } </p>
		<p>  public void setTheFile(org.apache.struts.upload.FormFile theFile) { </p>
		<p>    this.theFile = theFile; </p>
		<p>  } </p>
		<p>  public String getTheText() { </p>
		<p>    return theText; </p>
		<p>  } </p>
		<p>  public void setTheText(String theText) { </p>
		<p>    this.theText = theText; </p>
		<p>  } </p>
		<p>  public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest) { </p>
		<p>    <a>/**@todo</a>: finish this method, this is just the skeleton.*/ </p>
		<p>    if(!this.getTheFile().getContentType().equals("image/pjpeg")){ </p>
		<p>      System.out.println("不是jpg"); </p>
		<p>    }//可以判断类型 </p>
		<p>    if(this.getTheFile().getFileSize()&gt;100){ </p>
		<p>      System.out.println("长度大于1000"); </p>
		<p>    }//可以判断大小 </p>
		<p>    return null; </p>
		<p>  } </p>
		<p>  public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) { </p>
		<p>    saveTo = null; </p>
		<p>    theFile = null; </p>
		<p>    theText = null; </p>
		<p>  } </p>
		<p>} </p>
		<p>  </p>
		<p>  </p>
		<p>Action </p>
		<p>  </p>
		<p>package hehe; </p>
		<p>  </p>
		<p>import org.apache.struts.action.*; </p>
		<p>import org.apache.struts.upload.FormFile; </p>
		<p>import javax.servlet.http.*; </p>
		<p>import java.io.*; </p>
		<p>  </p>
		<p>public class UploadTestAction </p>
		<p>    extends Action { </p>
		<p>  public ActionForward execute(ActionMapping actionMapping, </p>
		<p>                               ActionForm actionForm, </p>
		<p>                               HttpServletRequest request, </p>
		<p>                               HttpServletResponse response) { </p>
		<p>    UploadTestForm uploadForm = (UploadTestForm) actionForm; </p>
		<p>    FormFile file = uploadForm.getTheFile(); </p>
		<p>    String path = uploadForm.getSaveTo(); </p>
		<p>    String theText = uploadForm.getTheText(); </p>
		<p>    try { </p>
		<p>      InputStream input = file.getInputStream();//能从FormFile中获得输入流 </p>
		<p>      OutputStream output = new FileOutputStream(path); </p>
		<p>      int bytesReader = 0; </p>
		<p>      byte[] readbuffer = new byte[8192]; </p>
		<p>      while ( (bytesReader = input.read(readbuffer, 0, 8192)) != -1) { </p>
		<p>        output.write(readbuffer, 0, bytesReader); </p>
		<p>      } </p>
		<p>      output.close(); </p>
		<p>    } </p>
		<p>    catch (Exception e) { </p>
		<p>      e.printStackTrace(); </p>
		<p>    } </p>
		<p>    request.setAttribute("theText", theText); </p>
		<p>    request.setAttribute("fileName", file.getFileName());//上传的文件名 </p>
		<p>    request.setAttribute("fileSize", new Integer(file.getFileSize()));//文件大小 </p>
		<p>    request.setAttribute("fileType", file.getContentType());//文件类型 </p>
		<p>    return actionMapping.findForward("success"); </p>
		<p>  } </p>
		<p>} </p>
		<p>  </p>
		<p>  </p>
		<p>结果页面 </p>
		<p>  </p>
		<p>&lt;%@ page contentType="text/html; charset=GBK" %&gt; </p>
		<p>&lt;html&gt; </p>
		<p>&lt;head&gt; </p>
		<p>&lt;title&gt; </p>
		<p>strutsUploadResult </p>
		<p>&lt;/title&gt; </p>
		<p>&lt;/head&gt; </p>
		<p>&lt;body bgcolor="#ffffff"&gt; </p>
		<p>&lt;h1&gt; </p>
		<p>上传结果 </p>
		<p>&lt;/h1&gt; </p>
		<p>文件名：&lt;%=request.getAttribute("fileName")%&gt;&lt;br /&gt; </p>
		<p>文本：&lt;%=request.getAttribute("theText")%&gt;&lt;br /&gt; </p>
		<p>文件类型：&lt;%=request.getAttribute("fileType")%&gt;&lt;br /&gt; </p>
		<p>文件大小：&lt;%=request.getAttribute("fileSize")%&gt;&lt;br /&gt; </p>
		<p>&lt;/body&gt; </p>
		<p>&lt;/html&gt; <br /></p>
<img src ="http://www.blogjava.net/feingto/aggbug/44461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2006-05-03 20:03 <a href="http://www.blogjava.net/feingto/archive/2006/05/03/44461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts错误和信息的处理</title><link>http://www.blogjava.net/feingto/archive/2006/05/03/44458.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Wed, 03 May 2006 12:02:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2006/05/03/44458.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/44458.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2006/05/03/44458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/44458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/44458.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">1.</span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">错误和信息的处理</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">. </span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<br />
						<br />
				</span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">首先在资源文件中定义错误信息和普通信息</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">.</span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">如</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">:MessageResources.properties</span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中定义如下</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">: </span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<div align="center">
				<table class="MsoNormalTable" style="WIDTH: 90%; mso-cellspacing: .7pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="1" cellpadding="0" width="90%" border="0">
						<tbody>
								<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
										<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
												<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: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">java</span>
														</b>
														<b>
																<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">代码</span>
														</b>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">: </span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
																<o:p>
																</o:p>
														</span>
												</p>
										</td>
								</tr>
								<tr style="mso-yfti-irow: 1; mso-yfti-lastrow: yes">
										<td style="BORDER-RIGHT: #d1d7dc 1pt solid; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d1d7dc 1pt solid; PADDING-LEFT: 2.25pt; BACKGROUND: #fafafa; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d1d7dc 1pt solid; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d1d7dc 1pt solid; mso-border-alt: solid #D1D7DC .75pt">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
																<br />
																<br /># <br /># Resources </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">for</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> testing &lt;html:errors&gt; tag. <br /># <br /><br />errors.header=&lt;table&gt; <br />errors.footer=&lt;/table&gt; <br />errors.prefix=&lt;tr&gt;&lt;td&gt; <br />errors.suffix=&lt;/td&gt;&lt;/tr&gt; <br /><br />property1error1=Property 1, </span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #aaaadd; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">Error</span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> 1 <br />property2error1=Property 2, </span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #aaaadd; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">Error</span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> 1 <br />property2error2=Property 2, </span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #aaaadd; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">Error</span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> 2 <br />property2error3=Property 2, </span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #aaaadd; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">Error</span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> 3 <br />property3error1=Property 3, </span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #aaaadd; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">Error</span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> 1 <br />property3error2=Property 3, </span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #aaaadd; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">Error</span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> 2 <br />globalError=Global </span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #aaaadd; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">Error</span>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
																<br />
																<br /># <br /># Resources </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">for</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> testing &lt;html:messages&gt; tag. <br /># <br /><br />messages.header=&lt;table&gt; <br />messages.footer=&lt;/table&gt; <br /><br />property1message1=Property 1, Message 1 <br />property2message1=Property 2, Message 1 <br />property2message2=Property 2, Message 2 <br />property2message3=Property 2, Message 3 <br />property3message1=Property 3, Message 1 <br />property3message2=Property 3, Message 2 <br />globalMessage=Global Message <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: 9pt; COLOR: black; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
																<o:p> </o:p>
														</span>
												</p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 12pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<br />
						<br />
				</span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">在程序中定义错误和信息类</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">,</span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">这个例子写在</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">JSP</span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中</span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
				</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<div align="center">
				<table class="MsoNormalTable" style="WIDTH: 90%; mso-cellspacing: .7pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="1" cellpadding="0" width="90%" border="0">
						<tbody>
								<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
										<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
												<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: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">java</span>
														</b>
														<b>
																<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">代码</span>
														</b>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">: </span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
																<o:p>
																</o:p>
														</span>
												</p>
										</td>
								</tr>
								<tr style="mso-yfti-irow: 1; mso-yfti-lastrow: yes">
										<td style="BORDER-RIGHT: #d1d7dc 1pt solid; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d1d7dc 1pt solid; PADDING-LEFT: 2.25pt; BACKGROUND: #fafafa; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d1d7dc 1pt solid; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d1d7dc 1pt solid; mso-border-alt: solid #D1D7DC .75pt">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
																<br />
																<br />&lt;% <br />      ActionErrors errors = </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionErrors(); <br />      errors.add("property1", </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionError("property1error1")); <br />      errors.add("property2", </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionError("property2error1")); <br />      errors.add("property2", </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionError("property2error2")); <br />      errors.add("property2", </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionError("property2error3")); <br />      errors.add("property3", </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionError("property3error1")); <br />      errors.add("property3", </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionError("property3error2")); <br />      errors.add(ActionErrors.GLOBAL_ERROR, </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionError("globalError")); <br />      request.setAttribute(Globals.ERROR_KEY, errors); <br /><br />      ActionMessages messages = </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionMessages(); <br />      messages.add("property1", </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionMessage("property1message1")); <br />      messages.add("property2", </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionMessage("property2message1")); <br />      messages.add("property2", </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionMessage("property2message2")); <br />      messages.add("property2", </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionMessage("property2message3")); <br />      messages.add("property3", </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionMessage("property3message1")); <br />      messages.add("property3", </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionMessage("property3message2")); <br />      messages.add(ActionMessages.GLOBAL_MESSAGE, </span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionMessage("globalMessage")); <br />      request.setAttribute(Globals.MESSAGE_KEY, messages); <br />    %&gt; <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: 9pt; COLOR: black; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
																<o:p> </o:p>
														</span>
												</p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<br />
						<br />
						<br />
						<br />
				</span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">显示错误</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">: </span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<div align="center">
				<table class="MsoNormalTable" style="WIDTH: 90%; mso-cellspacing: .7pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="1" cellpadding="0" width="90%" border="0">
						<tbody>
								<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
										<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
												<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: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">java</span>
														</b>
														<b>
																<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">代码</span>
														</b>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">: </span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
																<o:p>
																</o:p>
														</span>
												</p>
										</td>
								</tr>
								<tr style="mso-yfti-irow: 1; mso-yfti-lastrow: yes">
										<td style="BORDER-RIGHT: #d1d7dc 1pt solid; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d1d7dc 1pt solid; PADDING-LEFT: 2.25pt; BACKGROUND: #fafafa; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d1d7dc 1pt solid; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d1d7dc 1pt solid; mso-border-alt: solid #D1D7DC .75pt">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
																<br />
																<br />&lt;html:errors property="property1" /&gt; <br />&lt;html:errors property="property2" /&gt; <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: 9pt; COLOR: black; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
																<o:p> </o:p>
														</span>
												</p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<br />
				</span>
				<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">显示信息</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">: </span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<div align="center">
				<table class="MsoNormalTable" style="WIDTH: 90%; mso-cellspacing: .7pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="1" cellpadding="0" width="90%" border="0">
						<tbody>
								<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
										<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
												<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: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">java</span>
														</b>
														<b>
																<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">代码</span>
														</b>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">: </span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
																<o:p>
																</o:p>
														</span>
												</p>
										</td>
								</tr>
								<tr style="mso-yfti-irow: 1; mso-yfti-lastrow: yes">
										<td style="BORDER-RIGHT: #d1d7dc 1pt solid; PADDING-RIGHT: 2.25pt; BORDER-TOP: #d1d7dc 1pt solid; PADDING-LEFT: 2.25pt; BACKGROUND: #fafafa; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: #d1d7dc 1pt solid; PADDING-TOP: 2.25pt; BORDER-BOTTOM: #d1d7dc 1pt solid; mso-border-alt: solid #D1D7DC .75pt">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
																<br />
																<br />&lt;html:messages property="property1" message="</span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">true</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">" id="msg" header="messages.header" footer="messages.footer"&gt; <br />            &lt;tr&gt; <br />              &lt;td&gt; <br />                     &lt;%= pageContext.getAttribute("msg") %&gt; <br />              &lt;/td&gt; <br />            &lt;/tr&gt; <br />          &lt;/html:messages&gt; <br /><br />&lt;html:messages message="</span>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990066; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">true</span>
														</b>
														<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">" id="msg" header="messages.header" footer="messages.footer"&gt; <br />            &lt;tr&gt; <br />              &lt;td&gt; <br />               &lt;%= pageContext.getAttribute("msg") %&gt; <br />              &lt;/td&gt; <br />            &lt;/tr&gt; <br />&lt;/html:messages&gt; <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: 9pt; COLOR: black; FONT-FAMILY: Courier; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
																<o:p> </o:p>
														</span>
												</p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/feingto/aggbug/44458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2006-05-03 20:02 <a href="http://www.blogjava.net/feingto/archive/2006/05/03/44458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts在URI后面传参数的问题</title><link>http://www.blogjava.net/feingto/archive/2006/05/03/44459.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Wed, 03 May 2006 12:02:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2006/05/03/44459.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/44459.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2006/05/03/44459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/44459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/44459.html</trackback:ping><description><![CDATA[
		<p>在struts标签&lt;html:link&gt;的page属性指定的URI后面传递参数可以有几种方式： <br />1.若明确参数名和参数值则直接在URI后输出，<br />如：&lt;html:link page="/test.do?action=add"&gt;add&lt;/html:link&gt;</p>
		<p>2.对于参数值不确定的，paramName和paramProperty来输出，用paramId属性指定参数名。<br />对于paramName指定的对象应该存在于page、request、session、application其中之一。一般来说，是从Action类传过来的，作为request的属性之一（requst.setAttribute("name",object)）。<br />如果paramName指定的对象是action的ActionForm，则无需使用request.setAttribute方法。<br />例：&lt;html:link page="/test.do" paramId="userid" paramName="uid"&gt;uname&lt;/html:link&gt;<br />若参数值是一个bean对象的属性值（比如ActionForm,或者集合中存放的对象）则：<br />&lt;html:link page="/test.do" paramId="userid" paramName="user" paramProperty="uid"&gt;uname&lt;/html:link&gt;</p>
		<p>3.若两个参数，一个确定一个不确定，则是以上两种方法的结合，即：<br />&lt;html:link page="/test.do?action=modify" paramId="userid" paramName="uid"&gt;modify&lt;/html:link&gt;</p>
		<p>4.对于多个参数的问题，可以使用一个HashMap集合对象来存放所有的参数名及对应的参数值的方式，paramName属性值指定为该HashMap集合对象即可。<br />举例：<br />&lt;%<br />//代码理想的位置应该是在action中<br />//可以在jsp页面测试<br />  java.util.HashMap pms = new java.util.HashMap();<br />  pms.put("code", "001002");<br />  pms.put("name", "tester");<br />  pms.put("alias", new String[]{"matin","jack"});<br />  request.setAttribute("params", pms);<br />%&gt;<br />&lt;html:link action="/test.do" name="params" &gt;test&lt;/html:link&gt;<br />编译后的结果：&lt;a href="/test.do?code=001002&amp;name=tester&amp;alias=matin&amp;alias=jack"&gt;test&lt;/a&gt;<br />这种方式虽然可以解决传多参数的问题，但是实现起来也比较麻烦，特别是对记录集中的数据逐条列出的时候</p>
		<p>5.针对有的网友在&lt;html:link&gt;标签中嵌入使用jsp脚本(scriptlet)的问题，<br />例如:<br />&lt;html:link page="/test.do?code=&lt;%=varible%&gt;"&gt;add&lt;/html:link&gt;，这种写法是错误的，是无法编译的。<br />有的网友认为在struts标签内是不允许使用jsp脚本的，这种说法也不准确。如果前面的写法改成:<br />&lt;html:link page="&lt;%="/test.do?code="+varible%&gt;"&gt;add&lt;/html:link&gt;，就可以被执行，但是要注意URL相对路径的问题。</p>
		<p>虽然在struts标签中嵌入jsp脚本不是真正意义上的struts应用，但是有时在委曲求全的情况下也只能如此了，除非使用自定义标签。比如在form表单中可能需要根据具体数据让某个字段是只读的，就可以用嵌入jsp脚本来实现：<br />&lt;%<br />boolean rdonly=false;<br />if(2==2) rdonly=true;<br />%&gt;<br />&lt;html:text property="userid" readonly="&lt;%=rdonly%&gt;" /&gt; </p>
		<p>
				<br />6.另外一种比较变态的方法，既不是真正意义上的struts，也不符合xml规范。那就是在&lt;a&gt;标签中用&lt;bean:write&gt;标签输出参数值。<br />如：&lt;a href="test.do?uid=&lt;bean:write name="user" property="userid"/&gt;&amp;name=&lt;bean:write name="user" property="username"/&gt;"&gt;test&lt;/a&gt;</p>
<img src ="http://www.blogjava.net/feingto/aggbug/44459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2006-05-03 20:02 <a href="http://www.blogjava.net/feingto/archive/2006/05/03/44459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>