﻿<?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-风人园-文章分类-Web</title><link>http://www.blogjava.net/wuxufeng8080/category/12327.html</link><description>弱水三千，只取一瓢，便能解渴；佛法无边，奉行一法，便能得益。</description><language>zh-cn</language><lastBuildDate>Sat, 05 Sep 2009 02:40:28 GMT</lastBuildDate><pubDate>Sat, 05 Sep 2009 02:40:28 GMT</pubDate><ttl>60</ttl><item><title>HTML特殊字符编码对照表</title><link>http://www.blogjava.net/wuxufeng8080/articles/293901.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 04 Sep 2009 08:47:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/293901.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/293901.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/293901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/293901.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/293901.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;                                    字母编码                                    数字编码                                    效果                                    说明        ...&nbsp;&nbsp;<a href='http://www.blogjava.net/wuxufeng8080/articles/293901.html'>阅读全文</a><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/293901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2009-09-04 16:47 <a href="http://www.blogjava.net/wuxufeng8080/articles/293901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IE中HTML打印时实现每页都有的表头和打印分页</title><link>http://www.blogjava.net/wuxufeng8080/articles/185746.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 12 Mar 2008 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/185746.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/185746.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/185746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/185746.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/185746.html</trackback:ping><description><![CDATA[<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />
&lt;title&gt;无标题文档&lt;/title&gt;<br />
&lt;style&gt;<br />
@media print{<br />
INPUT {display:none}<br />
}<br />
&lt;/style&gt;<br />
&lt;/head&gt;</p>
<p>&lt;body&gt;</p>
<p>&lt;TABLE border="0" style="font-size:9pt;" width="300px" align="center"&gt;<br />
&lt;THEAD style="display:table-header-group;font-weight:bold"&gt;<br />
&lt;TR&gt;&lt;TD colspan="2" align="center" style="font-weight:bold;border:3px double red"&gt;每页都有的表头&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;/THEAD&gt;<br />
&lt;TBODY style="text-align:center""&gt;<br />
&lt;TR&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;TR&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;TR&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;TR&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;TR&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;TR&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;TR style="page-break-after:always;"&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;TR&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;TR&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;TR&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;TR&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;TR&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;TR&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;TR style="page-break-after:always;"&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;TD&gt;表格内容&lt;/TD&gt;&lt;/TR&gt;<br />
&lt;/TBODY&gt;<br />
&lt;TFOOT style="display:table-footer-group;font-weight:bold"&gt;<br />
&lt;TR&gt;<br />
&lt;TD colspan="2" align="center" style="font-weight:bold;border:3px double blue"&gt;每页都有的表尾&lt;/TD&gt;<br />
&lt;/TR&gt;<br />
&lt;/TFOOT&gt;<br />
&lt;/TABLE&gt;<br />
&lt;input type=button value=" 打 印 " onclick=javascript:window.print()&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
重点是里面的css设定<br />
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/185746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2008-03-12 16:58 <a href="http://www.blogjava.net/wuxufeng8080/articles/185746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件下载中文乱码问题</title><link>http://www.blogjava.net/wuxufeng8080/articles/172474.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Thu, 03 Jan 2008 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/172474.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/172474.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/172474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/172474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/172474.html</trackback:ping><description><![CDATA[在修改系统bug的时候发现文件上传共享模块中文件下载会遇到中文文件名乱码的问题，google上搜了一下，找到了些文章，暂且转载收藏于此，至于文章的原作者，可能是本身转载过多，已无从考证，在此也表感激之情，谢谢。<br />
<br />
<br />
问题如下：客户的论坛系统里中文文件名的附件无法下载。我同事们用他们的IE6去测试，确实无法下载，待我连到客户的系统，发现附件的文件名相当长，差不多30个字。但我的IE却可以下载，只不过文件名头部被截断了。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;关于中文文件下载的问题，网上的咨询和答疑已经很多，我原来处理下载的代码如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 下载的程序里有了这句，一般在IE6的下载提示框上将正确显示文件的名字，无论是简体中文，还是日文。不过当时确实没有仔细测试文件名很长的中文文件名。 先如今经过仔细测试，发现文字只要超过17个字，就不能下载了。经过好一番google和反复测试，总算对这个问题有了系统的认识，分列如下：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>一</strong>. 通过我原来的方式，也就是先用URLEncoder编码，当中文文字超过17个时，IE6 无法下载文件。这是IE的bug，参见微软的知识库文章 <a href="http://support.microsoft.com/default.aspx?kbid=816868">KB816868 </a>。原因可能是因为ie在处理 Response Header 的时候，对header的长度限制在150字节左右。而一个汉字编码成UTF-8是9个字节，那么17个字便是153个字节，所以便会报错。微软提供了一个补丁，可以从 <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=f687aa7f-e6da-4990-a63a-a162822a5c0e&amp;DisplayLang=en">这里</a> 下载。这个补丁需要先安装ie6 sp1。因为我平时勤打补丁，我的IE6版本号是 6.0.2800.1106.xpsp2_xxxxx。所以我可能已经安装过了补丁，从而可以下载，但仍然出现文件名被截断的现象。微软让我们等待IE下 一个service pack的发布。我今天也上网看到了好消息，迫于firefox的压力，IE7可能在年中发布。另外，Firefox 不支持这样的方式，将把编码后的%xx%xx直接作为文件名显示。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>二</strong>. 我尝试使用 javamail 的MimeUtility.encode()方法来编码文件名，也就是编码成 =?gb2312?B?xxxxxxxx?= 这样的形式，并从 <a href="http://www.faqs.org/rfcs/rfc1522.html">RFC1522</a> 中找到对应的标准支持。不过很遗憾，IE6并不支持这一个标准。我试了一下，Firefox是支持的。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>三</strong>. 按网上很多人提供的解决方案：将文件名编码成ISO8859-1似乎是有效的解决方案，代码如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader( "Content-Disposition", "attachment;filename="&nbsp; + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) );<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;在确保附件文件名都是简 体中文字的情况下，那么这个办法确实是最有效的，不用让客户逐个的升级IE。如果台湾同胞用，把gb2312改成big5就行。但现在的系统通常都加入了 国际化的支持，普遍使用UTF-8。如果文件名中又有简体中文字，又有繁体中文，还有日文。那么乱码便产生了。另外，在我的电脑上Firefox (v1.0-en)下载也是乱码。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;折中考虑，我结合了一、三的方式，代码片断如下：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName = URLEncoder.encode(atta.getFileName(), "UTF-8");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * see <a href="http://support.microsoft.com/default.aspx?kbid=816868">http://support.microsoft.com/default.aspx?kbid=816868</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fileName.length() &gt; 150) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String guessCharset =&nbsp;xxxx /*根据request的locale&nbsp;得出可能的编码，中文操作系统通常是gb2312*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileName = new String(atta.getFileName().getBytes(guessCharset), "ISO8859-1"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader("Content-Disposition", "attachment; filename=" + fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;暂且不考虑 Firefox&nbsp;是因为它目前似乎还没有有力侵食到IE的企业用户市场。影响客户买单的常常是进度，而不是兼容度。 
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/172474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2008-01-03 14:21 <a href="http://www.blogjava.net/wuxufeng8080/articles/172474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FckEdit使用方法(ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/163139.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Mon, 26 Nov 2007 05:08:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/163139.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/163139.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/163139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/163139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/163139.html</trackback:ping><description><![CDATA[<li>先down一个FckEdit源文件压缩包.
<li>将其解压缩到你的网站目录的文件夹下.我使用的是tomcat,则解压到webapps/的某个文件夹下,特别要注意的是解压完了要看一下你解压的包中的那个fckeditor.js在什么位置.
<li>在网页中创建一个textarea,一定要命名其id.
<li>应用Fckeditor.<br />
<script language="javascript" src="../../../koncer/" type="text/javascript"><font color="#ff0000">="<font color="#ff0000">你的fckeditor.js所在的位置</font>/</font>fckeditor.js"></script>&lt;script language="javascript" type="text/javascript" src<font color="#ff0000">="<font color="#ff0000">你的fckeditor.js所在的位置</font>/</font>fckeditor.js"&gt;&lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;script language="javascript" type="text/javascript"&gt;<br />
&nbsp;&nbsp;&nbsp;window.onload = function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;var oEditor = new FCKeditor('<font color="#ff0000" size="2">你命名的Textarea的Id'</font>,'700px','300px') ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;oEditor.BasePath= '<font color="#ff0000">FCKeditor所处的相对站点的路径</font>/FCKeditor/' ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;oEditor.ToolbarSet="<font color="#ff0000">设置工具栏</font>";//<font color="#ff0000">可选的参数可以在<font color="#000000">fckeditor.js位置相同的文件夹中</font>的<font color="#000000">fckconfig.js中</font>找到也可以设置自己需要的Toolbar</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;oEditor.ReplaceTextarea() ;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;function copyIt(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;var oEditor = FCKeditorAPI.GetInstance('<font size="3"><font size="2"><font color="#ff0000">你命名的Textarea的Id</font>'</font></font>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;oEditor.UpdateLinkedField();<br />
&nbsp;&nbsp;&nbsp;&nbsp;window.clipboardData.setData("Text", document.getElementById("<font color="#ff0000">你命名的Textarea的Id</font>").innerHTML);<br />
<script language="javascript" type="text/javascript"><br />   window.onload = function() {<br />    var oEditor = new FCKeditor('<font color="#ff0000" size="2">你命名的Textarea的Id'</font>,'700px','300px') ;<br />    oEditor.BasePath= '/tm/FCKeditor/' ;<br />    oEditor.ToolbarSet="<font color="#ff0000">设置工具栏</font>";//<font color="#ff0000">可选的参数可以在<font color="#000000">fckeditor.js位置相同的文件夹中</font>的<font color="#000000">fckconfig.js中</font>找到也可以设置自己需要的Toolbar</font><br />    oEditor.ReplaceTextarea() ;<br />   }<br />   function copyIt(){<br />    var oEditor = FCKeditorAPI.GetInstance('<font size="3"><font size="2"><font color="#ff0000">你命名的Textarea的Id</font>'</font></font>);<br />    oEditor.UpdateLinkedField();<br />    window.clipboardData.setData("Text", document.getElementById("<font color="#ff0000">你命名的Textarea的Id</font>").innerHTML);<br />   }  </script><script language="javascript" src="../../../koncer/" type="text/javascript"><font color="#ff0000">="<font color="#ff0000">你的fckeditor.js所在的位置</font>/</font>fckeditor.js"></script>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&lt;/script&gt; </li>
 <img src ="http://www.blogjava.net/wuxufeng8080/aggbug/163139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-11-26 13:08 <a href="http://www.blogjava.net/wuxufeng8080/articles/163139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几个不太常用但很有用的HTML Tag(ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/162209.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 21 Nov 2007 13:03:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/162209.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/162209.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/162209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/162209.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/162209.html</trackback:ping><description><![CDATA[虽然经常接触HTML，不过有些标签以前却从没引起我的注意。但是其中几个Tag的确比较有用，而且是符合W3C XHTML标准的。<br />
<br />
1. Label<br />
<br />
Label是用来标记Input元素的提示的。例如：<br />
<br />
&lt;label for="id_name"&gt;Name&lt;/label&gt;&lt;br /&gt;<br />
&lt;input type="text" name="name" id="id_name" size="20"/&gt;<br />
<br />
<br />
Label的&#8220;For&#8221;属性要和Input元素的ID相一致。<br />
<br />
好处：点击提示文字，就自动Focus对应的输入元素。对于Radio，Checkbox这类点击区域特别小的控件特别有用：<br />
Color:&lt;br /&gt;<br />
&lt;input type="checkbox"&nbsp; name="color" id="color_r" value="red"&gt;&lt;label for="color_r"&gt;&amp;nbsp;red&lt;/label&gt;&lt;br&gt;<br />
&lt;input type="checkbox"&nbsp; name="color" id="color_g" value="green"&gt;&lt;label for="color_g"&gt;&amp;nbsp;green&lt;/label&gt;&lt;br&gt;<br />
&lt;input type="checkbox"&nbsp; name="color" id="color_b" value="blue"&gt;&lt;label for="color_x"&gt;&amp;nbsp;blue&lt;/label&gt;&lt;br&gt;&lt;!--如果For和ID不匹配，点击文字是没有用的--&gt;<br />
<br />
&nbsp;red<br />
&nbsp;green<br />
&nbsp;blue<br />
&nbsp;<br />
<br />
2. FieldSet &amp; Legend<br />
<br />
FieldSet用来明确把一组Input控件归成一组（相当于VB/VC里面的Group控件），而Legend则是组的标题(相当于Group控件的标题)。 例如：<br />
<br />
&lt;fieldset style="width:20%"&gt;<br />
&nbsp; &lt;legend&gt;Person&lt;/legend&gt;<br />
&nbsp; &lt;label for="name"&gt;Name&lt;/label&gt;&lt;input type="text" id="name" /&gt;<br />
&nbsp; &lt;fieldset&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;legend&gt;Gender&lt;/legend&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;input type="radio" name="gender" id="male" /&gt;&lt;label for="male"&gt;Male&lt;/label&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;input type="radio" name="gender" id="female" /&gt;&lt;label for="female"&gt;Female&lt;/label&gt;<br />
&nbsp; &lt;/fieldset&gt;<br />
&lt;/fieldset&gt;<br />
PersonName GenderMale<br />
Female<br />
<br />
3. Optgroup<br />
<br />
用于Select里面的option的分组。例如：<br />
<br />
&lt;select name="age"&gt;<br />
&nbsp; &lt;optgroup label="baby"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option&gt;0-2&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option&gt;3-5&lt;/option&gt;<br />
&nbsp; &lt;/optgroup&gt;<br />
&nbsp; &lt;optgroup label="kid"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option&gt;6-10&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option&gt;10-15&lt;/option&gt;<br />
&nbsp; &lt;/optgroup&gt;<br />
&nbsp; &lt;optgroup label="adult"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option&gt;16-30&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option&gt;31-40&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option&gt;41-60&lt;/option&gt;<br />
&nbsp; &lt;/optgroup&gt;<br />
&lt;/select&gt;<br />
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/162209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-11-21 21:03 <a href="http://www.blogjava.net/wuxufeng8080/articles/162209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何指定tomcat中session过期时间</title><link>http://www.blogjava.net/wuxufeng8080/articles/145062.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 14 Sep 2007 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/145062.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/145062.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/145062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/145062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/145062.html</trackback:ping><description><![CDATA[<script src="http://blog.csdn.net/count.aspx?ID=1679642&amp;Type=Rank"></script>
<div class="postText">1. 在server.xml中定义context时采用如下定义： <br />
<br />
&lt;Context path="/livsorder" docBase="/home/httpd/html/livsorder"&nbsp;&nbsp;&nbsp; <br />
　　defaultSessionTimeOut="3600" isWARExpanded="true"&nbsp;&nbsp;&nbsp; <br />
　　isWARValidated="false" isInvokerEnabled="true"&nbsp;&nbsp;&nbsp; <br />
　　isWorkDirPersistent="false"/&gt;<br />
<br />
2. 在web.xml中通过参数指定： <br />
<br />
&lt;session-config&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;session-timeout&gt;30&lt;/session-timeout&gt;&nbsp;&nbsp;&nbsp; <br />
&lt;/session-config&gt;<br />
<br />
其中30表示30分钟<br />
<br />
3. 在程序中通过servlet api直接修改<br />
HttpSession ses = request.getSession();<br />
ses.setMaxInactiveInterval(10);<br />
设置单位为秒，设置为-1永不过期。&nbsp;</div>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/145062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-09-14 10:26 <a href="http://www.blogjava.net/wuxufeng8080/articles/145062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat启动时自动加载servlet </title><link>http://www.blogjava.net/wuxufeng8080/articles/144973.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Thu, 13 Sep 2007 13:21:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/144973.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/144973.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/144973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/144973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/144973.html</trackback:ping><description><![CDATA[<div class="postbody">比如我要启动时加载的servlet叫WebServiceStarter<br />
<br />
在web.xml中增加<br />
&lt;servlet&gt;<br />
&nbsp;&nbsp; &lt;servlet-name&gt;WebServiceStarter&lt;/servlet-name&gt;<br />
&nbsp;&nbsp; &lt;servlet-class&gt;WebServiceStarter&lt;/servlet-class&gt;<br />
&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;<br />
即可 </div>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/144973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-09-13 21:21 <a href="http://www.blogjava.net/wuxufeng8080/articles/144973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>按IE后退按钮时让JSP不读缓存(Zt)</title><link>http://www.blogjava.net/wuxufeng8080/articles/123617.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Tue, 12 Jun 2007 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/123617.html</guid><description><![CDATA[1,&nbsp;使用java提供的方法，在jsp或者servlet中都可以&nbsp;<br>&lt;%&nbsp;<br>response.setHeader("Pragma","No-cache");&nbsp;<br>response.setHeader("Cache-Control","no-cache");&nbsp;<br>response.setDateHeader("Expires",&nbsp;0);&nbsp;<br>%&gt;&nbsp;<br>2,&nbsp;使用HTML标记，如下面：&nbsp;<br>&lt;HEAD&gt;&nbsp;<br>&lt;META&nbsp;HTTP-EQUIV="Pragma"&nbsp;CONTENT="no-cache"&gt;&nbsp;<br>&lt;META&nbsp;HTTP-EQUIV="Cache-Control"&nbsp;CONTENT="no-cache"&gt;&nbsp;<br>&lt;META&nbsp;HTTP-EQUIV="Expires"&nbsp;CONTENT="0"&gt;&nbsp;<br>&lt;/HEAD&gt;<br>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/123617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-06-12 15:17 <a href="http://www.blogjava.net/wuxufeng8080/articles/123617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSTL--foreach 迭代Map对象(ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/98285.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Tue, 06 Feb 2007 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/98285.html</guid><description><![CDATA[
		<p>
				<br />以前都用forEach标签迭代List，Set对象，今天需要用它来迭代Map对象，就研究了一下。</p>
		<p>以下是试验代码：</p>
		<p>&lt;%@ page contentType="text/html; charset=gb2312" language="java" import="java.util.*" %&gt;<br />&lt;%@ taglib prefix="c" uri="<a href="http://java.sun.com/jsp/jstl/core">http://java.sun.com/jsp/jstl/core</a>" %&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;title&gt;无标题文档&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;%!<br /> public static class TTT{<br />  private String name;<br />  public TTT(String name){<br />   this.name = name;<br />  }<br />  public String getName(){<br />   return name;<br />  }<br /> }<br />%&gt;<br />&lt;%<br /> Map map = new LinkedHashMap();<br /> map.put(new TTT("111"),"aaaaaa");<br /> map.put(new TTT("222"),"bbbbbb");<br /> request.setAttribute("map",map);<br />%&gt;<br />&lt;body&gt;<br />&lt;c:forEach items="${map}" var="item"&gt;<br />${item.key.name}-${item.value}&lt;br/&gt;<br />&lt;/c:forEach&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</p>
		<p>item内保存的是java.util.Map.Entry对象这个对象有getKey,setKey,getValue,setValue方法，这样就可以在forEach内部使用map的key和value了。</p>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/98285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-02-06 13:54 <a href="http://www.blogjava.net/wuxufeng8080/articles/98285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP文件下载及getOutputStream() has already been的解决（ZT）</title><link>http://www.blogjava.net/wuxufeng8080/articles/92172.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Sat, 06 Jan 2007 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/92172.html</guid><description><![CDATA[
		<h2 class="diaryTitle">JSP文件下载及getOutputStream() has already been的解决- -</h2>
		<p>                                       
</p>
		<p>
		</p>
		<div onload="this.style.overflowX='auto';">JSP文件下载及出现getOutputStream() has already been called for this response的解决方法<br /><br /><a href="http://iamin.blogdriver.com/iamin/1072546.html">http://iamin.blogdriver.com/iamin/1072546.html</a></div>
		<div onload="this.style.overflowX='auto';">
				<br />一、采用RequestDispatcher的方式进行<br /><br />1、web.xml文件中增加<br />  &lt;mime-mapping&gt;<br />    &lt;extension&gt;doc&lt;/extension&gt;<br />    &lt;mime-type&gt;application/vnd.ms-word&lt;/mime-type&gt;<br />  &lt;/mime-mapping&gt;<br /><br /><br />2、程序如下：<br /><br />&lt;%@page language="java" import="java.net.*" pageEncoding="gb2312"%&gt;<br />&lt;%<br />    response.setContentType("application/x-download");//设置为下载application/x-download<br />    String filenamedownload = "/系统解决方案.doc";//即将下载的文件的相对路径<br />    String filenamedisplay = "系统解决方案.doc";//下载文件时显示的文件保存名称<br />    filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8");<br />    response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay);<br />    <br />    try<br />    {<br />        RequestDispatcher dispatcher = application.getRequestDispatcher(filenamedownload);<br />        if(dispatcher != null)<br />        {<br />            dispatcher.forward(request,response);<br />        }<br />        response.flushBuffer();<br />    }<br />    catch(Exception e)<br />    {<br />        e.printStackTrace();<br />    }<br />    finally<br />    {<br />    <br />    }<br />%&gt;<br /><br /><br />二、采用文件流输出的方式下载<br /><br />1、web.xml文件中增加<br />  &lt;mime-mapping&gt;<br />    &lt;extension&gt;doc&lt;/extension&gt;<br />    &lt;mime-type&gt;application/vnd.ms-word&lt;/mime-type&gt;<br />  &lt;/mime-mapping&gt;<br /><br /><br />2、程序如下：<br /><br />&lt;%@page language="java" contentType="application/x-msdownload" import="java.io.*,java.net.*" pageEncoding="gb2312"%&gt;&lt;%<br />    //关于文件下载时采用文件流输出的方式处理：<br />    //加上response.reset()，并且所有的％&gt;后面不要换行，包括最后一个；<br />    //因为Application Server在处理编译jsp时对于％&gt;和&lt;％之间的内容一般是原样输出，而且默认是PrintWriter，<br />    //而你却要进行流输出：ServletOutputStream，这样做相当于试图在Servlet中使用两种输出机制，<br />    //就会发生：getOutputStream() has already been called for this response的错误<br />    //详细请见《More Java Pitfill》一书的第二部分 Web层Item 33：试图在Servlet中使用两种输出机制 270<br />    //而且如果有换行，对于文本文件没有什么问题，但是对于其它格式，比如AutoCAD、Word、Excel等文件<br />    //下载下来的文件中就会多出一些换行符0x0d和0x0a，这样可能导致某些格式的文件无法打开，有些也可以正常打开。<br /><br />    response.reset();//可以加也可以不加<br />    response.setContentType("application/x-download");//设置为下载application/x-download<br />    // /../../退WEB-INF/classes两级到应用的根目录下去，注意Tomcat与WebLogic下面这一句得到的路径不同，WebLogic中路径最后没有/<br />    System.out.println(this.getClass().getClassLoader().getResource("/").getPath());<br />    String filenamedownload = this.getClass().getClassLoader().getResource("/").getPath() + "/../../系统解决方案.doc";<br />    String filenamedisplay = "系统解决方案.doc";//系统解决方案.txt<br />    filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8");<br />    response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay);<br /><br />    OutputStream output = null;<br />    FileInputStream fis = null;<br />    try<br />    {<br />        output  = response.getOutputStream();<br />        fis = new FileInputStream(filenamedownload);<br /><br />        byte[] b = new byte[1024];<br />        int i = 0;<br /><br />        while((i = fis.read(b)) &gt; 0)<br />        {<br />            output.write(b, 0, i);<br />        }<br />        output.flush();<br />    }<br />    catch(Exception e)<br />    {<br />        System.out.println("Error!");<br />        e.printStackTrace();<br />    }<br />    finally<br />    {<br />        if(fis != null)<br />        {<br />            fis.close();<br />            fis = null;<br />        }<br />        if(output != null)<br />        {<br />            output.close();<br />            output = null;<br />        }<br />    }<br />%&gt;<br /></div>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/92172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-01-06 13:38 <a href="http://www.blogjava.net/wuxufeng8080/articles/92172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSON：数据传递的另一种模式(ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/59818.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Mon, 24 Jul 2006 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/59818.html</guid><description><![CDATA[
		<p>JSON(Javascript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于Javascript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式，但是也使用了类似于C语言家族的习惯（包括C, C++, C#, Java, Javascript, Perl, Python等）。这些特性使JSON成为理想的数据交换语言。</p>
		<p>JSON概念很简单，就是服务器直接生成Javascript语句，客户端获取后直接用eval方法来获得这个对象，这样就可以省去解析XML的性损失。</p>
		<p>例如：</p>
		<p>使用XML表示：</p>
		<p>
				<!--code-->
		</p>
		<div class="codetop">代码: [ <a onclick="HighlightAll(c9c81a2cfe53f80546638cd9b217085fa)" href="http://www.richweb.cn/showthread.php?t=5#"><font color="#000000">复制到剪贴板</font></a> ]</div>
		<div class="codemain" id="c9c81a2cfe53f80546638cd9b217085fa">
				<!--code1-->&lt;<span style="COLOR: blue">items</span>&gt;<br /> &lt;<span style="COLOR: blue">item</span>&gt;<br />  &lt;<span style="COLOR: blue">id</span>&gt;1&lt;<span style="COLOR: blue">/id</span>&gt;<br />  &lt;<span style="COLOR: blue">author</span>&gt;Jackson&lt;<span style="COLOR: blue">/author</span>&gt;<br />  &lt;<span style="COLOR: blue">url</span>&gt;<a href="http://www.richweb.cn&lt;/" target="_blank"><font color="#000000">http://www.richweb.cn&lt;</font></a><span style="COLOR: blue">/url</span>&gt;<br />  &lt;<span style="COLOR: blue">content</span>&gt;Welcome to RichWeb.cn&lt;<span style="COLOR: blue">/content</span>&gt;<br /> &lt;<span style="COLOR: blue">/item</span>&gt;<br /> &lt;<span style="COLOR: blue">item</span>&gt;<br />  &lt;<span style="COLOR: blue">id</span>&gt;2&lt;<span style="COLOR: blue">/id</span>&gt;<br />  &lt;<span style="COLOR: blue">author</span>&gt;Relkn&lt;<span style="COLOR: blue">/author</span>&gt;<br />  &lt;<span style="COLOR: blue">url</span>&gt;<a href="http://www.richweb.cn&lt;/" target="_blank"><font color="#000000">http://www.richweb.cn&lt;</font></a><span style="COLOR: blue">/url</span>&gt;<br />  &lt;<span style="COLOR: blue">content</span>&gt;RichWeb.cn关注互联网新技术&lt;<span style="COLOR: blue">/content</span>&gt;<br /> &lt;<span style="COLOR: blue">/item</span>&gt;<br /> &lt;<span style="COLOR: blue">item</span>&gt;<br />  &lt;<span style="COLOR: blue">id</span>&gt;3&lt;<span style="COLOR: blue">/id</span>&gt;<br />  &lt;<span style="COLOR: blue">author</span>&gt;Kvogend&lt;<span style="COLOR: blue">/author</span>&gt;<br />  &lt;<span style="COLOR: blue">url</span>&gt;<a href="http://www.richweb.cn&lt;/" target="_blank"><font color="#000000">http://www.richweb.cn&lt;</font></a><span style="COLOR: blue">/url</span>&gt;<br />  &lt;<span style="COLOR: blue">content</span>&gt;RichWeb.cn关注WEB2.0&lt;<span style="COLOR: blue">/content</span>&gt;<br /> &lt;<span style="COLOR: blue">/item</span>&gt;<br />&lt;<span style="COLOR: blue">/items</span>&gt;<!--code2--></div>
		<!--code3-->
		<p>
		</p>
		<p>使用JSON：</p>
		<p>
				<!--code-->
		</p>
		<div class="codetop">代码: [ <a onclick="HighlightAll(cd7a7cc66f7e4d0eb7fcd663bb11c8085)" href="http://www.richweb.cn/showthread.php?t=5#"><font color="#000000">复制到剪贴板</font></a> ]</div>
		<div class="codemain" id="cd7a7cc66f7e4d0eb7fcd663bb11c8085">
				<!--code1-->{items:[<br /> {<br />  id:1,<br />  author:\"Jackson\",<br />  <a href="file://%22http:///%22http://www.richweb.cn//%22" target="\\&quot;_blank\\&quot;"><font color="#000000">url:\"http://www.richweb.cn</font></a>\",<br />  content:\"Welcome to RichWeb.cn\"<br /> },<br /> {<br />  id:2,<br />  author:\"Relkn\",<br />  <a href="file://%22http:///%22http://www.richweb.cn//%22" target="\\&quot;_blank\\&quot;"><font color="#000000">url:\"http://www.richweb.cn</font></a>\",<br />  content:\"RichWeb.cn关注互联网新技术\"<br /> },<br /> {<br />  id:3,<br />  author:\"Kvogend\",<br />  <a href="file://%22http:///%22http://www.richweb.cn//%22" target="\\&quot;_blank\\&quot;"><font color="#000000">url:\"http://www.richweb.cn</font></a>\",<br />  content:\"RichWeb.cn关注WEB2.0\"<br /> }<br />]};<!--code2--></div>
		<!--code3-->
		<p>
		</p>
		<p>JSON不仅减少了解析XML解析带来的性能问题和兼容性问题，而且对于Javascript来说非常容易使用，可以方便的通过遍历数组以及访问对象属性来获取数据，其可读性也不错，基本具备了结构化数据的性质。不得不说是一个很好的办法，而且事实上google maps就没有采用XML传递数据，而是采用了JSON方案。</p>
		<p>JSON的另外一个优势是"跨域性"，例如你在<a href="http://www.richweb.cn/" target="_blank"><font color="#000000">www.richweb.cn</font></a>的网页里使用</p>
		<p>&lt;script type="text/javascript" src="<a href="http://www.yyy.com/some.js"><font color="#000000">" target="_blank"&gt;</font><a href="http://www.yyy.com/some.js" target="_blank"><font color="#000000">http://www.yyy.com/some.js</font></a>"&gt;</a></p>
		<p>是完全可行的，这就意味着你可以跨域传递信息。而使用XMLHttpRequest却获取不了跨域的信息，这是Javascript内部的安全性质所限制的。</p>
		<p>JSON能完全取代XML吗？当然不能，原因就在于XML的优势：通用性。要使服务器端产生语法合格的Javascript代码并不是很容易做到的，这主要发生在比较庞大的系统，服务器端和客户端有不同的开发人员。它们必须协商对象的格式，这很容易造成错误。</p>
		<p>引自：<a href="http://www.richweb.cn/showthread.php?t=5"><a href="http://www.richweb.cn/showthread.php?t=5" target="_blank"><font color="#000000">http://www.richweb.cn/showthread.php?t=5</font></a></a><br /></p>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/59818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-07-24 15:24 <a href="http://www.blogjava.net/wuxufeng8080/articles/59818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>全面了解和解析！ Blog和RSS的含义</title><link>http://www.blogjava.net/wuxufeng8080/articles/57113.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 07 Jul 2006 05:08:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/57113.html</guid><description><![CDATA[
		<p>
				<strong>什么是 Blog？</strong>
		</p>
		<p>　　 “Blog”是 Web Log 的简称（译者注：也就 是网志(中国大陆也叫博客)。</p>
		<p>它是一种作者与读者以日志风格进行交互的中介。在软件社区，人们以网志形式来共享观念与思想变得越来越流行。如：http://blogs.ccw.com.cn就是CCW上的一个 blogging。　　　 </p>
		<p>　　 建立网志最轻松的方法是什么？　　　 </p>
		<p>　　 要想建立自己的网志，最容易的方法是到类似 blogger.com 这样的站点注册一个新用户，它提供一个创建自定义网志的 Web 界面，并且可以立即使用所创建的网志。类似 blogger.com 的站点有很多，它们都提供对网志特性的支持。 如果你想更多地控制网志的基础结构或者想要在自己的服务器上建立网志服务系统。你可在以下最流行的几种网志应用商业产品中选择其一：Radio Userland、Manila 和 Movable Type。还有些易用的免费 .NET 网志应用可以使用，最流行的有：.TEXT 和 dasBlog。只要把它们下载下来，然后按照安装说明进行安装与设置，分分钟便可建立起一个可运行的网志服务系统。 </p>
		<p>　　从功能上讲，这两个基于 .NET 的网志应用系统不相上下。其主要区别在于 .TEXT 需要数据库，SQL Server 或者 MSDE，而dasBlog 将所有信息都存储在 XML 文件中（它基于原来一些微软公司开发人员创建的 BlogX 框架），另一个差别是 .TEXT 在单个安装配置中可支持多个网志（比如现在的 http://blogs.msdn.com 就是如此），而 dasBlog 要支持多个网志，必须进行多次安装。但 dasBlog 有一个很突出的特性，那就是“Mail to Weblog”，它允许你通过邮件来发布新信息。 </p>
		<p>　　新的 MSDN 网志服务站点和 PDC Bloggers 都是开始查找关于软件开发主题的很好去处。只要浏览这些站点之一便可阅读其经过聚合的预定内容。其预定的摘要会向你公开许多个人网志，渐渐的你会自然而然地发现一些你比较喜欢阅读的内容。这样，你便可以直接预定你最喜欢的个人网志摘要。 </p>
		<p>　　对于专门讨论 XML 和 Web 服务的网志，请查看 MSDN Web Services Developer Center 上的清单，我个人要花很多时间上这些网志站点。　　　 </p>
		<p>　　<strong> 什么是 Feed</strong>（以下称为提要），如何预定它？　　　 </p>
		<p>　　 网志以 RSS 文档 </p>
		<p>　　形式为其内容提供一个提要，该 RSS 文档可以通过众所周知 URL 获得。RSS 文档是一个 XML 文件，它包含大量离散的新闻项，如某个网志中的入口项（RSS 提要的例子参见 Figure 1）。由于 RSS 是 XML 格式文件，所以它很容易被其它程序所使用。 </p>
		<p>　　RSS 聚合器是一个读取 RSS 文档并显示新闻项的程序。大多数聚合器只要输入 RSS 的 URL，使得预定提要成为可能。 </p>
		<p>　　RSS 使阅读网志便得容易。大多数经常阅读网志的开发人员都使用某种类型的聚合器来帮助他们有效地筛选提要内容。聚合器使得阅读网志的感觉就象是在阅读电子邮件，因为它们突出新闻项并将新闻项进行缓冲处理以便离线阅读（参见 Figure 2）。 </p>
		<p>　　还有一些在线 RSS 聚合器将 RSS 提要捆绑到某个单独的网站。其优点是易于设置并且可以从任何计算机存取你的提要内容。当然，其缺点也是显而易见的，那就是在阅读时必须始终保持连接。 </p>
		<p>　　RSS 是网志成为一种强大的新型信息交流形式之根本所在。在网志出现之前，大多数开发人员为了要查找到需要的内容，通常要花大量时间来筛选掉那些令人讨厌的无关的信息。 </p>
		<p>　　网志通过让读者选择所要阅读的提要，将控制权交给读者，从而有效地构建自己的个性化内容流。 </p>
		<p>　　其它类型的站点也能利用 RSS 的优点来聚合内容。例如，多数主流的新闻站点包括 Wired、CNet、Yahoo 和 NPR News 都提供 RSS 提要。访问 Blogdigger 和 Syndic8，你可以找到一些支持 RSS 的站点。 </p>
		<p>　　　　微软的 MSDN 提供 RSS 提要（RSS feeds）来聚合新添加到站点的技术内容。MSDN 的 Just Published提要是一种保持 MSDN 新文章和下载的主要方式。甚至 MSDN Magazine（MSDN 杂志）都有其自己的 RSS 提要！可以预定：http://msdn.microsoft.com/msdnmag/rss/recent.xml 获得每月的更新以便查看本期有何内容？目前有许多种 RSS 聚合器可供选择，在 http://blogs.law.harvard.edu/tech/directory/5/aggregators 上可以找到一个相当完整的列表。其中一些是在线聚合器，而另外一些是桌面应用程序。有些是免费的，另外一些需要付费才能使用。</p>
		<p>　<strong>哪个 RSS 版本是最通用的？</strong>　　　 </p>
		<p>　　这个问题的答案要看你问的是谁，RSS </p>
		<p>　　的版本有好多个，0.90、0.91、0.92、0.93、0.94、1.0 和 2.0。要弄清楚这些版本之间的差别是巨大的挑战之一。理解它们需要了解一些有关它们的历史背景。Netscape 创建了 RSS 的最初版本 0.90，起初的名字是“RDF Site Summary”或者“Rich Site Summary”（规范中说前者是正式名称）。Netscape 创建 RSS 0.90 用于其 Web 门户，这个时候，其他人看到了 RSS 的使用潜力。Userland Software 是第一个开始将 RSS 用于其网志商业产品者之一。 </p>
		<p>　　版本 0.90 在很大程度上基于 W3C 的 Resource Description Framework (RDF)。许多人都认为 RDF 过于复杂，因此都建议出一个免费的简化版本 0.91。这个任务恰好就给了 Userland Software。Userland Software 便继续发展 RSS 的简化版本，随后出台的版本包括：0.92、0.93 和 0.94。为了强调其所做的简化工作，他们将 RSS 的全称定为“Really Simple Syndication”。 </p>
		<p>　　正当 Userland Software 继续专注于其简化工作时，另外一组开发人员在复兴最初的 RDF 版本（0.90），因为 RSS 号称自己更灵活。他们最终发布了一个 RSS 1.0 的版本，其正式名称还是“RDF Site Summary”。由于使用 RDF，这个版本完全不同于 Userland Software 所控制的版本。Userland Software 当然不太愿意看到 RSS 1.0 似乎要取代其 0.94 版本的事实，于是出了一个新版本，并将版本号一下子跳到了 2.0。 </p>
		<p>　　这就是今天的这种局面，形成了两个主要的竞争版本：一个基于 RDF 1.0，而另一个则不是（2.0），但它们两个都共用相同的名字。这是一种可怕的混乱，因为版本号导致人们误认为 2.0 是 1.0 的改进版本，而实际上它们是两个目标完全不同的规范。另一组开发人员已经下狠心着手解决这种混乱问题，通过定义新的摘要（syndication）规范来与 RSS 名字的随意性决裂。这个解决方案称为 Atom（原子）项目。本文稍后将会详细讨论。 </p>
		<p>　　使用哪个版本其实是无关痛痒的，大多数 RSS 聚合机制支持所有的 RSS 版本（有些甚至支持 Atom）。最终的决定取决于你是否想使用 RDF，可谓萝卜白菜，各有所爱，它完全要看某人所信奉的 Semantic Web 概念而定。 </p>
		<p>　　<strong>RSS 1.0 和 RSS 2.0 各是什么样子？</strong>　　　 </p>
		<p>　　RSS 1.0 </p>
		<p>　　和 2.0 格式所包含的核心信息相同，但其结构不一样。我提供了一个 RSS 1.0 文档（参见 Figure 1）以及一个同等的 RSS 2.0（参见 Figure 2）用于对照。 </p>
		<p>　　你会注意到顶行右边开始的根元素的差异，RSS 1.0 的根元素是 rdf:RDF，而 RSS 2.0 的根元素是 rss。rss 还包含一个强制版本属性用以表示所用的RSS的准确格式（可能的值包括：0.91, 0.94 等）。另一个主要差别是 RSS 1.0 文档有名字空间限定，RSS 2.0 的文档就没有。不管怎样，包含在两个文档中的信息本质上是一样的。 </p>
		<p>　　两个版本都包含 channel 元素，而 channel 元素又包含三个必须的元素：title、description 和 link，其代码如下： </p>
		<p>　　＜channel＞ </p>
		<p>　　 ＜title＞＜!– channel 的标题 –＞＜/title＞ </p>
		<p>　　 ＜description＞＜!– 简要描述 –＞＜/description＞ </p>
		<p>　　 ＜link＞＜!– channel 的 URL –＞＜/link＞ </p>
		<p>　　 ＜!– 可选/可扩展元素 –＞ </p>
		<p>　　＜/channel＞ </p>
		<p>　　　　除了这些必须的元素外，RSS 1.0 还定义了三个附加元素：image、items 和 textinput，其中，image 和 textinput 是可选的。另一方面，RSS 2.0 提供了 16 个附加元素，其中也包括 image、items 和 textinput，此外还有 language、copyright、managingEditor、pubDate 和 category。RSS 1.0 允许通过定义在单独的 XML 名字空间中的可扩展元素来创建这种类型的元数据。 </p>
		<p>　　　　这两种格式在结构上的主要区别必须要看其 item、image 和 textinput 节点的表示形式。RSS 1.0 中，channel 元素包含对 item、image 和 textinput 节点的引用，这些节点存在于 channel 节点本身之外。这样在 channel 和 所引用的节点之间建立了一种 RDF 关联。如 Figure 1 所示，channel 元素与一个 image 元素以及两个 item 元素关联。RSS 2.0 中，item 元素只是在 channel 元素中连续排放（如 Figure 2 所示）。item 元素包含实际的新闻项信息。item 的结构在两个版本中是相同的。item 元素通常包含 title、link 和 description 元素，如下代码所示： </p>
		<p>　　 </p>
		<p>　　＜item＞ </p>
		<p>　　 ＜title＞＜!– 项标题 –＞＜/title＞ </p>
		<p>　　 ＜link＞＜!– 项 URL –＞＜/link＞ </p>
		<p>　　 ＜description＞＜!– 简要描述 –＞＜/description＞ </p>
		<p>　　 ＜!– 可选的/可扩展的元素 –＞ </p>
		<p>　　＜/item＞ </p>
		<p>　　　　在 RSS 1.0 中，title 和 link 是必须的，description 是可选的。而在 RSS 2.0 中，title 或 description 必须提供其中的一个；其它均可选。这些只是定义在 RSS 1.0 中的 item 元素。RSS 2.0 提供几个其它可选元素，其中有 author、category、comments、enclosure、guid、pubDate 和 source。RSS 1.0 获取这样的元数据是通过定义在单独的 XML 名字空间中称为 RSS 模块的可扩展元素来实现的。例如，在 Figure 1 中，item 的日期是用 Dublic Core 模块的 ＜dc:date＞ 元素表示的。<br />　<br />　　有关不同格式的完整信息请参考 RSS 1.0 和 2.0 规范。</p>
		<p>
				<strong>那么，何为 Atom？　　</strong>　 </p>
		<p>　　 前面我提到过，Atom 乃一项目的名字，主要是开发一个新的网志摘要格式以解决目前 RSS 存在的问题（混乱的版本号，不是一个真正的开放标准，表示方法的不一致，定义贫乏等等）。Atom 希望提供一个清晰的版本以解决每个人的需要，其设计完全不依赖于供货商，任何人都可以对之进行自由扩展，完整详细说明。 </p>
		<p>　　当今许多 Blog 引擎已经支持当前的摘要格式。Figure 3 是一个Atom 0.3 提要例子，它与前述 Figure 1 及 Figure 2 RSS 提要等同。注意 Atom 提要用名字空间限定的，但它不使用 RDF。这使得 Atom 和 RSS 1.0 及 RSS 2.0 在某些地方有相似之处。Atom 在未来是否能被接受，人们拭目以待。 </p>
		<p>　　除了定义新的摘要格式之外，Atom 还希望定义一个标准的档案文件格式和一个标准的网志编辑 API（Atom API）。有关 Atom 详细规范以及其它 Atom 资源请访问 The Atom Project。 </p>
		<p>　　<strong>什么是 blogroll？ </strong></p>
		<p>　　 blogroll 是网志提要的集合， </p>
		<p>　　大多数 blogger（博客）在其个人网志上都提供 blogroll。这就允许读者连接到其他趣味和写作风格相投的人的网志上。Blogroll 方便了网络上的沟通。通过使用Outline Processor Markup Language （OPML），人们可以用 XML 格式文件交换 blogroll。Figure 4 是 blogroll 的一个例子。 </p>
		<p>　　　　大多数网志引擎都自己管理 blogroll，每当读者请求 blogroll 时都自己产生相应的 XML 格式。同样，大多数聚合器都能导入 blogroll 并自动预定所包含的摘要。有关 OPML 更多的信息参见 http://opml.scripting.com。 </p>
		<p>　　<strong>能解释 referrers、trackbacks 和 pingbacks 是什么吗？ </strong></p>
		<p>　　 大多数网志软件都能让读者添加网志评论。但更常见的做法是让读者在其自己的网志添加一个入口回链到原来的帖子。博客们（Bloggers）都乐于跟踪连接发生的时间以便新读者能理解整个会话内容。 </p>
		<p>　　所谓 referrer 是一个外部站点，用户单击该站点上一个超链接便可以到达你的网站。许多网志引擎当读者导航到你的网志的某个入口时都能自动保持跟踪。大多数引擎都会在网志入口底部显示一个 referrers 清单，以便读者能往回导航到 referrer 的站点，并清楚他们关于该入口要说些什么，这基于一个假设，那就是如果他们链接到它，可能就此会写些什么。referrer 存在的问题是必须要有这个假设才成立??没有足够的信息说明是否引用的页面事实上包含有关信息。实际上，垃圾信息的发布者为了营销企图已经利用了这个漏洞来重定向读者。<br />　　Trackback 和 pingback 同一个规范，被用来弥补上述问题的方案。使用 trackback 和 pingback，其他博客们能自动发送一个 ping 到你的网志以明确表示他们已经写了一个引用特定帖子的入口。</p>
		<p>　　这种类型的反链允许你的网志以更明显的方式显示所有评论的清单。当今大多数网志软件支持所有这些技术。参见 TrackBack Technical Specification 和 Pingback 1.0。</p>
		<p>如何为我的站点产生 RSS 提要？　　　 </p>
		<p>　　 Figure 5 举例说明了 </p>
		<p>　　如何用 asp:Repeater 控件在 .aspx 页面中生成 RSS 2.0 提要。该页面假设你已经在后端代码文件中将控件的 DataSource 属性设置成对应的数据库结果集。　　　 </p>
		<p>　　 我想聚合几个 RSS 提要并将信息显示在个人网站上，能解释一下如何实现吗？　　　 </p>
		<p>　　 因为 RSS 提要是 XML 文件，作为练习，你可以用自己最擅长的 XML API，比如，Microsoft .NET Framework 中的 System.Xml，Figure 6 中包含 ASP.NET Web 用户控件代码，它是我编写用来聚合 blogroll 文件中（.opml）所列出的 RSS 提要的一段代码。这段代码假设 opml 元素包含 numberToDisplay 属性，以表示你打算显示的每个提要有多少项。 </p>
		<p>　　<img alt="" src="http://photocdn.sohu.com/20050411/Img225123736.gif" /></p>
		<p>　　Figure 7 ASP.NET Web 用户控件<br />　<br />　　你可以将控件拖到任何 .aspx 页面中，它将显示 blogroll 文件中列出的不同提要的项，Figure 7 显示了 Utah .NET User Group 网站使用这个控件的效果画面。 </p>
		<p>　　有没有与网志交互的 Web Services APIs？<br />　 </p>
		<p>　　 许多网志引擎都提供属于自己的 Web service 接口，通过编程与网志交互，但目前还没有出现一种标准化的东西。 </p>
		<p>　　.Text 和 dasBlog 两者都提供某些 .asmx 端点，可以通过 SOAP 来实现编辑功能，但其接口是不同的。Blogger.com 提供基于 XML-RPC 的交互式 API （Blogger API）。Userland Software 对Blogger API 的功能进行了增强，并把它叫做 MetaWeblog API。这些可能是当今公认的网志 APIs，但仍然不是所有网志引擎都支持的。还有一个用于添加评论的独力的 API 叫做 Comment API，同样，它也不是被普遍支持。 </p>
		<p>　　　　Atom 组正在努力解决这些问题，Atom API 定义了一个标准的网志 API 用于发布和编辑网志内容。有关信息请参考 The Atom Project 网站</p>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/57113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-07-07 13:08 <a href="http://www.blogjava.net/wuxufeng8080/articles/57113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Javascript 验证表单提交 </title><link>http://www.blogjava.net/wuxufeng8080/articles/56790.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 05 Jul 2006 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/56790.html</guid><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent">
				<font size="3">
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">
								<b style="mso-bidi-font-weight: normal">
										<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
												<p>
												</p>
										</span>
								</b>
								<p>
								</p>
						</span>
				</font>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<font size="3">
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">首先要确定在那个</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">form </span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">里验证</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">我们要做的事情是</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">: 
<p></p></span>
						</font>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">&lt;form<span style="mso-spacerun: yes">  </span>method="post" action="" <b style="mso-bidi-font-weight: normal">name="f"</b><b style="mso-bidi-font-weight: normal">LANGUAGE="javascript"</b><b style="mso-bidi-font-weight: normal">onsubmit=</b>"<b style="mso-bidi-font-weight: normal">return f_submit()</b>" &gt; 
<p></p></span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<p> </p>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<font size="3">
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">这里分析一下</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">, 
<p></p></span>
						</font>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: Courier; mso-bidi-font-family: Courier">
								<span style="mso-list: Ignore">
										<font size="3">1.</font>
										<span style="FONT: 7pt 'Times New Roman'">  </span>
								</span>
						</span>
						<b style="mso-bidi-font-weight: normal">
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">name="f" </span>
						</b>
						<font size="3">
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">一般我们验证的时候不需要给</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">form </span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">命名</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">可是这里要</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">为什么</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">需要验证的是那个表单的那个</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">textfield? 
<p></p></span>
						</font>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: Courier; mso-bidi-font-family: Courier">
								<span style="mso-list: Ignore">
										<font size="3">2.</font>
										<span style="FONT: 7pt 'Times New Roman'">  </span>
								</span>
						</span>
						<b style="mso-bidi-font-weight: normal">
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">LANGUAGE="javascript" </span>
						</b>
						<font size="3">
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">这里要指出验证的脚本语言是什么</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">不区分大小写</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
										<p>
										</p>
								</span>
						</font>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: Courier; mso-bidi-font-family: Courier">
								<span style="mso-list: Ignore">
										<font size="3">3.</font>
										<span style="FONT: 7pt 'Times New Roman'">  </span>
								</span>
						</span>
						<b style="mso-bidi-font-weight: normal">
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">onsubmit=</span>
						</b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">"<b style="mso-bidi-font-weight: normal">return f_submit()</b>" </span>
						<font size="3">
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">这里</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,return </span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">的值非常重要</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">, </span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">它会用在</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">javascript </span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">脚本语言里面</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">不可以和脚本里的不符合</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">!</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">前面的</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">onsubmit</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">必须写全</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">写成</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">submit </span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">不可以</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">写成别的更不可以</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">! 
<p></p></span>
						</font>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<b style="mso-bidi-font-weight: normal">
								<span lang="ZH-CN" style="FONT-SIZE: 10pt; FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">接着我们看</span>
						</b>
						<b style="mso-bidi-font-weight: normal">
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">javascript 
<p></p></span>
						</b>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<font size="3">&lt;script language="javascript"&gt; 
<p></p></font>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<p>
										<font size="3">
										</font> </p>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<font size="3">
								<b style="mso-bidi-font-weight: normal">
										<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">function f_submit()</span>
								</b>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">{ 
<p></p></span>
						</font>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<font size="3">if(document.<b style="mso-bidi-font-weight: normal">f.title</b>.value=="") 
<p></p></font>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<font size="3">{ 
<p></p></font>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<font size="3">
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">alert("Sorry, </span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">信息沒有輸入</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">") 
<p></p></span>
						</font>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<font size="3">document.<b style="mso-bidi-font-weight: normal">f.title</b>.focus() 
<p></p></font>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<font size="3">return false 
<p></p></font>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<font size="3">} 
<p></p></font>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<font size="3">
										<span style="mso-spacerun: yes"> </span>else if(document.frmAddLink.content.value=="") 
<p></p></font>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<font size="3">{ 
<p></p></font>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<font size="3">
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">alert("Sorry, </span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">說明沒有輸入</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">") 
<p></p></span>
						</font>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<font size="3">document.frmAddLink.content.focus() 
<p></p></font>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<font size="3">return false 
<p></p></font>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<font size="3">} 
<p></p></font>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<font size="3">} 
<p></p></font>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<p>
										<font size="3">
										</font> </p>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								<font size="3">&lt;/script&gt; 
<p></p></font>
						</span>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: Courier; mso-bidi-font-family: Courier">
								<span style="mso-list: Ignore">
										<font size="3">1.</font>
										<span style="FONT: 7pt 'Times New Roman'">  </span>
								</span>
						</span>
						<font size="3">
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">注意</span>
								<b style="mso-bidi-font-weight: normal">
										<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">function f_submit() </span>
								</b>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">严格区分大小写</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">! <b style="mso-bidi-font-weight: normal">function </b></span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">写成</span>
								<span lang="ZH-CN" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								</span>
								<b style="mso-bidi-font-weight: normal">
										<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">Function</span>
								</b>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">是不可以的</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">至于</span>
								<b style="mso-bidi-font-weight: normal">
										<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">f_submit(),</span>
								</b>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">就是</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">form </span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">里要</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">onsubmit</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">的</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">return </span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">的值</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">当然</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">照抄就可以</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">大小写当然区分</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">! 
<p></p></span>
						</font>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: Courier; mso-bidi-font-family: Courier">
								<span style="mso-list: Ignore">
										<font size="3">2.</font>
										<span style="FONT: 7pt 'Times New Roman'">  </span>
								</span>
						</span>
						<font size="3">
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">下面</span>
								<b style="mso-bidi-font-weight: normal">
										<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">f.title</span>
								</b>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">
								</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">代表表单的值</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">要和</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">textfield </span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">相匹配</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">! 
<p></p></span>
						</font>
				</p>
				<p>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
						<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: Courier; mso-bidi-font-family: Courier">
								<span style="mso-list: Ignore">
										<font size="3">3.</font>
										<span style="FONT: 7pt 'Times New Roman'">  </span>
								</span>
						</span>
						<font size="3">
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">java/c</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">语言都在每句后面加分号</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">可是</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">javascript</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">不可以加</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">!</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">这里很不习惯</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">,</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">我总是喜欢加分号</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">.</span>
								<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-fareast-language: ZH-CN">其它语句看大意就能理解</span>
								<span lang="EN-US" style="FONT-FAMILY: Courier; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">.</span>
						</font>
				</p>
		</span>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/56790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-07-05 16:10 <a href="http://www.blogjava.net/wuxufeng8080/articles/56790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>彻底解决中文名文件下载和下载文件内容乱码问题（转载）</title><link>http://www.blogjava.net/wuxufeng8080/articles/56725.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 05 Jul 2006 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/56725.html</guid><description><![CDATA[
		<p>文件上传: <br />-----------------------------------------<br />准备工作:导入著名的SmartUpload.jar组件包<br />upload.jsp文件<br />---------------------------------------------------------<br />&lt;%@ page contentType="text/html; charset=gb2312" %&gt;<br />&lt;%<br /> request.setCharacterEncoding("gb2312"); // 这句话很重要，否则遇到中文就出错~<br />%&gt;<br />&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;上传&lt;/TITLE&gt;<br />&lt;META content="text/html; charset=gb2312" http-equiv=Content-Type&gt;<br />&lt;/HEAD&gt;<br />&lt;BODY leftMargin=0 topMargin=0&gt;<br />&lt;table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#DEE7EF"&gt;<br />  &lt;tr&gt;<br />    &lt;td align="center"&gt; <br />      &lt;FORM action="upload_ok.jsp" method=post name="Upload" enctype="multipart/form-data"&gt;<br />        &lt;br&gt;<br />        请输入附件文件的所在路径&lt;FONT color=red&gt; * &lt;/FONT&gt;为必填项目&lt;br&gt;<br />        &lt;br&gt;<br />        &lt;TABLE width="317" border=0 cellPadding=0&gt;<br />          &lt;TBODY&gt;<br />            &lt;TR&gt; <br />              &lt;TD align=right vAlign=center nowrap&gt;附件路径：&lt;/TD&gt;<br />              &lt;TD&gt;&lt;input type="file" name="file" style="border: 1px #FFFFFF solid;background:#efefef" &gt; &lt;FONT color=red&gt;*&lt;/FONT&gt;&lt;/TD&gt;<br />            &lt;/TR&gt;<br />            &lt;TR align="center"&gt; <br />              &lt;TD height=60 colspan="2" vAlign=center nowrap&gt; &lt;INPUT style="height:22px" name=B1 type=submit value=" 确 定 " &gt;<br />&lt;INPUT style="height:22px" name=B2 type=reset value=" 取 消 " &gt; <br />              &lt;/TD&gt;<br />            &lt;/TR&gt;<br />          &lt;/TBODY&gt;<br />        &lt;/TABLE&gt;<br />      &lt;/FORM&gt; <br />&lt;/td&gt;<br />  &lt;/tr&gt;<br />&lt;/table&gt;<br />&lt;/BODY&gt;&lt;/HTML&gt;<br />---------------------------------------------------------<br />upload_ok.jsp文件<br />---------------------------------------------------------<br />&lt;%@ page contentType="text/html;charset=gb2312" %&gt;<br />&lt;%@ page import="com.jspsmart.upload.*" %&gt;<br />&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;上传成功!&lt;/TITLE&gt;<br />&lt;META content="text/html; charset=gb2312" http-equiv=Content-Type&gt;<br />&lt;/HEAD&gt;<br />&lt;BODY leftMargin=0 topMargin=0&gt;<br />&lt;jsp:useBean id="mySmartUpload" scope="page" class="com.jspsmart.upload.SmartUpload" /&gt;<br />&lt;table width="80%"  border="0" cellpadding="0" cellspacing="0" bgcolor="#DEE7EF"&gt;<br />  &lt;tr&gt;<br />    &lt;td align="center"&gt; <br />&lt;% <br /> int count=0;<br /> String fileName = null;<br /> mySmartUpload.initialize(pageContext); <br /> mySmartUpload.upload();<br /> com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(0);<br /> if (!myFile.isMissing()) {<br />  //String ext=myFile.getFileExt();//得到后缀   <br />  fileName = myFile.getFileName();<br />            myFile.saveAs("/files/" + fileName);//你要存放文件所在文件夹的相对路径<br />     out.println("文件:&lt;b&gt;"+fileName+"&lt;/b&gt;上传成功!&lt;br&gt;文件大小:" + myFile.getSize() + "kb&lt;BR&gt;");<br />     }<br />%&gt;<br />&lt;/BODY&gt;&lt;/HTML&gt;<br />---------------------------------------------------------</p>
		<p>文件下载: <br />-----------------------------------------<br />文件的超连接写法范例:<br />&lt;% String fname ="中文测试.xsl"; //假设你的文件名是:中文测试.xsl<br />%&gt;<br />&lt;A target="_blank" href="Download.jsp?filename=&lt;%=fname%&gt;"&gt;下 载&lt;/A&gt;<br />文件的超连接写法范例-2 重新用utf-8对文件名编码:<br />&lt;%@ page contentType="text/html;charset=gb2312" session="true"%&gt;<br />&lt;%  String name=java.net.URLEncoder.encode("世界文化.doc","UTF-8"));%&gt;  &lt;a href="c:\&lt;%=name%&gt;"&gt;世界文化.doc&lt;/a&gt;</p>
		<p>Download.jsp文件<br />---------------------------------------------------------<br />&lt;%<br />  java.io.BufferedInputStream bis=null;<br />  java.io.BufferedOutputStream  bos=null;<br />try{<br /> String filename=request.getParameter("filename");<br /> filename=new String(filename.getBytes("iso8859-1"),"gb2312");<br /> response.setContentType("application/x-msdownload");<br /> response.setHeader("Content-disposition","attachment; filename="+new String(filename.getBytes("gb2312"),"iso8859-1"));<br /> bis =new java.io.BufferedInputStream(new java.io.FileInputStream(config.getServletContext().getRealPath("files/" + filename)));<br /> bos=new java.io.BufferedOutputStream(response.getOutputStream()); <br /> byte[] buff = new byte[2048];<br /> int bytesRead;<br /> while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {<br />  bos.write(buff,0,bytesRead);<br /> }<br />}<br />catch(Exception e){<br /> e.printStackTrace();<br />}<br />finally {<br /> if (bis != null)bis.close();<br /> if (bos != null)bos.close();<br />}<br />%&gt; </p>
		<p> </p>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/56725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-07-05 14:10 <a href="http://www.blogjava.net/wuxufeng8080/articles/56725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java FTP libraries 比较</title><link>http://www.blogjava.net/wuxufeng8080/articles/56371.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Mon, 03 Jul 2006 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/56371.html</guid><description><![CDATA[
		<h4>摘要:</h4>这篇文章是建立在"Java FTP Client Libraries Reviewed"上的，是用于研究JAVA平台上对FTP的支持。在性能方面，对大文件的传输结果比较相似。对于小文件传输测试，EnterpriseDT's edtFTPj, Calvin Tai's FtpBean,和Glub Tech's Secure FTP Bean是最好的选择，然而SUN的JDK需要解决下载数不能超过200个文件的BUG. <br /><br />正如我以前在JavaWorld上发表的文章Java FTP Client Libraries Reviewed中讨论的一样（2003年4月），JDK对FTP的支持并不完全的符合FTP规范。（FTP规范了959条项目）比如JDK不允许在服务器端创建文件夹或者FTP连接对同一个文件打开两个相同的连接。所以当和RFC959比较时，证明JDK并不是完全令人满意的。而且，当使用JDK所支持的FTP时，FTP服务器端返回的是无格式的字符串，而不是方便的java对象。为了完全的获得RFC959的支持和提供方便的方法，java开发者们必须求助于市面上的第三方库<br />许多的JAVA FTP库都可以在网上找到，他们有：<br /><br /><span style="COLOR: blue">--JScape's Secure FTP Factory <br />--Enterprise Distributed Technologies' FTPj <br />--JFtp <br />--Jakarta Commons/Net <br />--Sun JDK <br />--Florent Cueto's JavaFTP API <br />--Bea Petrovicova's jvFTP <br />--The Globus Alliance's Java CoG Kit <br />--Glub Tech's Secure FTP Bean <br />--Calvin Tai's FtpBean</span><br /><br />这个列表非常的长，所以对这些库进行比较非常的不直观。甚至这些库都实现各自不同的特性，不同的价格，而且水平的质量和使用条款也不同。所以选择一个和具体需求细节有关的库文件非常的麻烦。为了帮助决策者选择一个适合他们需求的库，这篇文章对这些库进行比较和评价。<br /><br /><span style="COLOR: red">版权声明：任何获得Matrix授权的网站，转载时请务必保留以下作者信息和链接</span><br />作者:Jean-Pierre Norguet ;<a href="http://www.matrix.org.cn/user.shtml?username=tain198127" target="_new">tain198127</a>(作者的blog:<a href="http://blog.matrix.org.cn/page/tain198127" target="_new">http://blog.matrix.org.cn/page/tain198127</a>)<br />原文:<a href="http://www.javaworld.com/javaworld/jw-03-2006/jw-0306-ftp.html" target="_new">http://www.javaworld.com/javaworld/jw-03-2006/jw-0306-ftp.html</a><br />Matrix:<a href="http://www.matrix.org.cn/resource/article/44/44480_Java+FTP+libraries.html" target="_new">http://www.matrix.org.cn/resource/article/44/44480_Java+FTP+libraries.html</a><br />关键字:Java;FTP;libraries<br /><br />这些比较采用了一系列的标准，包括所支持的特性，提供者的商业方面，还有文件传输性能。我采用了一些Java FTP Client Libraries Reviewed中的标准。请查阅该文章进行回顾。为了进行评估而建立的新标准是“安全支持标准”还有“文件传输性能标准”。“安全支持标准”指明这些库是否实现了FTP的延伸安全性。“文件传输性能标准”是比较这些库的传输速度<br />关于FTP的“安全支持标准”在Internet Engineering Task Force's reference document RFC2228中有定义。根据建议FTP“安全支持标准”主要是两种类型。隐式的和显式的。隐式的FTP“安全支持标准”实际就是在建立在安全传输层的FTP协议，采用直接的SSL连接，默认通过990端口。显式FTP“安全支持标准”，是建立在SSL上的FTP，但是用隐降牧犹娲酥苯拥腟SL连接，它是先采用普通的FTP协议连接到服务器，然后再用AUTHSSL 或者AUTH TLS命令转换到SSL安全连接来转换到SSL安全模式的。显式SSL和隐式SSL都是典型的提交到FTPS的。FTP“安全支持标准”还可以实现SSH子协议的方式实现（SSH是安全外壳）。这种实现是提交到SFTP的。尽管协议的名字和功能类似，但是他和前面提到的模式是完全不一样的。Java FTP Client Libraries Reviewed中比较明确指出了每个库文件支持的FTP标准到底是SFTP还是FTPS。<br /><br />库的“文件传输性能标准”比较表是基于两种传输标准的。第一种标准描述的是传输一个大型文件的速度并标明数据通过网络传输到对方的时间。第二种标准用来测量传输许多小型文件的速度，并指明该库用于连接服务端的时间。在根据具体的应用程序选择最合适的文件时，这两种标准会起到帮助。例如：在为视频传输的应用中应以该库的传输大数据的得分为标准，而为那些用户和FTP服务器进行许多交互的应用上，就该以其传输许多小数据的得分为标准。<br /><br /><b><span style="FONT-SIZE: 16px">试验</span></b><br /><br />试验常用的测量方法列在后面：在FTP服务器端创建一个大文件和许多小文件，这些文件（大文件和小文件）是用来分别测量服务器传输大文件和小文件的速度的。这些数据的数量和大小被设计成相同的数据量。而且是采用两台相似的机器通过TCP/IP网络协议进行测试的。为了保证测试数据的正确性，在测试过程中任何其他的网络传输都被排斥在外了。而且，为了保证所测数据均匀分布，我做了10次测量，再取其平均值。<br /><br />试验的设置如下：传输数据量是10MB。所以，大文件大小就是10MB。小文件大小是1K，数量是10000。网络测量单位是10 Mbits/s Ethernet network。客户端是IBM的VisualAge for Java4.0，系统是windows xp. 服务器端是RedHat Linux Fedora Core 2.服务器软件是vsFTDd for Linux。结果，其测试代码Java FTP Client Libraries Reviewed内有详细描述，也可以到Resources进行下载。<br /><br />为了重现试验，你可以根据以下操作进行测试：从Resources下载测试代码，Benchmark.java。测试代码实现了Benchmark 类，这个类中包含了许多的内部类。每个内部类都为各个库实现了文件传输操作。可以通过编译运行该程序来测试放在classpath下的库。可执行程序只接受一个参数：工作空间地址的路径。这个地址必须包含一个main.config文件，这个文件中包含了配置参数。一个简单的配置文件main.config可以从Resources下载。执行之后，会产生出一个测量结果文件，其中的测量结果用逗号分隔。该文件可以在工作空间中找到。这个文件可以用电子表格软件来打开，比如微软的Excel。<br /><br /><b><span style="FONT-SIZE: 16px">结果</span></b><br /><br />根据试验协议和设定，我得到了分别针对大文件和小文件传输的两组测量数据。每组测量都显式为独立的图表。所有的库都在左边，他们传输速度以单杠形式显式在右边。为了提供绝对比例的测量，传输速度是用传输时间的倒数乘以最短的传输时间。（就是一个百分比，最短传输时间/测量的传输时间，这样最快的就是100，其他的依此类推，有点类似于高考中的标准分的概念）。这样得到100分的就是最快的库，我也显示了WIN XP FTP命令行的FTP测量速度。<br /><br />在大文件传输测试图中（图1），你可以发现许多的库都拥有比较高的速度，他们之间的差距比较小。所以，大部分的库比较适合传输大型数据文件。这些库的记录工作没有任何的优化。许多库的传输速度也许得益于优化的操作。最典型的优化方法是：设置通讯连接input/output 数组的长度。因此，最佳优化后的库可以在相同的速度下传输大块的数据。（也就是说，通过优化，设置input,output的数组长度——也就是缓冲区，那么即使是相同的速度下，可以传输大数据，即这样优化后对传输大数据有利）<br /><br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="" src="http://www.matrix.org.cn/resource/upload/forum/2006_06_14_224905_AeclvUXbth.gif" onload="javascript:imgLoad(this);" border="0" resized="0" /><br />Figure 1. Large-file transfer speed <br /><br />小文件传输测试图（图2）显示EnterpriseDT's edtFTPj, Calvin Tai's FtpBean, and Glub Tech's Secure FTP Bean的性能比其他库更优越，甚至比WIN XP FTP命令行的速度还高。在SUN 的JDK中有一个明显的BUG，就是在下载了200个文件之后，JDK拒绝传输，提示内存错误。在图表中，我只对前200个传输进行了统计。而分数最低的原因是因为每个download操作都需要新建一个新的connection来进行打开和关闭操作。这种引入连接方式是针对单个文件传输的。总之，JDK架设的FTP只适合下载文件数量较少的情况。<br /><br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="" src="http://www.matrix.org.cn/resource/upload/forum/2006_06_14_225135_StPPULkAfe.gif" onload="javascript:imgLoad(this);" border="0" resized="0" /><br />Figure 2. Small-file transfer speed<br /><br />回顾一下每个库的特性，点击here可以得到比较的列表。库的名字显示在最上面，标准出现在左边，每个单元的的缩写在每个表格中的关键字中有解释。<br /><br /><b><span style="FONT-SIZE: 16px">总结</span></b><br />这篇文章是建立于我以前在JavaWorld发表的文章"Java FTP Client Libraries Reviewed"上的，并且是用于研究JAVA平台上对FTP的支持。在性能方面，对大文件的传输结果比较相似。对于小文件传输测试，EnterpriseDT's edtFTPj, Calvin Tai's FtpBean,和Glub Tech's Secure FTP Bean是最好的选择，然而SUN的JDK需要解决下载数不能超过200个文件的BUG。关于其他方面的测试，可以查阅测试比较列表。<br /><br />由于很多的第三方库都支持FTP RFC959，开发者可以根据自己的需求选择最有效率的库了。然而，使用第三方库会增加程序的复杂度。例如一个APPLET被配置在客户端，可能需要下载到服务器端。如果JDK完全的支持FTP的话，那么就不会出现这种隐藏的复杂度问题了。<br /><br />为了使JDK完全的支持FTP，一个RFE已经被提交到了Sun Developer Network Bug Database了，在一个不断成长的社区30个月持续不断的支持下，为该REF投票的人数已经从最初的8个人增长到88个人，使得这个RFE成了最高的25个RFE之一。然而，直到我写这篇文章的时候，SUN的工程师还没有解决该RFE，也没有公布该RFE的解决时刻表。<br /><br />同时，Java FTP API标准化项目组织也支持FTP RFE，这个项目组织的目标是将支持该RFE的社区的成员集合起来，从而提供在JAVA平台上可用资源。这个项目也努力的召集一个专家组向JCP提交相关的JSR。这个JSR将会以JAVA平台标准实现RFC959协议，从而实现对FTP的完全支持。然而，这个专家组还没有成型，而且提交该JSR成为标准的时间还没有确定。总之，让JAVA平台支持FTP的特性是有好处的。<br /><br /><b>资源</b><br />Matrix:<a href="http://www.matrix.org.cn/" target="_new">http://www.matrix.org.cn</a><br />Javaworld:<a href="http://www.javaworld.com/" target="_new">http://www.javaworld.com</a><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/56371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-07-03 16:32 <a href="http://www.blogjava.net/wuxufeng8080/articles/56371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP编程：获取相同名称Checkbox值</title><link>http://www.blogjava.net/wuxufeng8080/articles/55941.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 30 Jun 2006 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/55941.html</guid><description><![CDATA[
		<h2 class="diaryTitle">                                      </h2>
		<p>
		</p>
		<p>
				<font size="2">&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />&lt;%@ page import="java.io.*"%&gt;<br />&lt;%@ page import="java.util.*"%&gt;<br />&lt;%@ page import="java.lang.String.*"%&gt;</font>
		</p>
		<p>
				<font size="2">&lt;%<br />if(request.getParameter("submit")!=null)<br />{<br /> String checkbox[]=request.getParameterValues("checkbox");<br /> if (checkbox!=null)<br /> {<br />  //int size=java.lang.reflect.Array.getLength(checkbox);<br />  int size=checkbox.length;<br />  out.println("您选中了" + size + "项，分别为：&lt;br&gt;");<br />  for (int i=0;i&lt;size;i++)<br />  {<br />   out.println(checkbox[i]+"&lt;br&gt;");<br />  }<br /> }<br />}<br />%&gt;</font>
		</p>
		<p>
				<font size="2">&lt;form name=form1 action="" method=post&gt;<br />&lt;script langauge=javascript&gt;<br />for(i=0;i&lt;20;i++)<br />{<br />document.writeln("&lt;input type=checkbox name=checkbox value=\""+ i +"\"&gt;&lt;label for=checkbox" + i + "&gt;选择"+ i +"&lt;/label&gt;&lt;br&gt;");<br />}<br />&lt;/script&gt;<br />&lt;br&gt;<br />&lt;input type=submit value="提交" name="submit"&gt;<br />&lt;/form&gt; </font>
		</p>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/55941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-06-30 13:33 <a href="http://www.blogjava.net/wuxufeng8080/articles/55941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javascript 删除确认</title><link>http://www.blogjava.net/wuxufeng8080/articles/55577.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 28 Jun 2006 09:54:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/55577.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/55577.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/55577.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/55577.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/55577.html</trackback:ping><description><![CDATA[&lt;input name="Submit" type="submit" class="inputedit" value="删除" onclick="{if(confirm('确定纪录吗?')){this.document.formname.submit();return true;}return false;}"&gt;     <br />    <br /> onClick="javascript:window.print()"    <br />    <br />        onClick="javascript:window.location='admin.asp'"    <br />    <br />        onClick="javascript:window.history.go(-1)"    <br />    <br />        onClick="javascript:window.close()"    <br />   <br />        &lt;a href="contract_add_save.asp?contract_id=&lt;%=contr_rs(0)%&gt;&amp;submit=%C9%BE%B3%FD" onclick="{if(confirm('确定删除（&lt;%=contr_rs(2)%&gt;）吗?')){this.document.formname.submit();return true;}return false;}"&gt;删除&lt;/a&gt;    <br />  <br />自动关闭  <br /> &lt;script LANGUAGE="JavaScript"&gt;  <br />&lt;!--  <br />setTimeout('window.close();', 3000);  <br />// --&gt;  <br />&lt;/script&gt; <br />新开一个面页 <br />&lt;script src=javascript:window.open('http://com.smt.cn/lostpwd1.asp')&gt; <br />提示后打开一个页面 <br />&lt;a href="http://com.smt.cn/rg.asp" target="_blank"  title="点击查看客户给您的留言"  onClick="javascript:alert('您是免费会员，无权查看客户给您的留言！\n如需升级请联系&lt;%=linktel%&gt;　&lt;%=linkname%&gt;\n点击确定会后列出资费列表，请查看您所需要服务等级！');"&gt;  <br /><br /><div class="code"><font face="Verdana">&lt;input name="按钮" type="button" ID="ok" onclick="{if(confirm('确定删除吗?')){window.location='Action.asp?Action=Del&amp;TableName=Item&amp;ID=&lt;%=ID%&gt;';return true;}return false;}" value="删除栏目" /&gt;   </font></div><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/55577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-06-28 17:54 <a href="http://www.blogjava.net/wuxufeng8080/articles/55577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最精简的复选框(checkbox)全选代码</title><link>http://www.blogjava.net/wuxufeng8080/articles/55524.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 28 Jun 2006 05:27:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/55524.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/55524.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/55524.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/55524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/55524.html</trackback:ping><description><![CDATA[
		<div align="left">
				<span class="browword12">如果想看程序运行效果，请先点击阅读全文，然后再点击代码即可.<br /><br /><div class="HtmlCode" title="点击运行该代码！" style="CURSOR: pointer" onclick="preWin=window.open('','','');preWin.document.open();preWin.document.write(this.innerText);preWin.document.close();" ;="">&lt;input type=checkbox name=chk&gt;<br />&lt;input type=checkbox name=chk&gt;<br />&lt;input type=checkbox name=chk&gt;<br />&lt;input type=checkbox name=chk&gt;<br />&lt;input type=checkbox name=chk&gt;<br />&lt;br&gt;<br />全选：&lt;input type=checkbox onclick=sel('chk')&gt;<br />&lt;script language="javascript"&gt;<br /> function sel(a){ <br />  o=document.getElementsByName(a) <br />  for(i=0;i&lt;o.length;i++) <br />  o[i].checked=event.srcElement.checked <br /> }<br />&lt;/script&gt;</div></span>
		</div>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/55524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-06-28 13:27 <a href="http://www.blogjava.net/wuxufeng8080/articles/55524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX框架汇总</title><link>http://www.blogjava.net/wuxufeng8080/articles/55494.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 28 Jun 2006 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/55494.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/55494.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/55494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/55494.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/55494.html</trackback:ping><description><![CDATA[
		<p>此文原出于<a href="http://www.ajaxpatterns.org/AJAXFrameworks" target="_blank">AJAX Patterns网站的一篇《Ajax Frameworks》的wiki文章</a>，很早前我就注意到，后来在国内也有人翻译了，不过最近发现此wiki还是在不断添加维护中，截止此文发布前，作者又添加了好几个新诞生的AJAX开发工具，所以我决定重新翻译一遍，并且时常注意原文发布状态，一有新的内容立马也翻译过来，做到同步:)</p>
		<p>此翻译稿很大一部分内容出自<a href="http://www.baidu.com/baidu?word=AJAX%B5%C4%D3%A6%D3%C3%B3%CC%D0%F2%BC%DC%B9%B9%BB%E3%D7%DC&amp;tn=myie2dg" target="_blank">国内出现的那个先前版本</a>，我只是对新加入的几项进行了翻译，并且对我熟悉的产品项着重介绍了一下，以后我会抽时间收集文中提到AJAX工具相关的文章，尽量将内容介绍和功能点评做到全面详细点。所以请关注和准备用AJAX做开发的朋友关注这篇文章，我会时常更新的。原文因为是由一个wiki系统维护，所以在所难免出现参差不齐，风格上也有不统一的情况，翻译时我也是参照原文原封不动的挪了过来，以后我会抽时间改良下。</p>
		<h1>翻译正文</h1>
		<p>基于浏览器的应用框架一般分为两种： </p>
		<ul>
				<li>Aplication frameworks:提供了浏览器功能，但其最著名的还是在于通过窗口生成组件建立桌面GUI。 
</li>
				<li>Infrastructural frameworks:提供基本的框架功能和轻便式浏览器端操作，让开发者去创建具体应用，主要功能包括： 
<ul><li>基于XMLHttpRequest组件的浏览器交互功能 
</li><li>XML解析和操作功能 
</li><li>根据XMLHttpRequest的返回信息进行相应的DOM操作 
</li><li>一些特殊情况下，和其他的浏览器端技术如Flash（或Java Applets）等集合到一起应用 </li></ul></li>
		</ul>
		<p>基于服务器端的应用框架通常以下面两种方式工作(尽管它们根据不同的语言进行了分类) </p>
		<ul>
				<li>HTML/JS Generation(HTML/JS生成)：通过服务器端生成HTML和JS代码在传递给浏览器端进行直接运行 
</li>
				<li>远程交互：JavaScript调用服务器端函数(例如调用Java函数)并返回给JavaScript的回调句柄，或者请求服务器端数据信息，例如Session信息，数据库查询等。 </li>
		</ul>
		<h1>目录</h1>
		<dt>
		</dt>
		<div style="MARGIN: 5px">
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#1">1 Pure Javascript: Application Frameworks</a>
		</div>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#1.1">1.1 Bindows</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#1.2">1.2 BackBase</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#1.3">1.3 DOJO</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#1.4">1.4 Open Rico</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#1.5">1.5 qooxdoo</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#1.6">1.6 Tibet</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#1.7">1.7 AJFORM</a>
		</dd>
		<dt>
		</dt>
		<div style="MARGIN: 5px">
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#2">2 Pure Javascript: Infrastructural Frameworks</a>
		</div>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#2.1">2.1 AjaxCaller</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#2.2">2.2 Flash JavaScript Integration Kit </a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#2.3">2.3 Google AJAXSLT</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#2.4">2.4 HTMLHttpRequest</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#2.5">2.5 Interactive Website Framework </a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#2.6">2.6 LibXMLHttpRequest</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#2.7">2.7 MAJAX</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#2.8">2.8 RSLite</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#2.9">2.9 Sack</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#2.10">2.10 Sarissa</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#2.11">2.11 XHConn</a>
		</dd>
		<dt>
		</dt>
		<div style="MARGIN: 5px">
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#3">3 Server-Side: Multi-Language</a>
		</div>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#3.1">3.1 Cross-Platform Asynchronous INterface Toolkit</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#3.2">3.2 SAJAX</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#3.3">3.3 Javascipt Object Notation (JSON) and JSON-RPC</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#3.4">3.4 Javascript Remote Scripting (JSRS)</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#3.5">3.5 Bitkraft for ASP.NET</a>
		</dd>
		<dt>
		</dt>
		<div style="MARGIN: 5px">
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#4">4 Server-Side: Java</a>
		</div>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#4.1">4.1 WebORB for Java</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#4.2">4.2 Echo 2</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#4.3">4.3 Direct Web Remoting (DWR)</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#4.4">4.4 SWATO</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#4.5">4.5 AJAX JSP Tag Library</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#4.6">4.6 AJAX Java Server Faces Framework</a>
		</dd>
		<dt>
		</dt>
		<div style="MARGIN: 5px">
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#5">5 Server-Side: Lisp</a>
		</div>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#5.1">5.1 CL-Ajax</a>
		</dd>
		<dt>
		</dt>
		<div style="MARGIN: 5px">
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#6">6 Server-Side: .NET</a>
		</div>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#6.1">6.1 WebORB for .NET</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#6.2">6.2 Ajax.NET</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#6.3">6.3 ComfortASP.NET</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#6.4">6.4 AjaxAspects</a>
		</dd>
		<dt>
		</dt>
		<div style="MARGIN: 5px">
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#7">7 Server-Side: PHP</a>
		</div>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#7.1">7.1 AjaxAC</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#7.2">7.2 JPSpan</a>
		</dd>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#7.3">7.3 XAJAX</a>
		</dd>
		<dt>
		</dt>
		<div style="MARGIN: 5px">
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#8">8 Server-Side: Ruby</a>
		</div>
		<dd>
				<a href="http://blog.csdn.net/baggio785/archive/2006/05/21/747753.aspx#8.1">8.1 Ruby On Rails</a>
				<p> </p>
				<h1>1. <a name="1"></a>Pure Javascript: Application Frameworks</h1>
				<h3>1.1 <a name="1.1"></a>Bindows (成立于2003年)</h3>
				<p>
						<a href="http://www.bindows.net/" target="_blank">Bindows</a>是一个通过DHTML、JavaScript、CSS和HTML等技术强劲联合起来的一套完整的Windows桌面式的WEB应用程序解决方案。Bindows无需下载安装客户端支撑组件（如Java、ActiveX或Flash），仅需一个浏览器。纯OO的理念体现在Bindows任何地方，Bindows或许是笔者见过的最完整最强大的AJAX应用程序平台。 <br />Bindows是商业程序的，使用了来自于MB的技术(总部位于GA USA，主要开发中心在瑞典，成立于2002年)。</p>
				<p>Bindows框架提供的功能和特性有： </p>
				<ul>
						<li>基于面相对象技术的类和API 
</li>
						<li>一套完整的Windows桌面系统，支持各种特性窗口模式，包括菜单、表单、表格、滑动条、测量仪器窗口和其他一些Windows窗口特性支持。 
</li>
						<li>是开发zero-footprint(零空间占用)SOA客户端应用程序首选工具包 
</li>
						<li>本机的XML，SOAP和XML-RPC支持 
</li>
						<li>单用户到企业级开发的支持 
</li>
						<li>内建的完美的AJAX支持 </li>
				</ul>
				<p>Bindows开发环境： </p>
				<ul>
						<li>支持企业级规模的项目开发 
</li>
						<li>跨浏览器、跨OS平台的支持 
</li>
						<li>不受服务器结构限制 
</li>
						<li>良好的与新的、现有的资源互操作性 
</li>
						<li>统一的开发接口 </li>
				</ul>
				<p> </p>
				<h3>1.2 <a name="1.2"></a>BackBase (成立于2003年)</h3>
				<p>
						<a href="http://www.backbase.com/" target="_blank">BackBase</a>是一个完整的浏览器端框架，提供了丰富的浏览器操作功能，以及对.NET和JAVA平台的集成。 <br />商业化产品，来自于Backbase B.V(总部在Amsterdam，成立于2003年)。 </p>
				<p> </p>
				<h3>1.3 <a name="1.3"></a>DOJO (开发中,成立于2004年9月) </h3>
				<p>DOJO提供完整的轻量级窗口组件和浏览器-服务器消息映射支持</p>
				<ul>
						<li>提供创建自定义Javascript窗口组件的框架支持 
</li>
						<li>预制的丰富的窗口类型库 
</li>
						<li>B/S消息映射支持——XMLHttpRequest和其他机制 
</li>
						<li>支持浏览器中的URL操纵功能 
</li>
						<li>开源许可(<a href="http://opensource.org/licenses/afl-2.1.php" target="_blank">Academic Free License 2.1</a>)，由<a href="http://www.jot.com/" target="_blank">JotSpot</a>的<a href="http://alex.dojotoolkit.org/" target="_blank">Alex Russell</a>所领导。 </li>
				</ul>
				<h3>1.4 <a name="1.4"></a>Open Rico (开发中;成立于2005年5月;基于早期的一个proprietary 框架) </h3>
				<p>
						<a href="http://openrico.org/demos.page" target="_blank">Open Rico</a>是一个支持Ajax架构和用户交互的多用途框架。 </p>
				<ul>
						<li>一个XMLHttpRequest response能被一个或多个的DOM对象，或者Javascript对象调用。 
</li>
						<li>支持拖拽操作 
</li>
						<li>支持基于AJAX的动画模式，如缩放和变换等 
</li>
						<li>基于Behaviors的操作库 
</li>
						<li>
								<a href="http://www.mirimar.net/mailbrowser/" target="_blank">使用指南</a>，由RussMirimar的Yonah提供 
</li>
						<li>开源。源于Sabre航空公司解决方案，由<a href="http://looksgoodworkswell.blogspot.com/" target="_blank">Bill Scott</a>，Darren James及另外一些人维护。 </li>
				</ul>
				<p> </p>
				<h3>1.5 <a name="1.5"></a>qooxdoo (开发中; 成立于2005年5月) </h3>
				<p>
						<a href="http://qooxdoo.sourceforge.net/" target="_blank">qooxdoo</a>，是另一个发展迅猛的应用框架，提供广泛的UI支持，正在开发基础架构等特性。 </p>
				<ul>
						<li>基础结构特性： 
<ul><li>能轻易的捕获和操纵DOM事件 
</li><li>支持调试 
</li><li>支持一个时间操作的Timer类 
</li><li>Getter/Setter支持 </li></ul></li>
						<li>UI: 
<ul><li>窗口组件库和框架 
</li><li>界面布局管理 
</li><li>图像缓存和透明PNG图片处理 </li></ul></li>
						<li>开源(LGPL). </li>
				</ul>
				<h3>
						<a name="1.6">
						</a>1.6 Tibet (开发中; 创建于2005年6月)</h3>
				<p>
						<a href="http://www.technicalpursuit.com/" target="_blank">Tibet</a>提供了大量的易移植和完整的JavaScript API，通过这些可以快速生成大量的客户端代码，Tibet自称是企业级AJAX。</p>
				<ul>
						<li>远程脚本调用封装在XMLHttpRequest中 
</li>
						<li>URI支持 
</li>
						<li>支持所有的HTTP事件，不再仅仅是GET和POST 
</li>
						<li>低级的协议-File://和WebDav也可以当作HTTP正常使用 
</li>
						<li>Web Services调用支持，包括SOAP、XML-RPC等等 
</li>
						<li>大型的Javascript对象库 
</li>
						<li>多种多样的XML操作支持 
</li>
						<li>IDE和开发工具 
</li>
						<li>开源协议(OSI) </li>
				</ul>
				<h3>
						<a name="1.7">
						</a>1.7 AJFORM (创建于2005年6月)</h3>
				<p>
						<a href="http://redredmusic.com/brendon/ajform/" target="_blank">AJFORM</a>是一个极易上手的AJAX框架，被用来编写入门级的AJAX代码，提供有以下功能：</p>
				<ul>
						<li>三步安装 
</li>
						<li>自动支持任意HTML表单元素 
</li>
						<li>几乎无需编码即可实现AJAX </li>
				</ul>
				<h1>
						<a name="2">
						</a>2 Pure Javascript: Infrastructural Frameworks</h1>
				<h3>
						<a name="2.1">
						</a>2.1 AjaxCaller(创建于2005年5月，目前是Alpha版)</h3>
				<p>
						<a href="http://ajaxify.com/run/testAjaxCaller/" target="_blank">AjaxCaller</a>是一个具有多线程安全访问的XMLHttpRequest组件，主要针对Ajax开发新手，目前仍处于alpha开发阶段，仅在<a href="http://www.ajaxpatterns.org/" target="_blank">AjaxPatterns</a>的在线搜索范例中使用了这个程序。 </p>
				<ul>
						<li>用明文或者XML结构的数据实现和服务器的交互(GET/POST/PUT/DELETE) 
</li>
						<li>支持XMLHttRequest对象的构析(销毁对象，C++支持内存对象的构析操作) 
</li>
						<li>支持Response的高速缓存(尚在计划中) 
</li>
						<li>简单的库文件代码易于新手学习使用，并且支持脚本调试 
</li>
						<li>开源协议 </li>
				</ul>
				<h3>
						<a name="2.2">
						</a>2.2 Flash JavaScript Integration Kit</h3>
				<p>
						<a href="http://www.osflash.org/doku.php?id=flashjs" target="_blank">The Flash JavaScript Integration Kit</a>可以使Flash和Javascript脚本实现相互集成。</p>
				<ul>
						<li>可以实现在JavaScript中调用Flash ActionScript脚本，反之亦然。 
</li>
						<li>几乎支持双方主要数据类型的在不同环境中的传递调用。 
</li>
						<li>开源协议，有几个Flash开源爱好者维护。 </li>
				</ul>
				<h3>
						<a name="2.3">
						</a>2.3 Google AJAXSLT (2005年6月发行) </h3>
				<p>
						<a href="http://goog-ajaxslt.sourceforge.net/" target="_blank">Google AJAXSLT</a>，是一个Javascript框架，用来执行XSLT转换以及XPath查询。</p>
				<ul>
						<li>目前在Google Map上就使用了这个。 
</li>
						<li>开源协议(BSD) </li>
				</ul>
				<h3>
						<a name="2.4">
						</a>2.4 HTMLHttpRequest(Beta版；创建于2005年)</h3>
				<p>
						<a href="http://www.twinhelix.com/javascript/htmlhttprequest/" target="_blank">HtmlHttpRequest</a>最大的特点就是运用XMLHttpRequest对象和标准HTML标签IFrame来实现最大限度的跨浏览跨平台的AJAX支持，其原理是在支持XMLHttpRequest的浏览器上调用XMLHttp，如果不支持，就用IFrame来模拟实现异步交互。</p>
				<ul>
						<li>目前支持的浏览器：IE6/Win, IE5.5/Win, IE5/Win, IE4/Win, Mozilla/Win, Opera7/Win, Safari/Mac, IE5/Mac 
</li>
						<li>尚未测试的浏览器：IE4/Mac, Mozilla/Mac, Opera/Other, Konqueror/Linux。 
</li>
						<li>开源协议(LGPL) </li>
				</ul>
				<h3>
						<a name="2.5">
						</a>2.5 Interactive Website Framework (创建于2005年)</h3>
				<p>
						<a href="http://sourceforge.net/projects/iwf/" target="_blank">Interactive Website Framework</a>定位在浏览器中支持各种各样的AJAX基础应用的开源项目。自称是通过JavaScript、CSS、XML和HTML实现高性能的交互式WEB框架，包括一个可定制易读的XML解析器。实际上，IWF是一个AJAX的基础框架，并且还包括一些通用脚本代码。</p>
				<ul>
						<li>实现了线程安全的XMLHttpRequest 
</li>
						<li>对XML Document进行封装，以便创建更具有可读性的代码：<br /><blockquote>var node = doc.groceries.frozen[0].pizza[0].size;</blockquote>封装后的数据读取 
<blockquote>var node = doc.documentElement.firstChild.firstChild.getAttribute("size");</blockquote>原始的DOM操作读取 
</li>
						<li>开源协议 </li>
				</ul>
				<h3>
						<a name="2.6">
						</a>2.6 LibXMLHttpRequest (2003年6月发布) </h3>
				<p>
						<a href="http://www.whitefrost.com/servlet/connector?file=reference/2003/06/17/libXmlRequest.html" target="_blank">libXmlRequest</a>是一个小型XMLHttpRequest封装包</p>
				<ul>
						<li>用getXML()和postXML()两个事件简化XMLHttpReuqest调用 
</li>
						<li>支持XMLHttpRequest对象池 
</li>
						<li>Response缓存处理 
</li>
						<li>源码可以使用，但是有版权保护。 </li>
				</ul>
				<h3>
						<a name="2.7">
						</a>2.7 MAJAX </h3>
				<p>
						<a href="http://unips.sourceforge.net/devblog/?page_id=2" target="_blank">MAJAX</a>是另一个非常小巧的HttpRequest封装包，为收发字符型信息提供简单接口，并为每步动作设置回调界面。</p>
				<h3>
						<a name="2.8">
						</a>2.8 RSLite (x) </h3>
				<p>
						<a href="http://www.ashleyit.com/rs/main.htm" target="_blank">RSLite</a>是一个XMLHttpRequest封装组件，作为Brent Ashley的JSRS(JavaScript Remote Scripting)其中的一部分功能单独发布。详情可以看JSRS的介绍</p>
				<h3>
						<a name="2.9">
						</a>2.9 Sack(开发中，成立于2005年5月) </h3>
				<p>
						<a href="http://twilightuniverse.com/2005/05/sack-of-ajax/" target="_blank">Sack</a>也是一个很有名字的微型XMLHttpRequest封装包。调用者可以自定义回调函数或者是DOM对象。借助于回调DOM对象，可以把Response回来的数据直接以文本的方式嵌入DOM中。</p>
				<h3>
						<a name="2.10">
						</a>2.10 Sarissa (发布于2003年2月)</h3>
				<p>
						<a href="http://sarissa.sf.net/" target="_blank">Sarissa</a>是一个JavaScript API，封装了在浏览器端独立调用XML的功能。</p>
				<ul>
						<li>可移植的XMLHttpRequest对象创造 
</li>
						<li>可移植的XPath查询 
</li>
						<li>可移植的DOM操控 
</li>
						<li>可移植的XSLT 
</li>
						<li>可移植的XML序列化 
</li>
						<li>开源协议(GPL2.0和LGPL2.1) </li>
				</ul>
				<h3>
						<a name="2.11">
						</a>2.11 XHConn (2005年4月发布)</h3>
				<p>
						<a href="http://xkr.us/code/javascript/XHConn/" target="_blank">XHConn</a>也是一个小型的XMLHttpRequest封装库。笔者也使用改良过的XHConn，其特点就是调用简单，代码也清晰易读。</p>
				<ul>
						<li>例子： 
<blockquote>new XHConn().connect("mypage.php"，"POST"，"foo=bar&amp;baz=qux"，fnWhenDone);</blockquote></li>
						<li>开源协议许可 </li>
				</ul>
				<h1>
						<a name="3">
						</a>3 Server-Side: Multi-Language</h1>
				<h3>
						<a name="3.1">
						</a>3.1 Cross-Platform Asynchronous INterface Toolkit (2005年5月) </h3>
				<p>
						<a href="http://cpaint.sourceforge.net/" target="_blank">CPAINT</a>是一个真正的同时支持PHP和ASP/VBScript脚本的AJAX和JSRS工具包。CPAINT在后台提供你需求的AJAX和JSRS代码，并自动返回到浏览器端相应的Javascript脚本代码，这种方式易于实时反馈需求的WEB应用程序。</p>
				<ul>
						<li>支持PHP和ASP 
</li>
						<li>所有功能函数都在统一的JavaScript文件中 
</li>
						<li>支持远程脚本和XML 
</li>
						<li>支持本地和远程函数调用 
</li>
						<li>可以创建单个或多个XMLHttp对象 
</li>
						<li>返回给后台的数据即可以是文本也可以是XML/DOM文档对象 
</li>
						<li>支持POST和GET 
</li>
						<li>用服务端代理的方式实现远程函数和数据的访问操作 
</li>
						<li>大部分浏览器中测试正常使用 
</li>
						<li>在GNU、GPL、LGPL开源协议保护下发行 </li>
				</ul>
				<h3>
						<a name="3.2">
						</a>3.2 SAJAX (2005年3月) </h3>
				<p>
						<a href="http://www.modernmethod.com/sajax/" target="_blank">SAJAX</a>的实现方式很独特，例如：调用一个javascript方法x_calculateBudget()，将先把响应传到服务器并调用一个Java calculateBudget()方法，然后以javascript方式把值返回到x_calculateBudget_cb()中。SAJAX的名气不错，估计很多人都听过甚至用过，不过缺点就是它的这套映射理论感觉较繁锁，远不如一些轻量级的封装库好用，不过SAJAX最大的特点就是支持的平台丰富，几乎囊括了WEB下常用的编程语言和平台</p>
				<ul>
						<li>很方便从JavaScript函数映射到服务端代理操作 
</li>
						<li>支持多种平台(ASP/ColdFusion/Io/Lua/Perl/PHP/Python/Ruby) 
</li>
						<li>开源协议 </li>
				</ul>
				<h3>
						<a name="3.3">
						</a>3.3 Javascipt Object Notation (JSON) and JSON-RPC </h3>
				<p>
						<a href="http://www.crockford.com/JSON/index.html" target="_blank">JSON</a>是一个"face-free" XML，而<a href="http://www.json-rpc.org/" target="_blank">JSON-RPC</a>是一种远程交互协议，类似于XML-RPC，对JavaScript支持较强</p>
				<ul>
						<li>
								<a href="http://www.json-rpc.org/impl.xhtml" target="_blank">支持多服务端平台</a>: Java, Python, Ruby, Perl. 
</li>
						<li>针对不同的平台有不同的包和许可协议, 如<a href="http://oss.metaparadigm.com/jsonrpc/" target="_blank">JSON-RPC-Java</a>. </li>
				</ul>
				<h3>
						<a name="3.4">
						</a>3.4 JavaScript Remote Scripting(JSRS)(2000年) </h3>
				<p>
						<a href="http://www.ashleyit.com/rs/jsrs/test.htm" target="_blank">JSRS</a>，较经典的远程脚本访问组件，支持将客户端数据通过服务器做代理进行远程的数据/操作交互。</p>
				<ul>
						<li>支持的浏览器：IE4+，NS4.x，NS6.x，Mozilla，Opera7和Galeon。 
</li>
						<li>服务器端脚本语言支持：ASP，ColdFusion，PerlCGI，PHP,Python和JSP(servlet)。 
</li>
						<li>开源协议。由<a href="http://www.ashleyit.com/" target="_blank">Brent Ashley</a>提供支持。 </li>
				</ul>
				<h3>
						<a name="3.5">
						</a>3.5 Bitkraft for ASP.NET </h3>
				<p>
						<a href="http://www.tiggrbitz.com/" target="_blank">Bitkraft</a>是个基于(.NET)Web框架的CLR(公共语言运行库)，允许用独特的方式创建和操作分布式Web内容。用C#编写，运行在微软的.NET 1.1和Mono框架下，无缝式的客户端-服务器响应方式是它的最大特点。Bitkraft没有使用XML组织数据，而是用JSON代替。</p>
				<ul>
						<li>支持的浏览器： IE5+, Firefox1+, NS6 
</li>
						<li>服务器端要求：ASP.NET, Mono XSP, Cassini, Apache (modMono) .NET Framework 1.1+ 
</li>
						<li>事件驱动 
</li>
						<li>支持同步和异步的远程代理 
</li>
						<li>客户端支持所有的.NET类型或自定义类对象映射到JSON中 
</li>
						<li>用JSON取代XML 
</li>
						<li>免费，开源许可协议 </li>
				</ul>
				<h1>
						<a name="4">
						</a>4 Server-Side: Java </h1>
				<h3>
						<a name="4.1">
						</a>4.1 WebORB for Java (2005年8月) </h3>
				<p>
						<a href="http://www.themidnightcoders.com/weborb/aboutWeborb.htm" target="_blank">WebORB for Java</a>是一个开发AJAX和基于Flash的富客户端应用程序的开发平台。<a href="http://www.themidnightcoders.com/examples" target="_blank">在线例子</a></p>
				<ul>
						<li>WebORB包括一个富客户端开发类库。提供简单的在线式API用来绑定或者调用任何Java对象、XML Web Services和EJB 
</li>
						<li>支持异步或同步的事件驱动 
</li>
						<li>不需要在服务端修改任何代码，不需要自定义方法或属性、变量等。不要求设计时指定代理等。 
</li>
						<li>同步调用不需要回调，异步调用需要一个回调方法。 
</li>
						<li>客户端可以向服务端请求指定的活动方式，不需要任何编程就可以把处理结果轻易的转变为状态。 
</li>
						<li>提供一个特定API来处理数据库查询结果-服务器代码能返回DataSet或者DataTable，而客户端以一个类似于RecordSet的JavaScript对象来显示这个结果。该对象提供检索列名和行数据的方法。 
</li>
						<li>支持数据分页技术。客户应用程序能检索页面中的数据。 
</li>
						<li>支持以参数的方式返回所有服务期端数据类型，如primitives, strings, complex types, arrays, native .net collections, remote references 
</li>
						<li>目前有两个版本：标准版(免费)，专业版(商业许可) </li>
				</ul>
				<h3>
						<a name="4.2">
						</a>4.2 Echo 2 (2005年3月) </h3>
				<p>
						<a href="http://www.nextapp.com/products/echo2/" target="_blank">Echo 2</a>允许你用纯Java语言编写AJAX程序。 <a href="http://demo.nextapp.com/InteractiveTest/ia" target="_blank">Demo</a>. </p>
				<ul>
						<li>自动生成HTML和Javascript代码 
</li>
						<li>用XML在客户端-服务端传递消息 
</li>
						<li>如果愿意支持自定义Javascript组件 
</li>
						<li>开源协议(Mozilla Public License or GNU LGPL) </li>
				</ul>
				<h3>
						<a name="4.3">
						</a>4.3 Direct Web Remoting (DWR) (2005) </h3>
				<p>
						<a href="http://www.getahead.ltd.uk/dwr/" target="_blank">Direct Web Remoting</a>可以在Javascript代码中直接调用Java方法的应用框架</p>
				<ul>
						<li>类似于SAJAX，可以把Javascript中的请求调用转递到Java方法中并将执行结果返回给Javascript 
</li>
						<li>可以和任何Web框架一起使用，如Struts、Tapestry等等 
</li>
						<li>开源(Apache)，目前该产品被加入到<a href="http://www.huihoo.com/web/ajax/%20//www.opensymphony.com/webwork/" target="_blank">WebWork</a>中 </li>
				</ul>
				<h3>
						<a name="4.4">
						</a>4.4 SWATO (2005) </h3>
				<p>
						<a href="http://swato.dev.java.net/" target="_blank">SWATO</a>是一套可重用的和良好集成的Java/JavaScript库，它实现了一种更容易的方式来改变你的web应用程序的交互，通过AJAX方式实现。</p>
				<ul>
						<li>服务端Java库可以非常容易的部署到所有Servlet2.3+兼容的容器中 
</li>
						<li>客户端Javascript库可以在所有支持XMLHttpRequest的浏览器中使用 
</li>
						<li>使用JSON技术在服务端组织POJO数据，这样你可以在任何Javascript环境中(HTML、XUL、SVG)访问这些远程数据，这种方式很容易通过硬编码或者某种成熟的Javascript库集成到当前应用中 
</li>
						<li>提供一个简单接口使你能在Javascript中调用远程的POJO数据 
</li>
						<li>使用&lt;servlet&gt;和&lt;filter&gt;灵活的在web.xml中进行配置，并且可以集成(不是必须)到你的Spring框架中 
</li>
						<li>提供了几个可帮助你快速开发web应用程序的组件(如自动完成的文本框，在线表单，在线列表等等) </li>
				</ul>
				<h3>
						<a name="4.5">
						</a>4.5 AJAX JSP Tag Library </h3>
				<p>
						<a href="http://ajaxtags.sourceforge.net/" target="_blank">The AJAX JSP Tag Library</a>是一组JSP标签库，用来AJAX程序开发。可以在J2EE下无需Javascript就能轻松开发AJAX模式的Web Form。标签库为比较通用的AJAX功能提供了5个标签：</p>
				<ul>
						<li>autocomplete: 用户在文本框中输入字符，自动从指定的数据中匹配用户输入的字符，类似于Google Suggest 
</li>
						<li>callout:可以为A标签加入气泡式的消息提示框，不过是实时的服务端取出数据 
</li>
						<li>Select/dropdown:类似于联动菜单，比如地州市的联动下拉框 
</li>
						<li>toggle:开关闸按钮，比如在一个hidden表单域中存储true和falsh，同时显示相应的img图像 
</li>
						<li>update field:更新数据，也就是无刷新提交了。 </li>
				</ul>
				<h3>
						<a name="4.6">
						</a>4.6 AJAX Java Server Faces Framework </h3>
				<p>
						<a href="http://smirnov.org.ru/en/ajax-jsf.html" target="_blank">The AJAX-JSF</a>用来把任意的JSF应用程序转变为AJAX应用程序</p>
				<ul>
						<li>
								<a href="http://smirnov.org.ru/myfaces-ajax/ajax.jsf" target="_blank">例子</a>：AJAX组件的 MyFaces JSF Tree(树型目录), table scroller(可滚动的表格), tabbed pane(分页栏) 
</li>
						<li>开源协议(<a href="http://www.apache.org/licenses/LICENSE-2.0.html" target="_blank">Apache Software License</a>) </li>
				</ul>
				<h1>
						<a name="5">
						</a>Server-Side: Lisp </h1>
				<h3>
						<a name="5.1">
						</a>5.1 CL-Ajax </h3>
				<p>
						<a href="http://cliki.net/cl-ajax" target="_blank">CL-Ajax</a>实现Javascript直接调用服务端Lisp</p>
				<ul>
						<li>生成可带参数的函数 
</li>
						<li>可以回调Javascript函数或者DOM对象 
</li>
						<li>可以集成到SAJAX中 
</li>
						<li>开源许可 </li>
				</ul>
				<h1>
						<a name="6">
						</a>6 Server-Side: .NET </h1>
				<h3>
						<a name="6.1">
						</a>6.1 WebORB for .NET (2005年8月) </h3>
				<p>
						<a href="http://www.themidnightcoders.com/weborb/aboutWeborb.htm" target="_blank">WebORB for .NET</a>是一个用.NET和XML Web Services方式开发AJAX和基于Flash的富客户端应用程序(<a href="http://www.themidnightcoders.com/examples" target="_blank">在线例子</a>) </p>
				<ul>
						<li>WebORB包括一个富客户端开发类库。提供简单的在线式API用来绑定或者调用任何.NET对象、XML Web Services 
</li>
						<li>支持异步或同步的事件驱动 
</li>
						<li>不需要在服务端修改任何代码，不需要自定义方法或属性、变量等。不要求设计时指定代理等。 
</li>
						<li>同步调用不需要回调，异步调用需要一个回调方法。 
</li>
						<li>客户端可以向服务端请求指定的活动方式，不需要任何编程就可以把处理结果轻易的转变为状态。 
</li>
						<li>提供一个特定API来处理数据库查询结果-服务器代码能返回DataSet或者DataTable，而客户端以一个类似于RecordSet的JavaScript对象来显示这个结果。该对象提供检索列名和行数据的方法。 
</li>
						<li>支持数据分页技术。客户应用程序能检索页面中的数据。 
</li>
						<li>支持以参数的方式返回所有服务期端数据类型，如primitives, strings, complex types, arrays, native .net collections, remote references 
</li>
						<li>目前有两个版本：标准版(免费)，专业版(商业许可) </li>
				</ul>
				<h3>
						<a name="6.2">
						</a>6.2 Ajax.NET (2005年3月) </h3>
				<p>
						<a href="http://ajax.schwarz-interactive.de/" target="_blank">Ajax.NET</a>是首家支持各种方式通过Javascript访问服务端.net的免费库</p>
				<ul>
						<li>类似于SAJAX，能把Javascript请求发送到.NET方法，服务端回传给Javascript，甚至包括串行化自定义类。 
</li>
						<li>可以在Javascript中访问Session和Application数据 
</li>
						<li>缓存查询结果 
</li>
						<li>免费使用源代码 
</li>
						<li>无需更改源代码，允许给Ajax.NET添加和修改方法和属性 
</li>
						<li>所有类支持Javascript客户端返回数据，可以在JavaScript中使用DataSet：res.Tables[0].Rows 
</li>
						<li>使用HtmlControls组件访问和返回数据 
</li>
						<li>页面无需重载，用事件代理(数据访问层) 
</li>
						<li>因为只提供一个调用接口方法，所以服务端CPU占用非常少 </li>
				</ul>
				<h3>
						<a name="6.3">
						</a>6.3 ComfortASP.NET (2005年8月) </h3>
				<p>
						<a href="http://www.daniel-zeiss.de/ComfortASP/" target="_blank">ComfortASP.NET</a>可以让开发者在纯.NET下开发类似AJAX(DHTML,JavaScript,XMLHttp)特性的应用程序。</p>
				<ul>
						<li>快速应答 
</li>
						<li>减少HTML传输 
</li>
						<li>减少页面重载 
</li>
						<li>无闪烁的浏览器内容更改 
</li>
						<li>AJAX用户体验， </li>
				</ul>
				<h3>
						<a name="6.4">
						</a>6.4 AjaxAspects (2005年8月) </h3>
				<p>
						<a href="http://ajaxaspects.blogspot.com/" target="_blank">AjaxAspects</a>是个可以用Javascript调用服务端WebService事件的引擎</p>
				<ul>
						<li>用标准的SOAP和WSDL进行服务端-客户端通信 
</li>
						<li>用简单的类型和XML对象支持带参数的返回值 
</li>
						<li>缓存支持 
</li>
						<li>动作队列 
</li>
						<li>免费使用，开源协议 </li>
				</ul>
				<h1>
						<a name="7">
						</a>7 Server-Side: PHP </h1>
				<h3>
						<a name="7.1">
						</a>7.1 AjaxAC (2005年4月) </h3>
				<p>
						<a href="http://ajax.zervaas.com.au/" target="_blank">AjaxAC</a>用一个单独类封装了完整的应用程序功能</p>
				<ul>
						<li>所有的功能集成在自包含的类中(另外附带一些Javascript库) 
</li>
						<li>调用PHP文件或者HTML页面非常简易，只需创建App类后把类引用传递给需要调用的Javascript对象或者HTML元素即可。 
</li>
						<li>捕获Javascript事件 
</li>
						<li>可以自定义配置数据，并且支持运行时参数更改 
</li>
						<li>无需再Javascript代码中夹杂凌乱的Html代码，所有事件都是被动态附加上的 
</li>
						<li>由于以上两个优点，所以支持良好的模版引擎 
</li>
						<li>容易Hook到PHP类和MySql数据已返回给自己的request 
</li>
						<li>能够容易的用Javascript建立窗口模式应用程序。 </li>
				</ul>
				<h3>
						<a name="7.2">
						</a>7.2 JPSpan </h3>
				<p>
						<a href="http://jpspan.sourceforge.net/wiki/doku.php" target="_blank">JPSPAN</a>通过Javascript直接调用PHP中的函数。</p>
				<ul>
						<li>进行了严谨的单元测试 
</li>
						<li>开源许可(PHP) </li>
				</ul>
				<h3>
						<a name="7.3">
						</a>7.3 XAJAX </h3>
				<p>
						<a href="http://xajax.sf.net/" target="_blank">XAjax</a>通过Javascript直接调用PHP中的函数</p>
				<ul>
						<li>支持用Javascript调用PHP脚本 
</li>
						<li>开源许可协议 </li>
				</ul>
				<h1>
						<a name="8">
						</a>8 Server-Side: Ruby </h1>
				<h3>
						<a name="8.1">
						</a>8.1 Ruby On Rails </h3>
				<p>
						<a href="http://www.rubyonrails.org/" target="_blank">Ruby On Rails</a>是一个支持AJAX的完整Web框架，使用Ruby语言编写，严格按照MVC结构开发。</p>
				<ul>
						<li>当Ajax出现的时候Rails还处于其发展的早期，因此Ajax可能逐渐成为Rails框架的核心。 
</li>
						<li>生成浏览器中大多数/全部的Window应用组件和动画的Javascript脚本。 
</li>
						<li>支持服务器端调用。 
</li>
						<li>队列支持 
</li>
						<li>开源许可 </li>
				</ul>
				<p>引自：http://www.huihoo.com/web/ajax/ajax-frameworks.html</p>
		</dd>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/55494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-06-28 11:18 <a href="http://www.blogjava.net/wuxufeng8080/articles/55494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jspSmartUpload上传下载全攻略</title><link>http://www.blogjava.net/wuxufeng8080/articles/55276.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Tue, 27 Jun 2006 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/55276.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/55276.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/55276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/55276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/55276.html</trackback:ping><description><![CDATA[
		<span class="t18">
				<span class="myp11">
						<font id="zoom">
								<b>一、安装篇</b>
								<br />
								<br />　　jspSmartUpload是由www.jspsmart.com网站开发的一个可免费使用的全功能的文件上传下载组件，适于嵌入执行上传下载操作的JSP文件中。该组件有以下几个特点： <br /><br />1、使用简单。在JSP文件中仅仅书写三五行JAVA代码就可以搞定文件的上传或下载，方便。 <br /><br />2、能全程控制上传。利用jspSmartUpload组件提供的对象及其操作方法，可以获得全部上传文件的信息（包括文件名，大小，类型，扩展名，文件数据等），方便存取。 <br /><br />3、能对上传的文件在大小、类型等方面做出限制。如此可以滤掉不符合要求的文件。 <br /><br />4、下载灵活。仅写两行代码，就能把Web服务器变成文件服务器。不管文件在Web服务器的目录下或在其它任何目录下，都可以利用jspSmartUpload进行下载。 <br /><br />5、能将文件上传到<a href="http://www.knowsky.com/sql.asp">数据库</a>中，也能将数据库中的数据下载下来。这种功能针对的是MYSQL数据库，因为不具有通用性，所以本文不准备举例介绍这种用法。 <br /><br />　　jspSmartUpload组件可以从www.jspsmart.com网站上自由下载，压缩包的名字是jspSmartUpload.zip。下载后，用WinZip或<a href="http://www.knowsky.com/article.asp?typeid=66">WinRAR</a>将其解压到Tomcat的webapps目录下（本文以Tomcat服务器为例进行介绍）。解压后，将webapps/jspsmartupload目录下的子目录Web-inf名字改为全大写的WEB-INF，这样一改jspSmartUpload类才能使用。因为Tomcat对文件名大小写敏感，它要求Web应用程序相关的类所在目录为WEB-INF，且必须是大写。接着重新启动Tomcat，这样就可以在JSP文件中使用jspSmartUpload组件了。 <br /><br />　　注意，按上述方法安装后，只有webapps/jspsmartupload目录下的程序可以使用jspSmartUpload组件，如果想让Tomcat服务器的所有Web应用程序都能用它，必须做如下工作： <br /><br />1．进入命令行状态，将目录切换到Tomcat的webapps/jspsmartupload/WEB-INF目录下。 <br /><br />2．运行JAR打包命令：jar cvf jspSmartUpload.jar com <br /><br />（也可以打开资源管理器，切换到当前目录，用WinZip将com目录下的所有文件压缩成jspSmartUpload.zip，然后将jspSmartUpload.zip换名为jspSmartUpload.jar文件即可。） <br /><br />3．将jspSmartUpload.jar拷贝到Tomcat的shared/lib目录下。 <br /><br /><b>二、相关类说明篇</b><br /><br /><b>㈠ File类</b><br /><br />　　这个类包装了一个上传文件的所有信息。通过它，可以得到上传文件的文件名、文件大小、扩展名、文件数据等信息。 <br /><br />　　File类主要提供以下方法： <br /><br />1、saveAs作用：将文件换名另存。 <br /><br />原型： <br /><br />public void saveAs(java.lang.String destFilePathName) <br /><br />或 <br /><br />public void saveAs(java.lang.String destFilePathName, int optionSaveAs) <br /><br />其中，destFilePathName是另存的文件名，optionSaveAs是另存的选项，该选项有三个值，分别是SAVEAS_PHYSICAL,SAVEAS_VIRTUAL，SAVEAS_AUTO。SAVEAS_PHYSICAL表明以操作系统的根目录为文件根目录另存文件，SAVEAS_VIRTUAL表明以Web应用程序的根目录为文件根目录另存文件，SAVEAS_AUTO则表示让组件决定，当Web应用程序的根目录存在另存文件的目录时，它会选择SAVEAS_VIRTUAL，否则会选择SAVEAS_PHYSICAL。 <br /><br />例如，saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)执行后若Web服务器安装在C盘，则另存的文件名实际是c:\upload\sample.zip。而saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)执行后若Web应用程序的根目录是webapps/jspsmartupload，则另存的文件名实际是webapps/jspsmartupload/upload/sample.zip。saveAs("/upload/sample.zip",SAVEAS_AUTO)执行时若Web应用程序根目录下存在upload目录，则其效果同saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)，否则同saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)。 <br /><br />建议：对于Web程序的开发来说，最好使用SAVEAS_VIRTUAL，以便移植。 <br /><br />2、isMissing <br /><br />作用：这个方法用于判断用户是否选择了文件，也即对应的表单项是否有值。选择了文件时，它返回false。未选文件时，它返回true。 <br /><br />原型：public boolean isMissing() <br /><br />3、getFieldName <br /><br />作用：取HTML表单中对应于此上传文件的表单项的名字。 <br /><br />原型：public String getFieldName() <br /><br />4、getFileName <br /><br />作用：取文件名（不含目录信息） <br /><br />原型：public String getFileName() <br /><br />5、getFilePathName <br /><br />作用：取文件全名（带目录） <br /><br />原型：public String getFilePathName <br /><br />6、getFileExt <br /><br />作用：取文件扩展名（后缀） <br /><br />原型：public String getFileExt() <br /><br />7、getSize <br /><br />作用：取文件长度（以字节计） <br /><br />原型：public int getSize() <br /><br />8、getBinaryData <br /><br />作用：取文件数据中指定位移处的一个字节，用于检测文件等处理。 <br /><br />原型：public byte getBinaryData(int index)。其中，index表示位移，其值在0到getSize()-1之间。 <br /><br /><b>㈡ Files类</b><br /><br />　　这个类表示所有上传文件的集合，通过它可以得到上传文件的数目、大小等信息。有以下方法： <br /><br />1、getCount <br /><br />作用：取得上传文件的数目。 <br /><br />原型：public int getCount() <br /><br />2、getFile <br /><br />作用：取得指定位移处的文件对象File（这是com.jspsmart.upload.File，不是java.io.File，注意区分）。 <br /><br />原型：public File getFile(int index)。其中，index为指定位移，其值在0到getCount()-1之间。 <br /><br />3、getSize <br /><br />作用：取得上传文件的总长度，可用于限制一次性上传的数据量大小。 <br /><br />原型：public long getSize() <br /><br />4、getCollection <br /><br />作用：将所有上传文件对象以Collection的形式返回，以便其它应用程序引用，浏览上传文件信息。 <br /><br />原型：public Collection getCollection() <br /><br />5、getEnumeration <br /><br />作用：将所有上传文件对象以Enumeration（枚举）的形式返回，以便其它应用程序浏览上传文件信息。 <br /><br />原型：public Enumeration getEnumeration() <br /><br /><b>㈢ Request类</b><br /><br />　　这个类的功能等同于JSP内置的对象request。只所以提供这个类，是因为对于文件上传表单，通过request对象无法获得表单项的值，必须通过jspSmartUpload组件提供的Request对象来获取。该类提供如下方法： <br /><br />1、getParameter <br /><br />作用：获取指定参数之值。当参数不存在时，返回值为null。 <br /><br />原型：public String getParameter(String name)。其中，name为参数的名字。 <br /><br />2、getParameterValues <br /><br />作用：当一个参数可以有多个值时，用此方法来取其值。它返回的是一个字符串数组。当参数不存在时，返回值为null。 <br /><br />原型：public String[] getParameterValues(String name)。其中，name为参数的名字。 <br /><br />3、getParameterNames <br /><br />作用：取得Request对象中所有参数的名字，用于遍历所有参数。它返回的是一个枚举型的对象。 <br /><br />原型：public Enumeration getParameterNames() <br /><br /><b>㈣ SmartUpload类</b>这个类完成上传下载工作。 <br /><br /><b>A．上传与下载共用的方法：</b><br /><br />只有一个：initialize。 <br /><br />作用：执行上传下载的初始化工作，必须第一个执行。 <br /><br />原型：有多个，主要使用下面这个： <br /><br />public final void initialize(javax.servlet.jsp.PageContext pageContext) <br /><br />其中，pageContext为JSP页面内置对象（页面上下文）。 <br /><br /><b>B．上传文件使用的方法：</b><br /><br />1、upload <br /><br />作用：上传文件数据。对于上传操作，第一步执行initialize方法，第二步就要执行这个方法。 <br /><br />原型：public void upload() <br /><br />2、save <br /><br />作用：将全部上传文件保存到指定目录下，并返回保存的文件个数。 <br /><br />原型：public int save(String destPathName) <br /><br />和public int save(String destPathName,int option) <br /><br />其中，destPathName为文件保存目录，option为保存选项，它有三个值，分别是SAVE_PHYSICAL,SAVE_VIRTUAL和SAVE_AUTO。（同File类的saveAs方法的选项之值类似）SAVE_PHYSICAL指示组件将文件保存到以操作系统根目录为文件根目录的目录下，SAVE_VIRTUAL指示组件将文件保存到以Web应用程序根目录为文件根目录的目录下，而SAVE_AUTO则表示由组件自动选择。 <br /><br />注：save(destPathName)作用等同于save(destPathName,SAVE_AUTO)。 <br /><br />3、getSize <br /><br />作用：取上传文件数据的总长度 <br /><br />原型：public int getSize() <br /><br />4、getFiles <br /><br />作用：取全部上传文件，以Files对象形式返回，可以利用Files类的操作方法来获得上传文件的数目等信息。 <br /><br />原型：public Files getFiles() <br /><br />5、getRequest <br /><br />作用：取得Request对象，以便由此对象获得上传表单参数之值。 <br /><br />原型：public Request getRequest() <br /><br />6、setAllowedFilesList <br /><br />作用：设定允许上传带有指定扩展名的文件，当上传过程中有文件名不允许时，组件将抛出异常。 <br /><br />原型：public void setAllowedFilesList(String allowedFilesList) <br /><br />其中，allowedFilesList为允许上传的文件扩展名列表，各个扩展名之间以逗号分隔。如果想允许上传那些没有扩展名的文件，可以用两个逗号表示。例如：setAllowedFilesList("doc,txt,,")将允许上传带doc和txt扩展名的文件以及没有扩展名的文件。 <br /><br />7、setDeniedFilesList <br /><br />作用：用于限制上传那些带有指定扩展名的文件。若有文件扩展名被限制，则上传时组件将抛出异常。 <br /><br />原型：public void setDeniedFilesList(String deniedFilesList) <br /><br />其中，deniedFilesList为禁止上传的文件扩展名列表，各个扩展名之间以逗号分隔。如果想禁止上传那些没有扩展名的文件，可以用两个逗号来表示。例如：setDeniedFilesList("exe,bat,,")将禁止上传带exe和bat扩展名的文件以及没有扩展名的文件。 <br /><br />8、setMaxFileSize <br /><br />作用：设定每个文件允许上传的最大长度。 <br /><br />原型：public void setMaxFileSize(long maxFileSize) <br /><br />其中，maxFileSize为为每个文件允许上传的最大长度，当文件超出此长度时，将不被上传。 <br /><br />9、setTotalMaxFileSize <br /><br />作用：设定允许上传的文件的总长度，用于限制一次性上传的数据量大小。 <br /><br />原型：public void setTotalMaxFileSize(long totalMaxFileSize) <br /><br />其中，totalMaxFileSize为允许上传的文件的总长度。 <br /><br /><b>C．下载文件常用的方法</b><br /><br />1、setContentDisposition <br /><br />作用：将数据追加到MIME文件头的CONTENT-DISPOSITION域。jspSmartUpload组件会在返回下载的信息时自动填写MIME文件头的CONTENT-DISPOSITION域，如果用户需要添加额外信息，请用此方法。 <br /><br />原型：public void setContentDisposition(String contentDisposition) <br /><br />其中，contentDisposition为要添加的数据。如果contentDisposition为null，则组件将自动添加"attachment;"，以表明将下载的文件作为附件，结果是IE浏览器将会提示另存文件，而不是自动打开这个文件（IE浏览器一般根据下载的文件扩展名决定执行什么操作，扩展名为doc的将用word程序打开，扩展名为pdf的将用acrobat程序打开，等等）。 <br /><br />2、downloadFile <br /><br />作用：下载文件。 <br /><br />原型：共有以下三个原型可用，第一个最常用，后两个用于特殊情况下的文件下载（如更改内容类型，更改另存的文件名）。 <br /><br />① public void downloadFile(String sourceFilePathName) <br /><br />其中，sourceFilePathName为要下载的文件名（带目录的文件全名） <br /><br />② public void downloadFile(String sourceFilePathName,String contentType) <br /><br />其中，sourceFilePathName为要下载的文件名（带目录的文件全名）,contentType为内容类型（MIME格式的文件类型信息，可被浏览器识别）。 <br /><br />③ public void downloadFile(String sourceFilePathName,String contentType,String destFileName) <br /><br />其中，sourceFilePathName为要下载的文件名（带目录的文件全名）,contentType为内容类型（MIME格式的文件类型信息，可被浏览器识别）,destFileName为下载后默认的另存文件名。 <br /><br /><b>三、文件上传篇</b><br /><br /><b>㈠ 表单要求</b><br /><br />对于上传文件的FORM表单，有两个要求： <br /><br />1、METHOD应用POST，即METHOD="POST"。 <br /><br />2、增加属性：ENCTYPE="multipart/form-data" <br /><br />下面是一个用于上传文件的FORM表单的例子： <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;FORM METHOD="POST" ENCTYPE="multipart/form-data" 
ACTION="/jspSmartUpload/upload.jsp"&gt;
&lt;INPUT TYPE="FILE" NAME="MYFILE"&gt;
&lt;INPUT TYPE="SUBMIT"&gt;
&lt;/FORM&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><b>㈡ 上传的例子</b><br /><br /><b>1、上传页面upload.html</b><br /><br />本页面提供表单，让用户选择要上传的文件，点击"上传"按钮执行上传操作。 <br /><br />页面源码如下： <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;!--
    文件名：upload.html
	作  者：纵横软件制作中心雨亦奇(zhsoft88@sohu.com)
--&gt;
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;文件上传&lt;/title&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="center"&gt;上传文件选择&lt;/p&gt;
&lt;FORM METHOD="POST" ACTION="jsp/do_upload.jsp"
ENCTYPE="multipart/form-data"&gt;
&lt;input type="hidden" name="TEST" value="good"&gt;
  &lt;table width="75%" border="1" align="center"&gt;
    &lt;tr&gt; 
      &lt;td&gt;&lt;div align="center"&gt;1、 
          &lt;input type="FILE" name="FILE1" size="30"&gt;
        &lt;/div&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt; 
      &lt;td&gt;&lt;div align="center"&gt;2、 
          &lt;input type="FILE" name="FILE2" size="30"&gt;
        &lt;/div&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt; 
      &lt;td&gt;&lt;div align="center"&gt;3、 
          &lt;input type="FILE" name="FILE3" size="30"&gt;
        &lt;/div&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt; 
      &lt;td&gt;&lt;div align="center"&gt;4、 
          &lt;input type="FILE" name="FILE4" size="30"&gt;
        &lt;/div&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt; 
      &lt;td&gt;&lt;div align="center"&gt;
          &lt;input type="submit" name="Submit" value="上传它！"&gt;
        &lt;/div&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/FORM&gt;
&lt;/body&gt;
&lt;/html&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><b>2、上传处理页面do_upload.jsp</b><br /><br />本页面执行文件上传操作。页面源码中详细介绍了上传方法的用法，在此不赘述了。 <br /><br />页面源码如下： <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;%--
	文件名：do_upload.jsp
	作  者：纵横软件制作中心雨亦奇(zhsoft88@sohu.com)
--%&gt;
&lt;%@ page contentType="text/html; charset=gb2312" language="java" 
import="java.util.*,com.jspsmart.upload.*" errorPage="" %&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;文件上传处理页面&lt;/title&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;%
	// 新建一个SmartUpload对象
	SmartUpload su = new SmartUpload();
	// 上传初始化
	su.initialize(pageContext);
	// 设定上传限制
	// 1.限制每个上传文件的最大长度。
	// su.setMaxFileSize(10000);
	// 2.限制总上传数据的长度。
	// su.setTotalMaxFileSize(20000);
	// 3.设定允许上传的文件（通过扩展名限制）,仅允许doc,txt文件。
	// su.setAllowedFilesList("doc,txt");
	// 4.设定禁止上传的文件（通过扩展名限制）,禁止上传带有exe,bat,
	jsp,htm,html扩展名的文件和没有扩展名的文件。
	// su.setDeniedFilesList("exe,bat,jsp,htm,html,,");
	// 上传文件
	su.upload();
	// 将上传文件全部保存到指定目录
	int count = su.save("/upload");
	out.println(count+"个文件上传成功！&lt;br&gt;");
	
	// 利用Request对象获取参数之值
	out.println("TEST="+su.getRequest().getParameter("TEST")
	+"&lt;BR&gt;&lt;BR&gt;");

	// 逐一提取上传文件信息，同时可保存文件。
	for (int i=0;i&lt;su.getFiles().getCount();i++)
	{
		com.jspsmart.upload.File file = su.getFiles().getFile(i);
		
		// 若文件不存在则继续
		if (file.isMissing()) continue;

		// 显示当前文件信息
		out.println("&lt;TABLE BORDER=1&gt;");
		out.println("&lt;TR&gt;&lt;TD&gt;表单项名（FieldName）&lt;/TD&gt;&lt;TD&gt;"
		+ file.getFieldName() + "&lt;/TD&gt;&lt;/TR&gt;");
		out.println("&lt;TR&gt;&lt;TD&gt;文件长度（Size）&lt;/TD&gt;&lt;TD&gt;" + 
		file.getSize() + "&lt;/TD&gt;&lt;/TR&gt;");
		out.println("&lt;TR&gt;&lt;TD&gt;文件名（FileName）&lt;/TD&gt;&lt;TD&gt;" 
		+ file.getFileName() + "&lt;/TD&gt;&lt;/TR&gt;");
		out.println("&lt;TR&gt;&lt;TD&gt;文件扩展名（FileExt）&lt;/TD&gt;&lt;TD&gt;" 
		+ file.getFileExt() + "&lt;/TD&gt;&lt;/TR&gt;");
		out.println("&lt;TR&gt;&lt;TD&gt;文件全名（FilePathName）&lt;/TD&gt;&lt;TD&gt;"
		+ file.getFilePathName() + "&lt;/TD&gt;&lt;/TR&gt;");
		out.println("&lt;/TABLE&gt;&lt;BR&gt;");

		// 将文件另存
		// file.saveAs("/upload/" + myFile.getFileName());
		// 另存到以WEB应用程序的根目录为文件根目录的目录下
		// file.saveAs("/upload/" + myFile.getFileName(), 
		su.SAVE_VIRTUAL);
		// 另存到操作系统的根目录为文件根目录的目录下
		// file.saveAs("c:\\temp\\" + myFile.getFileName(), 
		su.SAVE_PHYSICAL);

	}
%&gt;
&lt;/body&gt;
&lt;/html&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><b>四、文件下载篇</b><br /><br /><b>1、下载链接页面download.html</b><br /><br />页面源码如下： <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;!--
		文件名：download.html
	作  者：纵横软件制作中心雨亦奇(zhsoft88@sohu.com)
--&gt;
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;下载&lt;/title&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;a href="jsp/do_download.jsp"&gt;点击下载&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><b>2、下载处理页面do_download.jsp</b> do_download.jsp展示了如何利用jspSmartUpload组件来下载文件，从下面的源码中就可以看到，下载何其简单。 <br /><br />源码如下： <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;%@ page contentType="text/html;charset=gb2312" 
import="com.jspsmart.upload.*" %&gt;&lt;%
		// 新建一个SmartUpload对象
	SmartUpload su = new SmartUpload();
		// 初始化
	su.initialize(pageContext);
		// 设定contentDisposition为null以禁止浏览器自动打开文件，
		//保证点击链接后是下载文件。若不设定，则下载的文件扩展名为
		//doc时，浏览器将自动用word打开它。扩展名为pdf时，
		//浏览器将用acrobat打开。
	su.setContentDisposition(null);
		// 下载文件
	su.downloadFile("/upload/如何赚取我的第一桶金.doc");
%&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>注意，执行下载的页面，在Java脚本范围外（即&lt;% ... %&gt;之外），不要包含HTML代码、空格、回车或换行等字符，有的话将不能正确下载。不信的话，可以在上述源码中%&gt;&lt;%之间加入一个换行符，再下载一下，保证出错。因为它影响了返回给浏览器的数据流，导致解析出错。</ccid_code><br /><br /><b>3、如何下载中文文件</b><br /><br />jspSmartUpload虽然能下载文件，但对中文支持不足。若下载的文件名中有汉字，则浏览器在提示另存的文件名时，显示的是一堆乱码，很扫人兴。上面的例子就是这样。（这个问题也是众多下载组件所存在的问题，很少有人解决，搜索不到相关资料，可叹！） <br /><br />为了给jspSmartUpload组件增加下载中文文件的支持，我对该组件进行了研究，发现对返回给浏览器的另存文件名进行UTF-8编码后，浏览器便能正确显示中文名字了。这是一个令人高兴的发现。于是我对jspSmartUpload组件的SmartUpload类做了升级处理，增加了toUtf8String这个方法，改动部分源码如下： <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>public void downloadFile(String s, String s1, String s2, int i)
	throws ServletException, IOException, SmartUploadException
    {
	if(s == null)
	    throw new IllegalArgumentException("File '" + s +
	    "' not found (1040).");
	if(s.equals(""))
	    throw new IllegalArgumentException("File '" + s +
	    "' not found (1040).");
	if(!isVirtual(s) &amp;&amp; m_denyPhysicalPath)
	    throw new SecurityException("Physical path is
	    denied (1035).");
	if(isVirtual(s))
	    s = m_application.getRealPath(s);
	java.io.File file = new java.io.File(s);
	FileInputStream fileinputstream = new FileInputStream(file);
	long l = file.length();
	boolean flag = false;
	int k = 0;
	byte abyte0[] = new byte[i];
	if(s1 == null)
	    m_response.setContentType("application/x-msdownload");
	else
	if(s1.length() == 0)
	    m_response.setContentType("application/x-msdownload");
	else
	    m_response.setContentType(s1);
	m_response.setContentLength((int)l);
	m_contentDisposition = m_contentDisposition != null ?
	m_contentDisposition : "attachment;";
	if(s2 == null)
	    m_response.setHeader("Content-Disposition", 
	    m_contentDisposition + " filename=" + 
	    toUtf8String(getFileName(s)));
	else
	if(s2.length() == 0)
	    m_response.setHeader("Content-Disposition", 
	    m_contentDisposition);
	else
	    m_response.setHeader("Content-Disposition", 
	    m_contentDisposition + " filename=" + toUtf8String(s2));
	while((long)k &lt; l)
	{
	    int j = fileinputstream.read(abyte0, 0, i);
	    k += j;
	    m_response.getOutputStream().write(abyte0, 0, j);
	}
	fileinputstream.close();
    }

    /**
     * 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名.
     * 纵横软件制作中心雨亦奇2003.08.01
     * @param s 原文件名
     * @return 重新编码后的文件名
     */
    public static String toUtf8String(String s) {
	StringBuffer sb = new StringBuffer();
	for (int i=0;i&lt;s.length();i++) {
	    char c = s.charAt(i);
	    if (c &gt;= 0 &amp;&amp; c &lt;= 255) {
		sb.append(c);
	    } else {
		byte[] b;
		try {
		    b = Character.toString(c).getBytes("utf-8");
		} catch (Exception ex) {
		    System.out.println(ex);
		    b = new byte[0];
		}
		for (int j = 0; j &lt; b.length; j++) {
		    int k = b[j];
		    if (k &lt; 0) k += 256;
		    sb.append("%" + Integer.toHexString(k).
		    toUpperCase());
		}
	    }
	}
	return sb.toString();
    }</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />注意源码中粗体部分，原jspSmartUpload组件对返回的文件未作任何处理，现在做了编码的转换工作，将文件名转换为UTF-8形式的编码形式。UTF-8编码对英文未作任何处理，对中文则需要转换为%XX的形式。toUtf8String方法中，直接利用Java语言提供的编码转换方法获得汉字字符的UTF-8编码，之后将其转换为%XX的形式。 <br /><br />将源码编译后打包成jspSmartUpload.jar，拷贝到Tomcat的shared/lib目录下（可为所有WEB应用程序所共享），然后重启Tomcat服务器就可以正常下载含有中文名字的文件了。另，toUtf8String方法也可用于转换含有中文的超级链接，以保证链接的有效，因为有的WEB服务器不支持中文链接。 <br /><br />小结：jspSmartUpload组件是应用JSP进行B/S程序开发过程中经常使用的上传下载组件，它使用简单，方便。现在我又为其加上了下载中文名字的文件的支持，真个是如虎添翼，必将赢得更多开发者的青睐。 <br /></font>
				</span>
		</span>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/55276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-06-27 10:42 <a href="http://www.blogjava.net/wuxufeng8080/articles/55276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Smartupload和commons-fileupload介绍与比较</title><link>http://www.blogjava.net/wuxufeng8080/articles/55273.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Tue, 27 Jun 2006 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/55273.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/55273.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/55273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/55273.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/55273.html</trackback:ping><description><![CDATA[
		<p>WEB文件上传可能是网站建设中最常用的功能之一，我在项目开发中几乎都需要实现文件上传功能．前段时间自己搜集了一些上传组件．这篇文章中将介绍这些组件的使用方法，并且比较各自的优劣．</p>
		<p>一，smartupload组件．</p>
		<p>我想只要做个文件上传的朋友都知道这个组件，我认识的人中使用最多的也是它！我刚到公司的时候，公司也使用的smartupload,这个组件上传相对较小的文件时是个不错的选择．下面给出个使用的例子：</p>
		<p>　　<br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.sql.*"%&gt;<br />&lt;%@ page import="com.jspsmart.upload.*" %&gt;</p>
		<p>&lt;%<br />   //实例化上载bean<br />    SmartUpload mySmartUpload=new SmartUpload();<br />    //初始化<br />    mySmartUpload.initialize(pageContext); <br />    //设置上载的最大值,注意:如果这里设置过大会出现问题!<br />    mySmartUpload.setMaxFileSize(500 * 1024*1024);<br />    //上载文件<br />    mySmartUpload.upload();<br />   //循环取得所有上载的文件<br />   for (int i=0;i&lt;mySmartUpload.getFiles().getCount();i++){<br />   //取得上载的文件<br />   com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);<br />   if (!myFile.isMissing())<br />    {<br />   //取得上载的文件的文件名<br />    String myFileName=myFile.getFileName();<br />    //取得不带后缀的文件名<br />    String  suffix=myFileName.substring(0,myFileName.lastIndexOf('.'));<br />    //取得后缀名<br />    String  ext= mySmartUpload.getFiles().getFile(0).getFileExt();  <br />    //取得文件的大小  <br />    int fileSize=myFile.getSize();<br />    //保存路径<br />    String aa=getServletContext().getRealPath("/")+"jsp\\";<br />    String trace=aa+myFileName;<br />    //取得别的参数<br />    String explain=(String)mySmartUpload.getRequest().getParameter("text");<br />    String send=(String)mySmartUpload.getRequest().getParameter("send");<br />    //将文件保存在服务器端 <br />    myFile.saveAs(trace,mySmartUpload.SAVE_PHYSICAL);<br />    %&gt;</p>
		<p>
				<br />但是使用smartupload上传过大文件，或者多文件的时候可能出现CPU或内存占用过高的问题．并且：只有重新启动容器才能恢复正常!这正是我最后我放弃了使用smartupload的原因．</p>
		<p>二，commons-fileupload组件</p>
		<p>这个组件是我现在使用的组件，下载地址：<a href="http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi">http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi</a>，包内包含了API文档．</p>
		<p>使用该组件的例子：</p>
		<p>&lt;%@ page language=“java”contentType=“text/html;charset=GBK”%&gt;<br />&lt;%@ page import=“java.util.*”%&gt;<br />&lt;%@ page import=“org.apache.commons.fileupload.*”%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;文件上传&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;%<br /> DiskFileUpload fu = new DiskFileUpload();<br /> // 设置允许用户上传文件大小,单位:字节<br /> fu.setSizeMax(10000000);<br /> // 设置最多只允许在内存中存储的数据,单位:字节<br /> fu.setSizeThreshold(4096);<br /> // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录<br /> fu.setRepositoryPath(“D:\\Tomcat5\\TEMP”);<br /> //开始读取上传信息<br /> List fileItems = fu.parseRequest(request);<br /> // 依次处理每个上传的文件<br /> Iterator iter = fileItems.iterator();<br /> while (iter.hasNext()) {<br />  FileItem item = (FileItem) iter.next();<br />  //忽略其他不是文件域的所有表单信息<br />  if (!item.isFormField()) {<br />   String name = item.getName();<br />   item.write(“D:\\UploadTest\\”+ name);<br /> }<br />}<br />%&gt;</p>
		<p>从上面的程序可以看出，该组件上传时候可以用了一个地方来存储临时文件，呆上传完成后直接把文件写过去．这样就不会占用过多的内存！而且该组件上传大文件的时候效率也不低哦！</p>
		<p>在这两个的对比选择中，我选择了后者，因为我做的项目中经常上传大于10M的文件，用前者的时候服务器几乎被整崩溃．</p>
		<p>不过,现在我已经不用这两种组件了,因为http方式传文件效率始终很低,我们现在使用的是web方式实现的ftp文件上传,我将在下篇文章中写我在项目中是如何实现的.</p>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/55273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-06-27 10:33 <a href="http://www.blogjava.net/wuxufeng8080/articles/55273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ExtremeTable</title><link>http://www.blogjava.net/wuxufeng8080/articles/54432.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Thu, 22 Jun 2006 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/54432.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/54432.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/54432.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/54432.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/54432.html</trackback:ping><description><![CDATA[
		<h1>ExtremeTable</h1>
		<p> Author: <a href="http://calvin.blogjava.net/" target="_blank">江南白衣  </a></p>
		<h2>0.概述</h2>
		<p>    Home Page:<a href="http://www.extremecomponents.org/">http://www.extremecomponents.org</a></p>
		<p>     Extreme Table是最功能强大而又容易配置,扩展,自定义的Table 控件。</p>
		<p>     最紧要的功能包括排序, 分页, 导出Excel, pdf和汇总。</p>
		<p>     springside的best 示例代码在: listBook.jsp和listOrder.jsp.</p>
		<p>基础读物: </p>
		<p>     1. <a href="http://extremecomponents.org/wiki/index.php/Main_Page" target="_blank">ExtremeTable自带的文档</a> .</p>
		<p>     2.<a href="http://extremecomponents.org/wiki/index.php/Simplified_Chinese" target="_blank">Luck翻译的ExtremeTable官方文档中文版</a>   </p>
		<h2>1. 安装</h2>
		<h3>1.1 安装原始版本</h3>
		<p>     1. 从<a href="http://www.extremecomponents.org/">http://www.extremecomponents.org</a> 下载最新版</p>
		<p>     2.把extremecomponents.jar 放入web-inf/lib</p>
		<p>     3.根据minum, 导出excel 或 导出pdf的需要，把/lib下的jar copy到web-inf/lib</p>
		<p>     4.把images里的图片放入web的任意目录</p>
		<p>     5.把css文件放到web的任意目录</p>
		<p>     6.在/source/org/extremecomponents/table/core目录找到extremetable.properties文件,把它复制到WEB-INF/classes里面并进行修改.</p>
		<p>     7.修改web.xml (见2)。</p>
		<h3> 0.2 复制SpringSide的样式</h3>
		<p>     1.Copy springside的Table Head的图，查。</p>
		<p>     2.将springside中的修改版extremecomponents.css文件放入任意目录</p>
		<p>     3.把/src/resource/extremetable.properties 复制到对应目录</p>
		<h3>0.3 使用Compact View很重要</h3>
		<p>     默认的式样不符合大家的审美，幸亏还有Compact View和css设置，让我们可以敬谢不敏它号称非常方便的HtmlView子类扩展。</p>
		<p>    1. 在全局设置里</p>
		<pre> 
table.view.html=org.extremecomponents.table.view.CompactView</pre>
		<p>    2.把images里/table/compact/*.gif copy 到 /table</p>
		<h2>2.全局属性配置</h2>
		<p>   ExtremeTable支持在properties文件里方便的统一配置丰富的全局属性</p>
		<p>  在/source/org/extremecomponents/table/core目录找到extremetable.properties文件,把它复制到WEB-INF/classes里面.</p>
		<p> 在web.xml里面增加</p>
		<pre>   &lt;context-param&gt;<br />        &lt;param-name&gt;extremecomponentsPreferencesLocation&lt;/param-name&gt;<br />        &lt;param-value&gt;/extremetable.properties&lt;/param-value&gt;<br />   &lt;/context-param&gt;</pre>
		<p>一般只写需要修改的文件:</p>
		<pre>table.filterable=false<br />table.imagePath=/images/table/*.gif<br />table.locale=zh_CN<br />table.view.html=org.extremecomponents.table.view.CompactView<br />row.highlightRow=true<br />column.format.date=yyyy-MM-dd<br />column.format.currency=###,###,###,###,#00.00<br /></pre>
		<h2>3.导出Excel</h2>
		<p>    注意Excel 导出的Tag已改为，且官方版不支持中文文件名。</p>
		<pre>    &lt;ec:exportXls fileName="BookList.xls" tooltip="导出 Excel"/&gt;</pre>
		<p>     ExtremeTable导出的一项重要特性是可以根据不同的View导出不同的列.</p>
		<p>     比如html管理界面可能只列出订单几个最重要的列，而导出excel时则需要导出所有的列。</p>
		<pre>&lt;ec:column property="orderdate" title="订单日期"  cell="date" format="yyyy-MM-dd"  viewsDenied= "html"/&gt;</pre>
		<p>     以上订单日期列在html view看不到，而excel,pdf view可以见到.</p>
		<p>    而"编辑图标"，"选择Checkbox"这些管理界面上的列，也可以设置不export到pdf,excel view</p>
		<h2>4.其他要点<br /></h2>
		<h3>4.1. 使用排序功能时,如果property为嵌套属性时,需要设置alias</h3>
		<p>          因为javascript的关系.</p>
		<pre>&lt;ec:column property="customer.name" title="客户名称" alias="customer"/&gt;</pre>
		<h3>4.2. Date Cell与NumberCell</h3>
		<p>     在全局属性定义:</p>
		<p>
		</p>
		<pre> column.format.date= yyyy-MM-dd
column.format.currency= ￥###,###,#00.00</pre>
		<p> </p>
		<pre>&lt;ec:column property="totalprice" title="总金额" cell="currency" width="80" /&gt;<br />&lt;ec:column property="shipdate" title="发货日期"  cell="date" width= "80"/&gt;</pre>
		<h3>4.3. 汇总</h3>
		<p>在column中加入两个cac属性，就会自动在table的底端显示汇总</p>
		<p>
		</p>
		<pre>&lt;ec:column property="totalprice" title="总金额" cell="number" format="###,###,##0.00" calc="total" calcTitle= "汇总:"/&gt;</pre>
		<h3>4.4 i18N</h3>
		<p>在Web.xml里面指定i18N的Properties文件</p>
		<pre>&lt;context-param&gt;<br />  &lt;param-name&gt;extremecomponentsMessagesLocation&lt;/param-name&gt;<br />  &lt;param-value&gt;messages&lt;/param-value&gt;<br />&lt;/context-param&gt;</pre>
		<pre>&lt;ec:column property="name" title="book.name"/&gt;</pre>
		<h3>4.5数据库分页</h3>
		<p> EC默认从数据库中查找所有记录然后由它来分页，如果查询结果较大，可以考虑使用数据库端分页的方案。</p>
		<p> 此时，EC会使用Limit对象向Controller传递PageNo,PageSize,OrderBy等分页信息。而服务端将向EC返回总记录数和当前页的内容，具体请参看 BookController。</p>
		<h3>4.6不显示导出excel及分页</h3>
		<p>最快的方式是设置table的showStatusBar= false</p>
		<pre>&lt;ec:table  items= "order.orderItems"var="item" action=""   showStatusBar= "false"&gt;</pre>
		<h3>    4.7ImagePath</h3>
		<p>  旧版EC包括其文档都在每个table tag里定义ImagePath, 新版已经可以自动插入ContextPath,只需在properties文件定义table.imagePath=/images/table/*.gif即可</p>
		<h2>5.自定义及扩展</h2>
		<p>   ExtremeTable比Display Tag的i一个就是良好的自定义和扩展能力，不用千人一面。<br />   不过，人总是懒的，虽然扩展子类很容易，但能不扩展就还是不可扩展了。幸亏用Compact View再改改CSS一般就能达到要求。</p>
		<h3> 5.1. 良好的CSS定义</h3>
		<p>         ExtremeTable 的CSS定义非常严谨, 并且提供很多个层次的修改方式:</p>
		<p>         1.直接修改css文件, 可以把table view改成任意样式</p>
		<p>         2.修改全局属性, 改变某种元素对应的css class名</p>
		<pre>table.styleClass=tableRegion</pre>
		<p>         3.在某个页面的row,column tag中定义class</p>
		<pre> &lt;ec:row style="" or styleClass=""/&gt;</pre>
		<p>        SpringSide采用层次1, 直接修改extremecomponents.css为合适的样式</p>
		<h3>5.2方便的&lt;tr&gt;&lt;td&gt;属性扩展</h3>
		<p>        row与column已提供了丰富的普通属性与 javascript属性如onClick(), 如果属性仍然未够,可自行扩展&lt;row&gt;与&lt;column&gt;tag ，并通过全局属性指定新的子类名。</p>
		<p>   为了方便大家在子类扩展属性, extreme Table提供了专门的回调函数与Util函数如</p>
		<pre>public void addColumnAttributes(Column column) {
   column.addAttribute("customAttributeOne", customAttributeOne);<br />}   

        
</pre>
		<p>详细请看手册,Table, Row,Column都提供相同的扩展:<br /><a href="http://extremecomponents.org/wiki/index.php/Column#Extended_Attributes">http://extremecomponents.org/wiki/index.php/Column#Extended_Attributes</a></p>
		<p>如果不是Extremetable的特别支持, 普通taglib class要扩展属性的话:<br />        1.定义真正的Java属性,setter,getter<br />        2. tld文件中声明新的属性 <br />        3.重载输出函数将新属性打印出来</p>
		<h3>5.3 扩展HTMLView,cell 等显示组件</h3>
		<p>     Extreme Table在这些类的扩展上放便很多，但这个版本里我还没有进行尝试，就不写了。请自行参考官方文档:<a href="http://extremecomponents.org/wiki/index.php/Html_View_Tutorial">http://extremecomponents.org/wiki/index.php/Html_View_Tutorial</a> .</p>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/54432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-06-22 10:33 <a href="http://www.blogjava.net/wuxufeng8080/articles/54432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP里request变量列表 </title><link>http://www.blogjava.net/wuxufeng8080/articles/54042.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Tue, 20 Jun 2006 10:06:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/54042.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/54042.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/54042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/54042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/54042.html</trackback:ping><description><![CDATA[
		<p>&lt;% <br />out.println("Protocol: " + request.getProtocol() + " "); <br />out.println("Scheme: " + request.getScheme() + " "); <br />out.println("Server Name: " + request.getServerName() + " " ); <br />out.println("Server Port: " + request.getServerPort() + " "); <br />out.println("Protocol: " + request.getProtocol() + " "); <br />out.println("Server Info: " + getServletConfig().getServletContext().getServerInfo() + " "); <br />out.println("Remote Addr: " + request.getRemoteAddr() + " "); <br />out.println("Remote Host: " + request.getRemoteHost() + " "); <br />out.println("Character Encoding: " + request.getCharacterEncoding() + " "); <br />out.println("Content Length: " + request.getContentLength() + " "); <br />out.println("Content Type: "+ request.getContentType() + " "); <br />out.println("Auth Type: " + request.getAuthType() + " "); <br />out.println("HTTP Method: " + request.getMethod() + " "); <br />out.println("Path Info: " + request.getPathInfo() + " "); <br />out.println("Path Trans: " + request.getPathTranslated() + " "); <br />out.println("Query String: " + request.getQueryString() + " "); <br />out.println("Remote User: " + request.getRemoteUser() + " "); <br />out.println("Session Id: " + request.getRequestedSessionId() + " "); <br />out.println("Request URI: " + request.getRequestURI() + " "); <br />out.println("Servlet Path: " + request.getServletPath() + " "); <br />out.println("Accept: " + request.getHeader("Accept") + " "); <br />out.println("Host: " + request.getHeader("Host") + " "); <br />out.println("Referer : " + request.getHeader("Referer") + " "); <br />out.println("Accept-Language : " + request.getHeader("Accept-Language") + " "); <br />out.println("Accept-Encoding : " + request.getHeader("Accept-Encoding") + " "); <br />out.println("User-Agent : " + request.getHeader("User-Agent") + " "); <br />out.println("Connection : " + request.getHeader("Connection") + " "); <br />out.println("Cookie : " + request.getHeader("Cookie") + " "); <br />out.println("Created : " + session.getCreationTime() + " "); <br />out.println("LastAccessed : " + session.getLastAccessedTime() + " "); <br /><br />%&gt; <br /><br />运行结果： <br /><br />Protocol: HTTP/1.1 <br />Scheme: http <br />Server Name: 192.168.0.1 <br />Server Port: 8080 <br />Protocol: HTTP/1.1 <br />Server Info: JavaServer Web Dev Kit/1.0 EA (JSP 1.0; Servlet 2.1; Java 1.2; Windows NT 5.0 x86; java.vendor=Sun Microsystems Inc.) <br />Remote Addr: 192.168.0.106 <br />Remote Host: abc <br />Character Encoding: null <br />Content Length: -1 <br />Content Type: null <br />Auth Type: null <br />HTTP Method: GET <br />Path Info: null <br />Path Trans: null <br />Query String: null <br />Remote User: null <br />Session Id: To1010mC466113890241879At <br />Request URI: /c.jsp <br />Servlet Path: /c.jsp <br />Accept: */* <br />Host: 192.168.0.1:8080 <br />Referer : null <br />Accept-Language : zh-cn <br />Accept-Encoding : gzip, deflate <br />User-Agent : Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) <br />Connection : Keep-Alive <br />Cookie : SESSIONID=To1010mC466113890241879At <br />Created : 965764522168 <br />LastAccessed : 965775587088。</p>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/54042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-06-20 18:06 <a href="http://www.blogjava.net/wuxufeng8080/articles/54042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSTL</title><link>http://www.blogjava.net/wuxufeng8080/articles/53827.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Mon, 19 Jun 2006 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/53827.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/53827.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/53827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/53827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/53827.html</trackback:ping><description><![CDATA[本文是 JSTL 系列的第二篇-- JSP 标准标签库.相关资源：JSP Standard Tag Libraries, Part 1（http://www.onjava.com/pub/a/onjava/2002/03/13/jsp.html）<br />  <br /><br />   此文中，我们将更详细地讲述不同标记描述文件（Tag Library Descriptor，TLD）里的各种标记。我们会通过例子去说明条件、迭代、URL、SQL及XML等标记的使用。文章的目的就是展示JSTL的主要功能，说明如何使用JSTL以及说明如何使用JSTL去改善JSP的开发。<br /><br />   简单来说，JSTL就是一套可以用在多个方面的自定义功能，JAVA标准组织（Java Community Process，JCP）在JSR-52里面定义到，JSTL提供表达式语言（expression language），流程控制及数据检校等功能，JSTL规范的最后版本可以在JCP的网站上找得到。<br /><br />   JSTL要求运行在支持JSP 1.2版的服务器上，JSTL的主旨就是简化JSP的开发以及提供访问、操作数据的简便方式，使用JSTL可以使用大家的工作更轻松。<br /><br />    JSTL包含了多个TLD和JAR文件，这些TLD覆盖很多功能，我们将一个个说明。首先，我们要重点说一下JSTL最突出的功能，表达式语言。<br /><br />    实际上，表达式语言是由JSR-152专家组所提供的，也就是定义JSP 2.0的专家组。JSR-152和JSR-52很多时是在一起工作的，更甚的是，表达式语言已经成为JSP 2.0的一部分。表达式语言提供访问数据的一种简便方法，它支持运算，支持bean，支持集合，同时也支持类型转换和属性的缺省值。<br /><br /><b>使用表达式语言</b><br /><br />   表达式语言是通过 ${expression} 这样的形式来调用的，并且它只能用在属性里面，例如：<br /><br /><pre class="overflow">&lt;c:if test="${product.price &gt;= customer.limit}"&gt;<br />...<br />&lt;/c:if&gt;</pre><br /><br />   在上面的例子，我们使用表达式语言做一个比较运算，它也可以混合一些静态文本，就象下面的例子：<br /><br /><pre class="overflow">&lt;c:forEach var="current"&gt;<br />        &lt;c:out value="Product-${current}"/&gt;<br />&lt;/c:forEach&gt;</pre><br /><br />   在例子里面，我们枚举出一个集合里面的元素，之后将它加在一个字符串后面输出，结果就象：<br /><br />Product-1<br />Product-2<br />Product-3...<br /><br />   从例子里可以看出，相对于以前的代码，使用JSTL之后，在整个过程变得简单清晰。在以前，你需要定义一个对象，要知道对象的类型，并且要掌握一些脚本语言，而这只是去完成一个简单的操作。<br /><br />   现在，有了JSTL，我们可以使用简单的语法去访问数据，表达式语言是非常适合做这样的工作的。<br /><br />   再举一个例子，我们可以将：<br /><br /><pre class="overflow">&lt;jsp:useBean id="customer" type="sample.Customer" scope="request"/&gt; ...<br />Customer Name: &lt;%=customer.getName()%&gt;<br />...<br />&lt;% if (customer.getState().equals("CO")){ %&gt;<br />...<br />&lt;%}%&gt;</pre><br /><br />   转换成：<br /><br /><pre class="overflow">Customer Name: ${ customer. name}<br />&lt;c:if test="${customer. state == param. state}"&gt;<br />...<br />&lt;/c:if&gt;</pre><br /><br />   表达式语言允许直接访问JSP中任何作用域的变量，比如可以用${foo}来代替pageContext.findAttributes("foo")。还有可以能过点或索引来访问bean以及它们的属性，如：<br /><br /><pre class="overflow">${user.address.city} <br />${products.[product.id]}<br />${products.["Part-010"]}</pre><br /><br />    表达式语言提供所有你使用到的运算：==, !=, &lt;,&gt;, &lt;=, &gt;=, &amp;&amp;, ||, ! 。这表达式语言中，它们表示为lt, gt, le, ge, eq, ne，这样可以避免与XML的语法重复。表达式语言也有普通的算术运算同布尔运算。另外，表达式语言还具有自动类型转换的功能，如int value = "${request.myValue}"会自动转换。<br /><br />   在表达式语言是可以提供属性的缺省值的，使用缺省值是为了避免空指针异常，下面是一个例子，<br /><br /><pre class="overflow">&lt;c:set var="city" value="${user.address.city}" default="N/A" /&gt;</pre><br /><br />   现在，我们已经对表达式语言有所了解，下面，让我们看一下与EL相关的操作。<br /><br /><b>核心操作</b><br /><br />   在核心标记库里使用到表达式语言。&lt;c:out&gt;标记将表达式语言所计算出的值输出到当前的JSP输出流。这个与JSP中的&lt;%= scripting exp %&gt;相似。比如：<br /><br /><pre class="overflow">&lt;c:out value="${customer.name}"  default="N/A" /&gt;</pre><br /><br />   核心标记库里还可以设置和清除变量。变量的缺省作用域是PAGE。例如我们可以用&lt;c:set var="customer" value=${customer}" /&gt;设置一个页面变量customer，再用一个&lt;c:remove var="customer" /&gt;去清除它。<br /><br />   现在，能过JSTL，我们可以使用一个标记去捕捉java.lang.Throwable，例如：&lt;c:catch var="myError" /&gt;。使用这个标记，可以统一页面的异常处理，但这不意味着代替JSP的错误页面机制。通过使用&lt;c:catch&gt;标记，就可以在页面上控制特定的异常，而不用转到错误页面，其实并不是所有异常都需要转到错误页面。通过使用&lt;c:catch&gt;标记，与用户的交互也变得更友好。<br /><br /><b>条件操作</b><br /><br />    在条件操作中使用EL是简化JSP的一种强有力的手段。&lt;c:if&gt;标记，它可以构造简单的条件表达式。下面的例子，访问了一个对象的属性：<br /><br /><pre class="overflow">&lt;c:if test="${user.visitCount == 1}"<br />        Welcome back! <br />&lt;/c:if&gt;</pre><br /><br />    当然，有IF就一定会有ELSE。如果是"if/then/else"结构的，则使用&lt;c:choose&gt;, &lt;c:when&gt;和&lt;c:otherwise&gt;标记。<br /><br />   看一看下面的例子，我们对一个查询结果集做过了一些处理，之后使用标记去显示正确的信息。<br /><br /><pre class="overflow">&lt;c:choose&gt;<br />&lt;c:when test="${count == 0}"&gt;<br />        No records matched your selection.<br />&lt;/c:when&gt;<br />&lt;c:otherwise&gt;<br />        &lt;c:out value="${count}"/&gt; records matched your selection.<br />&lt;/c:otherwise&gt;<br />&lt;/c:choose&gt;</pre><br /><br /><b>迭代操作</b><br /><br />   在整个JSTL里面，可能最有用的操作就是迭代操作了。迭代操作的标记有&lt;c:forEach&gt;，&lt;c:forToken&gt;和&lt;x:forEach&gt;。最后一个是XML的迭代操作。下面我们会说到XML的操作，但现在我们还是继续核心操作。<br /><br />    迭代操作支持所有的J2SE集合类型，包括List, LinkedList, ArrayList, Vector, Stack, 和Set。还有java.util.Map对象，如HashMap, Hashtable, Properties, Provider, 和Attributes。还有数组。当使用基本数据类型的数组时，它会包装成对应的基本类。在迭代操作中，会输出两个东西，当前的数据项和迭代的状态。看看下面的例子：<br /><br /><pre class="overflow">&lt;table&gt;<br />&lt;c:forEach var="product" <br />              items="${products}" <br />              varStatus="status"&gt;<br />&lt;tr&gt;<br />        &lt;td&gt;&lt;c:out value="${status.count}"/&gt;&lt;/td&gt;<br />        &lt;td&gt;&lt;c:out value="${product.name}"/&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/c:forEach&gt;<br />&lt;/table&gt;</pre><br /><br />   例子中，products是一个集合，当前的数据项入在变量product里面，变量status是当前的迭代状态。是不是很简单。<br /><br /><b>URL操作</b><br /><br />   除了迭找操作外，核心标记库里也提供了URL相关的操作，它包括超链接，引入和重定向。可以使用&lt;c:url&gt;去设定一个URL。假如我们想指定一个带参数的URL，并在链接中使用，那就象下面的例子：<br /><br /><pre class="overflow">&lt;c:url=http://mysite.com/register var="myUrl"&gt;<br />        &lt;c:param name="name" value="${param.name}"/&gt;<br />&lt;/c:url&gt;<br />&lt;a href='&lt;c:out value="${myUrl}"/&gt;'&gt;Register&lt;/a&gt;</pre><br /><br />   JSTL中有很强大的资源引入机制，它可以指定绝对的URL，在同一应用的相对的URL，不同应用的相对的URL，还有FTP资源。下面给出一些例子：<br /><br />绝对URL：&lt;c:import url="http://sample.com/Welcome.html"/&gt; <br />同一应用中的相对的URL：&lt;c:import url="/copyright.html"/&gt; <br />不同应用中的相对的URL：&lt;c:import url="/myLogo.html" context="/common"/&gt; <br />FTP资源：&lt;c:import url="ftp://ftp.sample.com/myFile"/&gt; <br /><br />   通过上面的说明可以看出，&lt;c:import&gt;比&lt;jsp:include&gt;强大得多，但是，也有其它理由去使用&lt;jsp:include&gt;的。在JSTL中，对于引入的资源使用了缓存，但有时候缓存会是没用的。如果你使用&lt;jsp:include&gt;，资源的内容会被读入并写到当前的JspWriter，而且是每访问一次就重读一次。而使用&lt;c:import&gt;，资源的内容则只会读取一次。<br /><br /><b>本地化操作</b><br /><br />   JSTL的另一样重要功能就是本地化操作，通过当前请求的，或者环境配置中的参数，就可以简便地实现本地化操作。这个操作是使用J2SE中的ResourceBundle机制去存放各种译文的。JSTL通过设定的区域，去找到并使用相应的ResourceBundle。用&lt;fmt:setLocale&gt;去设置区域，如&lt;fmt:setLocale value="es_Es"/&gt;，value属性为语言代码和国家代码。也可以直接指定一个ResourceBundle：&lt;fmt:bundle basename="ApplicationResource_fr"/&gt;。<br /><br />   一旦设置了区域或者绑定特定的信息，那么&lt;fmt:message&gt;标记就会自动地选择正确的ResourceBundle，使用以下的形式就可以输出正确的信息：<br /><br /><pre class="overflow">&lt;fmt:message key="welcome"&gt;<br />        &lt;fmt:param value="${visitCount}" /&gt;<br />&lt;fmt:message/&gt;</pre><br /><br />   你也可以直接使用&lt; fmt:requestEncoding/&gt;标记去设置当前请求的字符集。<br /><br />   获取和显示文字信息只是本地化操作的一半，而另一半就是格式化同解释日期和数字，不同的地域会有不同的日期和数字格式的。使用&lt;fmt:formatNumber&gt;和&lt;fmt:parseNumber&gt;去格式化数字，金额，百分比数，而且还可以指定格式，就如&lt;fmt:formatNumber value="12.3" pattern=".00"/&gt;会输出"12.30"。<br /><br />   日期和时间的处理使用&lt;fmt:formatDate&gt;, &lt;fmt:timeZone&gt;, &lt;fmt:setTimeZone&gt;, 和 &lt;fmt:parseDate&gt;。<br /><br /><b>SQL操作</b><br /><br />   SQL操作允许你直接操作数据源，在MVC模式里面是不提倡这样做的，我更是彻底反对在一个正式产品里这样做。它们只适用于快速开发，原型开发或者是一些小的应用里面，它们是不应该用在一些大型的应用上面的。不过也有许多开发人员想使用它，所以它保留在标准里面。下面我们来看一下SQL操作。<br /><br />   SQL标记可以用来设置数据源，执行查询，访问查询结果，执行更新等。所有的SQL操作都是基于某一数据源的。有几种方式可以设置数据源：在配置文件里设置<br />sql.datasource参数，在程序中直接设置，或者使用&lt;sql:setDataSource&gt;标记。如下面就设置了一个MySql的数据源：<br /><br /><pre class="overflow">&lt;sql:setDataSource var="datasource"  driver="org.gjt.mm.mysql.driver" url="jdbc:mysql://localhost/db" /&gt;</pre><br /><br />   与JDBC中的DriverManager相似，&lt;sql:setDataSource&gt;也只是一个包装。数据源的属性，它可以是一个JNDI资源，也可以是一个JDBC参数。用&lt;sql:query datasource="${datasource}" ... /&gt;这样的方式来访问数据。<br /><br />   我们把这些东西都放在一起，它是会是这样的：<br /><br /><pre class="overflow">&lt;sql:query var="customer" datasource="${datasource}" <br />SELECT * FROM customers WHERE state = 'CO' ORDER BY city<br />&lt;/sql:query&gt;<br />&lt;table&gt;<br />&lt;c:forEach var="row" items="${customers.row}"&gt;<br />        &lt;tr&gt;<br />        &lt;td&gt;&lt;c:out value="${row.custName}" /&gt;&lt;/td&gt;<br />        &lt;td&gt;&lt;c:out value="${row.address}" /&gt;&lt;/td&gt;<br />        &lt;/tr&gt;<br />&lt;/c:forEach&gt;<br />&lt;/table&gt;</pre><br /><br />    使用事务和执行更新一样也很简单。例如，我们建立一个事务，并执行几个更新，那就是下面代码：<br /><br /><pre class="overflow">&lt;sql:transaction dataSource="${dataSource}"&gt;<br />&lt;sql:update&gt;<br />        UPDATE account SET Balance =Balance -? WHERE accountNo = ?<br />        &lt;sql:param value="${transferAmount}"/&gt;<br />        &lt;sql:param value="${accountFrom}"/&gt;<br />&lt;/sql:update&gt;<br />&lt;/sql:transaction&gt;</pre><br /><br />   用&lt;sql:dateParam&gt;标记来设定SQL语句中的类型为日期型的参数的值。<br /><br /><b>XML操作</b><br /><br />   JSTL中最后一类操作是XML操作，XML操作也可细分成核心操作，流程控制操作和转换操作。JSTL中的XML操作是基于Xpath的，Xpath是XML操作专用的表达式语言。JSTL所有的XML操作中，用"select"属性去指定XPath表达式，这些信息将由XPath引擎解释。<br /><br />   XML核心操作与JSTL的核心操作相似，它包含&lt;x:out&gt;, &lt;x:set&gt;, 和&lt;x:parse&gt;标记。&lt;x:parse&gt;标记提供将XML文档转换成结构化数据的功能，之后，这些数据就能被XPath引擎解释了。例如，有一个关于书籍的XML文档，我们就可以解释它，并打印出来：<br /><br /><pre class="overflow">&lt;c:import url="http://oreilly.com/book?id=1234" var="xml"/&gt;<br />&lt;x:parse source="${xml}" var="bookInfo"/&gt;<br />&lt;x:out select="$bookInfo/title"/&gt;<br />&lt;x:out select="$bookInfo/author"/&gt;</pre><br /><br />   XML类流程控制操作与核心类的流程控制操作一样，包括if, choose, when, otherwise, 和 forEach 这些标记，区别只是它们使用XPath表达式语言。当表达式计算出来后，根据一些规则，结果将转换成一个布尔值。这些规则如下：<br /><br />A number is true if and only if it is neither positive or negative zero nor NaN. <br />一个数字当且仅当它不是一个正数，也不是一个负零，更不是一个NaN（非数字）时，表达式的值为真。<br />A node-set is true if and only if it is non-empty. <br />一个节点当且仅当它不是空节点时，表达式的值为真。<br />A string is true if and only if its length is non-zero. <br />一个字符串当且仅当它的长度不为0是，表达式的值为真。<br /><br />   XML转换操作，是通过XSL样式表来转换XML文档，转换的结果输出到当前页面，另一方面也可以其中的结果保存到变量中。完成一个转换就是导入一个XML文档和XSL样式表，之后做一个转换那么简单：<br /><br /><pre class="overflow">&lt;c:import url="/books" var="xml"/&gt;<br />&lt;c:import url="/WEB-INF/xslt/bookDisplay.xsl" var="xslt"/&gt;<br />&lt;x:transform source="${xml}" xslt="${xslt}"/&gt;</pre><br /><br />   如果你在转换中使用到参数，你可以用&lt;x:param&gt;指定参数名称及参数值。<br /><br /><b>小结</b><br /><br />   现在，你已经学会了使用JSTL中的标记，这样，开发JSP会更容易更快捷。留意JSTL的发展，当JSTL的正式版本发布以后，JSP服务器的提供厂商就会对此优化。你可以在http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html中得到JSTL的最后实现版本。<br /><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/53827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-06-19 17:21 <a href="http://www.blogjava.net/wuxufeng8080/articles/53827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Request attribute</title><link>http://www.blogjava.net/wuxufeng8080/articles/53805.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Mon, 19 Jun 2006 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/53805.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/53805.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/53805.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/53805.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/53805.html</trackback:ping><description><![CDATA[request.getRemoteAddr()   client IP<br />request.getRemoteHost()    client host name<br /><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/53805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-06-19 16:06 <a href="http://www.blogjava.net/wuxufeng8080/articles/53805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>