﻿<?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-Sunshine village-文章分类-struts</title><link>http://www.blogjava.net/keweibo/category/25070.html</link><description>As long as you are there to lead me ,I won't lose my way </description><language>zh-cn</language><lastBuildDate>Thu, 20 Sep 2007 09:01:12 GMT</lastBuildDate><pubDate>Thu, 20 Sep 2007 09:01:12 GMT</pubDate><ttl>60</ttl><item><title>在Struts2中实现文件上传(二)</title><link>http://www.blogjava.net/keweibo/articles/146616.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Wed, 19 Sep 2007 14:14:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/146616.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/146616.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/146616.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/146616.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/146616.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="98%" align="center" border="0">
    <tbody>
        <tr>
            <td align="center" colspan="2" height="40">
            <h1>在Struts2中实现文件上传(二)</h1>
            </td>
        </tr>
        <tr align="center">
            <td colspan="2" height="40"><script type="text/javascript"><!-- google_ad_client="pub-8263014661871932" ; google_ad_width="468;
google_ad_height" = 60; google_ad_format="468x60_as" ; google_ad_type="text_image" ;
//2007-02-14: 新闻内容页面上面 google_ad_channel="8423241514" ; google_color_border="FFFFFF" ; google_color_bg="FFFFFF" ; google_color_link="333333" ; google_color_text="333333" ; google_color_url="003366" ;
//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
              </script></td>
        </tr>
        <tr>
            <td colspan="2" height="40">&nbsp;发布者：[<a href="http://www.mldn.cn/florilegium.jtml?a_name=IT电子教育门户&amp;a_id=0" target="_blank" rel="external">IT电子教育门户</a>]&nbsp;&nbsp;&nbsp;</td>
        </tr>
        <tr>
            <td colspan="2"><span class="STYLE2">
            <div id="article">
            <p><font face="Times New Roman">发布运行应用程序，在浏览器地址栏中键入：http://localhost:8080/Struts2_Fileupload/FileUpload.jsp，出现图示页面：</font></p>
            <p><font face="Times New Roman"><img src="http://www.mldn.cn/UserFiles/2007-8/3/20078314831318.gif"  alt="" />&nbsp;<br />
            清单7 FileUpload页面 </font></p>
            <p><font face="Times New Roman">选择图片文件，填写Caption并按下Submit按钮提交，出现图示页面：</font></p>
            <p><font face="Times New Roman"><img src="http://www.mldn.cn/UserFiles/2007-8/3/20078314831580.gif"  alt="" />&nbsp;<br />
            清单8 上传成功页面 </font></p>
            <p><font face="Times New Roman">更多配置<br />
            在运行上述例子，如果您留心一点的话，应该会发现服务器控制台有如下输出：</font></p>
            <p><font face="Times New Roman">Mar 20 , 2007 4 : 08 : 43 PM org.apache.struts2.dispatcher.Dispatcher getSaveDir<br />
            INFO: Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir<br />
            Mar 20 , 2007 4 : 08 : 43 PM org.apache.struts2.interceptor.FileUploadInterceptor intercept<br />
            INFO: Removing file myFile C:\Program Files\Tomcat 5.5 \work\Catalina\localhost\Struts2_Fileupload\upload_251447c2_1116e355841__7ff7_00000006.tmp 清单9 服务器控制台输出 <br />
            上述信息告诉我们，struts.multipart.saveDir没有配置。struts.multipart.saveDir用于指定存放临时文件的文件夹，该配置写在struts.properties文件中。例如，如果在struts.properties文件加入如下代码：</font></p>
            <p><font face="Times New Roman">struts.multipart.saveDir = /tmp 清单10 struts配置 <br />
            这样上传的文件就会临时保存到你根目录下的tmp文件夹中（一般为c:\tmp），如果此文件夹不存在，Struts 2会自动创建一个。</font></p>
            <p><font face="Times New Roman">错误处理<br />
            上述例子实现的图片上传的功能，所以应该阻止用户上传非图片类型的文件。在Struts 2中如何实现这点呢？其实这也很简单，对上述例子作如下修改即可。</font></p>
            <p><font face="Times New Roman">首先修改FileUpload.jsp，在&lt;body&gt;与&lt;s:form&gt;之间加入&#8220;&lt;s:fielderror /&gt;&#8221;，用于在页面上输出错误信息。</font></p>
            <p><font face="Times New Roman">然后修改struts.xml文件，将Action fileUpload的定义改为如下所示：</font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; action name ="fileUpload" class ="tutorial.FileUploadAction" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; interceptor-ref name ="fileUpload" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; param name ="allowedTypes" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image/bmp,image/png,image/gif,image/jpeg<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ param &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ interceptor-ref &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; interceptor-ref name ="defaultStack" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; result name ="input" &gt; /FileUpload.jsp &lt;/ result &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; result name ="success" &gt; /ShowUpload.jsp &lt;/ result &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ action &gt; 清单11 修改后的配置文件 <br />
            显而易见，起作用就是fileUpload拦截器的allowTypes参数。另外，配置还引入defaultStack它会帮我们添加验证等功能，所以在出错之后会跳转到名称为&#8220;input&#8221;的结果，也即是FileUpload.jsp。</font></p>
            <p><font face="Times New Roman">发布运行应用程序，出错时，页面如下图所示：</font></p>
            <p><font face="Times New Roman"><img src="http://www.mldn.cn/UserFiles/2007-8/3/20078314831494.gif"  alt="" />&nbsp;<br />
            清单12 出错提示页面 </font></p>
            <p><font face="Times New Roman">上面的出错提示是Struts 2默认的，大多数情况下，我们都需要自定义和国际化这些信息。通过在全局的国际资源文件中加入&#8220;struts.messages.error.content.type.not.allowed=The file you uploaded is not a image&#8221;，可以实现以上提及的需求。对此有疑问的朋友可以参考我之前的文章《在Struts 2.0中国际化(i18n)您的应用程序》。</font></p>
            <p><font face="Times New Roman">实现之后的出错页面如下图所示：</font></p>
            <p><font face="Times New Roman"><img src="http://www.mldn.cn/UserFiles/2007-8/3/20078314831230.gif"  alt="" />&nbsp;<br />
            清单13 自定义出错提示页面 </font></p>
            <p><font face="Times New Roman">同样的做法，你可以使用参数&#8220;maximumSize&#8221;来限制上传文件的大小，它对应的字符资源名为：&#8220;struts.messages.error.file.too.large&#8221;。</font></p>
            <p><font face="Times New Roman">字符资源&#8220;struts.messages.error.uploading&#8221;用提示一般的上传出错信息。</font></p>
            <p><font face="Times New Roman">多文件上传<br />
            与单文件上传相似，Struts 2实现多文件上传也很简单。你可以将多个&lt;s:file /&gt;绑定Action的数组或列表。如下例所示。</font></p>
            <p><font face="Times New Roman">&lt; s:form action ="doMultipleUploadUsingList" method ="POST" enctype ="multipart/form-data" &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; s:file label ="File (1)" name ="upload" /&gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; s:file label ="File (2)" name ="upload" /&gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; s:file label ="FIle (3)" name ="upload" /&gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; s:submit /&gt; <br />
            &lt;/ s:form &gt; 清单14 多文件上传JSP代码片段 <br />
            如果你希望绑定到数组，Action的代码应类似：</font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; private File[] uploads;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private String[] uploadFileNames;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private String[] uploadContentTypes;</font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; public File[] getUpload()&nbsp; { return this .uploads; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setUpload(File[] upload)&nbsp; { this .uploads = upload; } <br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String[] getUploadFileName()&nbsp; { return this .uploadFileNames; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setUploadFileName(String[] uploadFileName)&nbsp; { this .uploadFileNames = uploadFileName; } <br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String[] getUploadContentType()&nbsp; { return this .uploadContentTypes; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setUploadContentType(String[] uploadContentType)&nbsp; { this .uploadContentTypes = uploadContentType; } 清单15 多文件上传数组绑定Action代码片段 <br />
            如果你想绑定到列表，则应类似：</font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; private List &lt; File &gt; uploads = new ArrayList &lt; File &gt; ();<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private List &lt; String &gt; uploadFileNames = new ArrayList &lt; String &gt; ();<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private List &lt; String &gt; uploadContentTypes = new ArrayList &lt; String &gt; ();</font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; public List &lt; File &gt; getUpload()&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this .uploads;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setUpload(List &lt; File &gt; uploads)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .uploads = uploads;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public List &lt; String &gt; getUploadFileName()&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this .uploadFileNames;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setUploadFileName(List &lt; String &gt; uploadFileNames)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .uploadFileNames = uploadFileNames;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public List &lt; String &gt; getUploadContentType()&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this .uploadContentTypes;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setUploadContentType(List &lt; String &gt; contentTypes)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .uploadContentTypes = contentTypes;<br />
            &nbsp;&nbsp;&nbsp; } 清单16 多文件上传列表绑定Action代码片段 <br />
            总结<br />
            在Struts 2中实现文件上传的确是轻而易举，您要做的只是使用&lt;s:file /&gt;与Action的属性绑定。这又一次有力地证明了Struts 2的简单易用。</font></p>
            </div>
            </span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/keweibo/aggbug/146616.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-09-19 22:14 <a href="http://www.blogjava.net/keweibo/articles/146616.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts2中实现文件上传(一)</title><link>http://www.blogjava.net/keweibo/articles/146615.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Wed, 19 Sep 2007 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/146615.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/146615.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/146615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/146615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/146615.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="98%" align="center" border="0">
    <tbody>
        <tr>
            <td align="center" colspan="2" height="40">
            <h1>在Struts2中实现文件上传(一)</h1>
            </td>
        </tr>
        <tr align="center">
            <td colspan="2" height="40"><script type="text/javascript"><!-- google_ad_client="pub-8263014661871932" ; google_ad_width="468;
google_ad_height" = 60; google_ad_format="468x60_as" ; google_ad_type="text_image" ;
//2007-02-14: 新闻内容页面上面 google_ad_channel="8423241514" ; google_color_border="FFFFFF" ; google_color_bg="FFFFFF" ; google_color_link="333333" ; google_color_text="333333" ; google_color_url="003366" ;
//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
              </script></td>
        </tr>
        <tr>
            <td colspan="2" height="40">转自:http://www.mldn.cn/articleview/2007-8-22/article_view_2245.htm</td>
        </tr>
        <tr>
            <td colspan="2"><span class="STYLE2">
            <div id="article">
            <p><font face="Times New Roman">前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题， 所以今天我们就来讨论一下这个问题。</font></p>
            <p><font face="Times New Roman">实现原理<br />
            Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹，然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。</font></p>
            <p><font face="Times New Roman">具体实现<br />
            前段时间Apache发布了Struts 2.0.6 GA，所以本文的实现是以该版本的Struts作为框架的。以下是例子所依赖类包的列表：</font></p>
            <p><font face="Times New Roman"><img alt="依赖类包的列表" src="http://www.mldn.cn/UserFiles/2007-8/3/200783135852260.gif" />&nbsp;<br />
            清单1 依赖类包的列表</font></p>
            <p><font face="Times New Roman">首先，创建文件上传页面FileUpload.jsp，内容如下：</font></p>
            <p><font face="Times New Roman">&lt;% @ page language = " java " contentType = " text/html; charset=utf-8 " pageEncoding = " utf-8 " %&gt; <br />
            &lt;% @ taglib prefix = " s " uri = " /struts-tags " %&gt; </font></p>
            <p><font face="Times New Roman">&lt;! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" &gt; <br />
            &lt; html xmlns ="http://www.w3.org/1999/xhtml" &gt; <br />
            &lt; head &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; title &gt; Struts 2 File Upload &lt;/ title &gt; <br />
            &lt;/ head &gt; <br />
            &lt; body &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; s:form action ="fileUpload" method ="POST" enctype ="multipart/form-data" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; s:file name ="myFile" label ="Image File" /&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; s:textfield name ="caption" label ="Caption" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; s:submit /&gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ s:form &gt; <br />
            &lt;/ body &gt; <br />
            &lt;/ html &gt; 清单2 FileUpload.jsp <br />
            在FileUpload.jsp中，先将表单的提交方式设为POST，然后将enctype设为multipart/form-data，这并没有什么特别之处。接下来，&lt;s:file/&gt;标志将文件上传控件绑定到Action的myFile属性。</font></p>
            <p><font face="Times New Roman">其次是FileUploadAction.java代码：</font></p>
            <p><font face="Times New Roman">&nbsp;package tutorial;</font></p>
            <p><font face="Times New Roman">&nbsp;import java.io.BufferedInputStream;<br />
            &nbsp;import java.io.BufferedOutputStream;<br />
            &nbsp;import java.io.File;<br />
            &nbsp;import java.io.FileInputStream;<br />
            &nbsp;import java.io.FileOutputStream;<br />
            &nbsp;import java.io.InputStream;<br />
            &nbsp;import java.io.OutputStream;<br />
            &nbsp;import java.util.Date;</font></p>
            <p><font face="Times New Roman">&nbsp;import org.apache.struts2.ServletActionContext;</font></p>
            <p><font face="Times New Roman">&nbsp;import com.opensymphony.xwork2.ActionSupport;</font></p>
            <p><font face="Times New Roman">&nbsp;public class FileUploadAction extends ActionSupport&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private static final long serialVersionUID = 572146812454l ;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private static final int BUFFER_SIZE = 16 * 1024 ;<br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; private File myFile;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private String contentType;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private String fileName;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private String imageFileName;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; private String caption;<br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; public void setMyFileContentType(String contentType)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .contentType = contentType;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; public void setMyFileFileName(String fileName)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .fileName = fileName;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; public void setMyFile(File myFile)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .myFile = myFile;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; public String getImageFileName()&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return imageFileName;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; public String getCaption()&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return caption;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setCaption(String caption)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .caption = caption;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; private static void copy(File src, File dst)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream in = null ;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputStream out = null ;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte [] buffer = new byte [BUFFER_SIZE];<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (in.read(buffer) &gt; 0 )&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(buffer);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( null != in)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in.close();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( null != out)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; private static String getExtention(String fileName)&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int pos = fileName.lastIndexOf( " . " );<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fileName.substring(pos);<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp; @Override<br />
            &nbsp;&nbsp;&nbsp;&nbsp; public String execute()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imageFileName = new Date().getTime() + getExtention(fileName);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File imageFile = new File(ServletActionContext.getServletContext().getRealPath( " /UploadImages " ) + " / " + imageFileName);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; copy(myFile, imageFile);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br />
            &nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp; <br />
            } 清单3 tutorial/FileUploadAction.java <br />
            在FileUploadAction中我分别写了setMyFileContentType、setMyFileFileName、setMyFile和setCaption四个Setter方法，后两者很容易明白，分别对应FileUpload.jsp中的&lt;s:file/&gt;和&lt;s:textfield/&gt;标志。但是前两者并没有显式地与任何的页面标志绑定，那么它们的值又是从何而来的呢？其实，&lt;s:file/&gt;标志不仅仅是绑定到myFile，还有myFileContentType（上传文件的MIME类型）和myFileFileName（上传文件的文件名，该文件名不包括文件的路径）。因此，&lt;s:file name="xxx" /&gt;对应Action类里面的xxx、xxxContentType和xxxFileName三个属性。</font></p>
            <p><font face="Times New Roman">FileUploadAction作用是将浏览器上传的文件拷贝到WEB应用程序的UploadImages文件夹下，新文件的名称是由系统时间与上传文件的后缀组成，该名称将被赋给imageFileName属性，以便上传成功的跳转页面使用。</font></p>
            <p><font face="Times New Roman">下面我们就来看看上传成功的页面：</font></p>
            <p><font face="Times New Roman">&lt;% @ page language = " java " contentType = " text/html; charset=utf-8 " pageEncoding = " utf-8 " %&gt; <br />
            &lt;% @ taglib prefix = " s " uri = " /struts-tags " %&gt; </font></p>
            <p><font face="Times New Roman">&lt;! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" &gt; <br />
            &lt; html xmlns ="http://www.w3.org/1999/xhtml" &gt; <br />
            &lt; head &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; title &gt; Struts 2 File Upload &lt;/ title &gt; <br />
            &lt;/ head &gt; <br />
            &lt; body &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; div style ="padding: 3px; border: solid 1px #cccccc; text-align: center" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; img src ='UploadImages/&lt;s:property value ="imageFileName" /&gt; ' /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; br /&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; s:property value ="caption" /&gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ div &gt; <br />
            &lt;/ body &gt; <br />
            &lt;/ html &gt; 清单4 ShowUpload.jsp <br />
            ShowUpload.jsp获得imageFileName，将其UploadImages组成URL，从而将上传的图像显示出来。</font></p>
            <p><font face="Times New Roman">然后是Action的配置文件：</font></p>
            <p><font face="Times New Roman">&lt;? xml version="1.0" encoding="UTF-8" ?&gt; </font></p>
            <p><font face="Times New Roman">&lt;! DOCTYPE struts PUBLIC<br />
            &nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
            &nbsp;&nbsp;&nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd" &gt; </font></p>
            <p><font face="Times New Roman">&lt; struts &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt; package name ="fileUploadDemo" extends ="struts-default" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; action name ="fileUpload" class ="tutorial.FileUploadAction" &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; interceptor-ref name ="fileUploadStack" /&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; result name ="success" &gt; /ShowUpload.jsp &lt;/ result &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ action &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ package &gt; <br />
            &lt;/ struts &gt; 清单5 struts.xml <br />
            fileUpload Action显式地应用fileUploadStack的拦截器。</font></p>
            <p><font face="Times New Roman">最后是web.xml配置文件：</font></p>
            <p><font face="Times New Roman">&lt;? xml version="1.0" encoding="UTF-8" ?&gt; <br />
            &lt; web-app id ="WebApp_9" version ="2.4" <br />
            &nbsp;&nbsp;&nbsp; xmlns ="http://java.sun.com/xml/ns/j2ee" <br />
            &nbsp;&nbsp;&nbsp; xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" <br />
            &nbsp;&nbsp;&nbsp; xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" &gt; </font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp; &lt; display-name &gt; Struts 2 Fileupload &lt;/ display-name &gt; </font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp; &lt; filter &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-name &gt; struts-cleanup &lt;/ filter-name &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-class &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.dispatcher.ActionContextCleanUp<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ filter-class &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ filter &gt; <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp; &lt; filter &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-name &gt; struts2 &lt;/ filter-name &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-class &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.dispatcher.FilterDispatcher<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ filter-class &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ filter &gt; <br />
            &nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp; &lt; filter-mapping &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-name &gt; struts-cleanup &lt;/ filter-name &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; url-pattern &gt; /* &lt;/ url-pattern &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ filter-mapping &gt; </font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp; &lt; filter-mapping &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; filter-name &gt; struts2 &lt;/ filter-name &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; url-pattern &gt; /* &lt;/ url-pattern &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ filter-mapping &gt; </font></p>
            <p><font face="Times New Roman">&nbsp;&nbsp;&nbsp; &lt; welcome-file-list &gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; welcome-file &gt; index.html &lt;/ welcome-file &gt; <br />
            &nbsp;&nbsp;&nbsp; &lt;/ welcome-file-list &gt; </font></p>
            <p><font face="Times New Roman">&lt;/ web-app &gt; </font></p>
            </div>
            </span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/keweibo/aggbug/146615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-09-19 22:11 <a href="http://www.blogjava.net/keweibo/articles/146615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts标签使用举例--logic篇</title><link>http://www.blogjava.net/keweibo/articles/145473.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Sun, 16 Sep 2007 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/145473.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/145473.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/145473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/145473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/145473.html</trackback:ping><description><![CDATA[&nbsp; 1.&nbsp; logic:empty
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该标签是用来判断是否为空的。如果为空，该标签体中嵌入的内容就会被处理。该标签用于以下情况：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）当Java对象为null时；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）当String对象为""时； </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3）当java.util.Collection对象中的isEmpty()返回true时；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4）当java.util.Map对象中的isEmpty()返回true时。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eg.&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;logic:empty &nbsp; name="userList"&gt;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/logic:empty&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该句等同于：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if &nbsp; (userList.isEmpty()) &nbsp; {&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
<strong>&nbsp;&nbsp; <font color="#ff0000">2.&nbsp; logic:notEmpty</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该标签的应用正好和logic:empty标签相反，略。<br />
<strong>&nbsp;&nbsp;<font color="#ff0000"> 3. logic:equal</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该标签为等于比较符。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg1.&nbsp;比较用户的状态属性是否1，若为1，输出"启用";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;logic:equal &nbsp; name="user" &nbsp; property="state" &nbsp; value="1"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启用<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/logic:equal&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg2.&nbsp;如果上例中的value值是动态获得的，例如需要通过bean:write输出，因struts不支持标签嵌套，可采用EL来解决该问题。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;logic:equal &nbsp; name="charge" &nbsp; property="num" &nbsp; value="${business.num}"&gt;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/logic:equal&gt;<br />
<font color="#ff0000">&nbsp;</font><strong><font color="#ff0000">&nbsp;&nbsp;&nbsp;4. logic:notEqual</font><br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该标签意义与logic:equal相反，使用方法类似，略。<br />
<strong>&nbsp;&nbsp;&nbsp;<font color="#ff0000">&nbsp;5. logic:forward<br />
</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该标签用于实现页面导向，查找配置文件的全局forward。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg. &lt;logic:forward name="index"/&gt;<br />
<strong>&nbsp;&nbsp;&nbsp; <font color="#ff0000">6. logic:greaterEqual</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为大于等于比较符。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg.&nbsp;当某学生的成绩大于等于90时，输出&#8220;优秀&#8221;：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;logic:greaterEqual name="student" property="score" value="90"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;优秀<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logic:greaterEqual&gt; <font size="3"><font color="#000000" size="2"><br />
<strong>&nbsp;&nbsp;&nbsp; <font color="#ff0000">7. logic:greaterThan</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></font> 此为大于比较符，使用方法同logic:greaterEqual，略;<br />
<font size="3"><font color="#000000" size="2"><strong><font color="#ff0000">&nbsp;&nbsp;&nbsp; 8. logic:lessEqual</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font>此为小于等于比较符，使用方法同logic:greaterEqual,略;<font size="3"><font color="#000000" size="2"><br />
<strong>&nbsp;&nbsp;&nbsp;<font color="#ff0000"> 9. logic:lessThan</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font>此为小于比较符，使用方法同logic:greaterEqual,略;<font size="3"><font color="#000000" size="2"><br />
<strong>&nbsp;&nbsp;<font color="#ff0000">&nbsp; 10. logic:match</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font>此标签比较对象是否相等；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg1. 检查在request范围内的name属性是否包含"amigo"串：&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;logic:match name="name" scope="request" value="amigo"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean:write name="name"/&gt;中有一个&#8220;amigo&#8221;串。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logic:match&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg2. 检查在request范围内的name属性是否已&#8220;amigo&#8221;作为起始字符串：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;logic:match name="name" scope="request" value="amigo" location="start"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean:write name="name"/&gt;以&#8220;amigo&#8221;作为起始字符串。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logic:match&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg3.&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;logic:match header="user-agent" value="Windows"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你运行的是Windows系统<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logic:match&gt;<br />
<strong><font color="#000000" size="2"><font size="3"><font color="#ff0000">&nbsp;&nbsp;&nbsp; </font></font></font><font color="#ff0000">11. &nbsp;logic:notMatch</font></strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此标签用于比较对象是否不相同，与logic:match意义相反，使用方法类似，略。<br />
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp; <strong>12. logic:messagePresent</strong></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该标签用于判断ActionMessages/ActionErrors对象是否存在；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg.&nbsp;如果存在error信息，将其全部输出：<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;logic:messagePresent property="error"&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;html:messages property="error" id="errMsg" &gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean:write name="errMsg"/&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/html:messages&gt;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logic:messagePresent &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"><strong>13. logic:messagesNotPresent</strong></font><br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该标签用于判断ActionMessages/ActionErrors对象是否不存在,使用方法与logic:messagePresent类似，略<br />
<strong><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14. logic:present</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此标签用于判断request对象传递参数是否存在。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;eg1. user对象和它的name属性在request中都存在时，输出相应字符串：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;logic:present name="user" property="name"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user对象和该对象的name属性都存在<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logic:present&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg2. 若有一个名字为&#8220;user&#8221;的JavaBean，输出对应字符串：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;logic:present name="user" &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有一个名字为&#8220;user&#8221;的JavaBean。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logic:present&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eg3.&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;logic:present header="user-agent"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;we got a user-agent header.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logic:present&gt;<br />
&nbsp;&nbsp;<strong>&nbsp;&nbsp;&nbsp; <font color="#ff0000">15. logic:notPresent</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此标签用于判断request对象传递参数是否不存在，意义与了logic:present相反，使用方法类似，略。<br />
&nbsp;&nbsp;<strong>&nbsp;&nbsp;<font color="#ff0000">&nbsp; 16. logic:redirect</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该标签用于实现页面转向，可传递参数。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg1. &lt;logic:redirect href="<u><font color="#638f27">http://<u><font color="#638f27">www.chinaitlab</font></u>.com"/</font></u>&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">17. logic:iterator</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于显示列表为collection的值（List ,ArrayList,HashMap等）。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg1.&nbsp;逐一输出用户列表(userlList)中用户的姓名：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;logic:iterate&nbsp; id="user" name="userList"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean:write name="user" property="name"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/logic:iterate&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg2.&nbsp;从用户列表中输出从1开始的两个用户的姓名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;logic:iterate&nbsp; id="user" name="userList" indexId="index"&nbsp; offset="1" length="2"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean:write name="index"/&gt;.&lt;bean:write name="user" property="name"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logic:iterate&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg3. logic:iterator标签的嵌套举例<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;logic:iterate id="user" indexId="index" name="userList"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean:write name="index"/&gt;. &lt;bean:write name="user" property="name"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;logic:iterate id="address" name="user" property="addressList" length="3" offset="1"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean:write name="address"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logic:iterate&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logic:iterate&gt;</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/145473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-09-16 10:24 <a href="http://www.blogjava.net/keweibo/articles/145473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用中异常的处理(二)</title><link>http://www.blogjava.net/keweibo/articles/140663.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Tue, 28 Aug 2007 13:19:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/140663.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/140663.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/140663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/140663.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/140663.html</trackback:ping><description><![CDATA[<p><span style="COLOR: red">业务异常的设计</span></p>
<p>&nbsp;&nbsp;业务异常的层次结构设计在开发中也是非常重要的要作,业务异常体系结构的设计方法将直接影响<br>到异常处理的方法.<br>&nbsp;&nbsp;对于异常系统的结构通常会被划分为三个层次,第一层为异常的基类,第二层为功能层或者模块层,<br>第三层为业务异常层,层与层之间是父子工的继承关系.<br>&nbsp;&nbsp;对于一个通用的异常系统而言,通常会定义一个异常基类,假设是BaseException,该类继承自RuntimeException<br>之所以将业务异常的基类定义为RuntimeException,是因为业务异常是否需要开发人员在开发过程中进行捕获的<br>对于业务异常的捕获交给系统的框架或者表示层来完成.<br>&nbsp;&nbsp;接下来,在BaseException的基础之上,还要为应用中的每个层次定义一个异常基类.例如,业务层的异常<br>可以定义为BusinessException,持久层的异常可以定义为DAOException等.当然,这一层次的异常也可以按照<br>功能或者模块来进行划分,划分的方式主要依赖于顶层对异常的处理方法.<br>&nbsp;&nbsp;最后,就是为每一个业务异常定义相应的业务对象.另外,为减少异常对象的数量,在这一层也可以采取错误<br>代码,使得顶层的拦截程序可以依据错误代码来得到相应的错误信息.</p>
<p><span style="COLOR: red">异常处理方法</span></p>
<p>&nbsp;&nbsp;Servlet容器中异常的处理<br>在web.xml文件中进行异常处理的配置是通过&lt;error-page&gt;元素来进行的,它支持两种类型的异常拦截.</p>
<p>&lt;error-page&gt;<br>&nbsp;&lt;error-code&gt;404&lt;/error-code&gt;<br>&nbsp;&lt;location&gt;/error/notFound.jsp&lt;/location&gt;<br>&lt;/error-page&gt;</p>
<p>&lt;error-page&gt;<br>&nbsp;&lt;error-type&gt;java.lang.NullPointException&lt;/error-type&gt;<br>&nbsp;&lt;location&gt;/error/nullPointer.jsp&lt;/location&gt;<br>&lt;/error-page&gt;</p>
<p><span style="COLOR: red">从JSP 2.0开始,除了在错误页面中可以使用绑定到request的exception对象外,还增加了一个名称为<br>errorData的绑定到pageContext的对象,该对象是javax.servlet.jsp.ErrorData类的实例,它可以当做<br>一个普通的Bean来使用,通过它的属性可以了解到异常的更多信息.<br>其属性如下:<br>属性&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;描述<br>requestURI&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发生请求失败的URI<br>servletName&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发生错误的Servlet或者JSP页面的名称<br>statueCode&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发生错误的状态码<br>throwable&nbsp;&nbsp;&nbsp;&nbsp;Throwable&nbsp;&nbsp;&nbsp;&nbsp;导致当前错误的异常<br></span>例如:<br>...<br>&lt;title&gt;404状态码错误的页面&lt;/title&gt;<br>...<br>&lt;jsp:useBean id="now" class="java.util.Date" /&gt;<br>发生异常的时间:${now}&lt;br&gt;<br>请求的地址: ${pageContext.errorData.requestURI }&lt;br&gt;<br>错误状态码: ${pageContext.errorData.statueCode }&lt;br&gt;<br>异常:&nbsp;&nbsp;&nbsp;&nbsp;${pageContext.errorData.throwable }<br>...</p>
<p><strong><em style="COLOR: red">自定义异常页面</em></strong></p>
<p>&nbsp;&nbsp;自己在JSP页面中的定义将会覆盖在web.xml中的定义<br>&nbsp;&nbsp;自定义异常页面的方法如下<br>&lt;%@ page errorPage="/error/errorPage.jsp" %&gt;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/140663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-08-28 21:19 <a href="http://www.blogjava.net/keweibo/articles/140663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用中异常的处理(一)</title><link>http://www.blogjava.net/keweibo/articles/140656.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Tue, 28 Aug 2007 12:49:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/140656.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/140656.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/140656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/140656.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/140656.html</trackback:ping><description><![CDATA[<p>应用中异常的处理的原则</p>
<p>&nbsp;&nbsp;在处理应用中的异常时,通常可以将应用中所遇到的异常分为两大类,一种是业务异常,一种是非业务异常.<br>&nbsp;&nbsp;业务异常是指在进行正常的业务处理时,由于某些业务的特殊需求而导致处理不能继续所抛出的异常,这种异常<br>常是由开发人员所定义,它属于可以预知的异常.&nbsp;<br>&nbsp;&nbsp;非业务异常是指在正常情况下所产生的异常.例如,由于网络故障而导致无法访问数据库,必要的配置文件不存在<br>等情况下所产生的异常都属于非业务异常.非业务异常是不可预知的.</p>
<p>业务异常的处理</p>
<p>&nbsp;&nbsp;在业务层或者业务处理方法中抛出异常,在表示层拦截异常,并将异常以友好的方式反馈给操作者,以<br>便其可以提示信息正确的完成业务功能处理.在这里要注意的是,在表示层拦截异常不是只需要针对每个异常<br>都进行拦截和处理,而是是充分利用框架来进行统一的处理.最好做到正常的处理流程中看不到任何异常处理.</p>
<p>非业务异常的处理</p>
<p>&nbsp;&nbsp;在应用的框架中进行统一的拦截和处理,在开发中不需要进行任何处理.对于非业务异常的处理结果<br>通常是返回到专门的错误页面,给出很泛泛的提示信息,表明系统发生不可预知的异常,并请与管理员联系<br>此类信息.</p>
<p>注:本文来自 struts,spring,hibernate集成开发 一书&nbsp;</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/140656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-08-28 20:49 <a href="http://www.blogjava.net/keweibo/articles/140656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用公共的Action实现用户合法性的校验</title><link>http://www.blogjava.net/keweibo/articles/140649.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Tue, 28 Aug 2007 12:23:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/140649.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/140649.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/140649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/140649.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/140649.html</trackback:ping><description><![CDATA[<p>利用公共的Action实现用户合法性的校验</p>
<p>&nbsp;&nbsp;在这里,我们可以通过实现一个公共的Action并增加相应的权限验证功能来实现用户权限的校验工作.<br>这样,在进行业务功能开发的时候,所有需要执行权限校验的Action都需要继承自此公共的Action.<br>下面是一个简单的例子<br>具有校验功能的Action(SecureAction.java)<br>/*<br>&nbsp;* Generated by MyEclipse Struts<br>&nbsp;* Template path: templates/java/JavaClass.vtl<br>&nbsp;*/<br>package dgut.ke.struts.secure;</p>
<p>import javax.servlet.RequestDispatcher;<br>import javax.servlet.http.HttpServletRequest;<br>import javax.servlet.http.HttpServletResponse;<br>import javax.servlet.http.HttpSession;</p>
<p>import org.apache.struts.action.Action;<br>import org.apache.struts.action.ActionForm;<br>import org.apache.struts.action.ActionForward;<br>import org.apache.struts.action.ActionMapping;</p>
<p>/** <br>&nbsp;* MyEclipse Struts<br>&nbsp;* Creation date: 08-28-2007<br>&nbsp;* <br>&nbsp;* XDoclet definition:<br>&nbsp;* @struts.action validate="true"<br>&nbsp;*/<br>public abstract class SecureAction extends Action {<br>&nbsp;/*<br>&nbsp; * Generated Methods<br>&nbsp; */</p>
<p>&nbsp;/** <br>&nbsp; * Method execute<br>&nbsp; * @param mapping<br>&nbsp; * @param form<br>&nbsp; * @param request<br>&nbsp; * @param response<br>&nbsp; * @return ActionForward<br>&nbsp; */<br>&nbsp;public final ActionForward execute(ActionMapping mapping, ActionForm form,<br>&nbsp;&nbsp;&nbsp;HttpServletRequest request, HttpServletResponse response)throws Exception {<br>&nbsp;&nbsp;HttpSession session = request.getSession();<br>&nbsp;&nbsp;String userId = (String)session.getAttribute("SESSION.USER");<br>&nbsp;&nbsp;if(userId==null) <br>&nbsp;&nbsp;&nbsp;return (mapping.findForward("isNullSession"));<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;return doExecute(mapping,form,request,response);<br>&nbsp;}<br>&nbsp;<br>&nbsp;public abstract ActionForward doExecute(ActionMapping mapping,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionForm form,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response)<br>&nbsp;throws Exception;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>}<br>下面编写一个普通的Action(isNullSessionAction.java)继承自此公共Action<br>/*<br>&nbsp;* Generated by MyEclipse Struts<br>&nbsp;* Template path: templates/java/JavaClass.vtl<br>&nbsp;*/<br>package dgut.ke.struts.secure;</p>
<p>import javax.servlet.http.HttpServletRequest;<br>import javax.servlet.http.HttpServletResponse;</p>
<p>import org.apache.struts.action.ActionForm;<br>import org.apache.struts.action.ActionForward;<br>import org.apache.struts.action.ActionMapping;</p>
<p><br>public class IsNullSessionAction extends SecureAction {</p>
<p>&nbsp;@Override<br>&nbsp;/*重写类中的方法*/<br>&nbsp;public ActionForward doExecute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {<br>&nbsp;&nbsp;//通过父类的权限验证则该方法会被执行<br>&nbsp;&nbsp;return mapping.findForward("success");<br>&nbsp;}<br>}<br>struts-config.xml中的相关配置<br>&nbsp;&nbsp;&lt;action path="/isNullSession" type="dgut.ke.struts.secure.IsNullSessionAction"&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&lt;forward name="success" path="/success.jsp"&gt;&lt;/forward&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&lt;forward name="isNullSession" path="/index.jsp"&gt;&lt;/forward&gt;<br>&nbsp;&nbsp;&lt;/action&gt;<br>&nbsp;&nbsp;&lt;action path="/secureAction" type="dgut.ke.struts.secure.SecureActionAction"/&gt;<br></p>
<img src ="http://www.blogjava.net/keweibo/aggbug/140649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-08-28 20:23 <a href="http://www.blogjava.net/keweibo/articles/140649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Struts的PlugIn进行Web应用的扩展</title><link>http://www.blogjava.net/keweibo/articles/140637.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Tue, 28 Aug 2007 11:18:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/140637.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/140637.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/140637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/140637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/140637.html</trackback:ping><description><![CDATA[<p>使用Struts的PlugIn进行Web应用的扩展</p>
<p>&nbsp;&nbsp;Struts提供了PlugIn的方式来扩展Struts的功能,这种方式的扩展适合于实现Struts启动或者<br>停止时需要执行的某些特殊处理的情况,可以方便地实现Web应用启动时的系统初始化工作以及在Web<br>应用卸载时的资源释放工作,它不能实现针对每个用户请求的处理功能.<br>&nbsp;&nbsp;开发一个Struts的PlugIn需要以下两个步骤:<br>(1)实现Struts定义的PlugIn接口,其中的init()方法将在应用启动时被调用,而destory()方法将在服务<br>终止时被调用.<br>(2)在Struts的配置文件中配置该PlugIn以及设置的初始化参数.Struts还允许为PlugIn定义一些参数,<br>在默认的情况下,这些参数必须作为PlugIn属性的形式出现,并且为每个参数提供符合javabean规范<br>的setter方法,而这些参数在struts的配置文件中进行.<br>&nbsp;&nbsp;基本的配置形式如下:<br>&lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"&gt;<br>&nbsp;&lt;set-property property="pathnames" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/&gt;<br>&lt;/plug-in&gt;<br>下面是一个例子.在服务器启动和停止时输出系统的时间.<br>MyPlugIn.java</p>
<p>package dgut.ke.struts.plugIn;</p>
<p>import java.text.DateFormat;<br>import java.text.SimpleDateFormat;<br>import java.util.Calendar;<br>import java.util.Date;</p>
<p>import javax.servlet.ServletException;</p>
<p>import org.apache.struts.action.ActionServlet;<br>import org.apache.struts.action.PlugIn;<br>import org.apache.struts.config.ModuleConfig;</p>
<p>public class MyPlugIn implements PlugIn {</p>
<p>&nbsp;private String timePattern;<br>&nbsp;public String getTimePattern() {<br>&nbsp;&nbsp;return timePattern;<br>&nbsp;}</p>
<p>&nbsp;public void setTimePattern(String timePattern) {<br>&nbsp;&nbsp;this.timePattern = timePattern;<br>&nbsp;}</p>
<p>&nbsp;public void destroy() {<br>&nbsp;&nbsp;// TODO 自动生成方法存根<br>&nbsp;&nbsp;DateFormat df = new SimpleDateFormat(getTimePattern());<br>&nbsp;&nbsp;Calendar rightNow = Calendar.getInstance();<br>&nbsp;&nbsp;Date now = rightNow.getTime();<br>&nbsp;&nbsp;System.out.println("The service shutdown at --&gt; "+df.format(now));<br>&nbsp;}</p>
<p>&nbsp;public void init(ActionServlet actionServlet, ModuleConfig moduleConfig)<br>&nbsp;&nbsp;&nbsp;throws ServletException {<br>&nbsp;&nbsp;DateFormat df = new SimpleDateFormat(getTimePattern());<br>&nbsp;&nbsp;Calendar rightNow = Calendar.getInstance();<br>&nbsp;&nbsp;Date now = rightNow.getTime();<br>&nbsp;&nbsp;System.out.println("The service start at ---&gt; "+df.format(now));</p>
<p>&nbsp;}</p>
<p>}<br>相关配置<br>&lt;plug-in className="dgut.ke.struts.plugIn.MyPlugIn"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;set-property property="timePattern" value="yyyy-MM-dd" /&gt;<br>&nbsp; &lt;/plug-in&gt;</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/140637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-08-28 19:18 <a href="http://www.blogjava.net/keweibo/articles/140637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ForwardAction和IncludeAction</title><link>http://www.blogjava.net/keweibo/articles/139960.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Mon, 27 Aug 2007 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/139960.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/139960.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/139960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/139960.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/139960.html</trackback:ping><description><![CDATA[<p><span style="COLOR: red"><strong><em>ForwardAction</em></strong></span></p>
<p>&nbsp;&nbsp;基于struts的WEB应用系统通常情况下应该避免JSP页面之间的跳转.因为这样跳转的用户请求没有<br>经过Struts的处理,会导致很多在Struts框架中进行的处理不起的作用.<br>&nbsp;&nbsp;对于每个用户的请求,struts的RequestProcessor将会进行一系列的处理,其中包括了国际化,权限<br>缓存等多方面.如果采用页面之间的直接跳转会导致很多内容都需要自己处理.</p>
<p>在struts中配置ForwardAction<br>&nbsp;&nbsp;&lt;action path="home"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type="org.apache.struts.actions.ForwardAction"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameter="/index.jsp"<br>&nbsp;&nbsp;/&gt;<br>&nbsp;&nbsp;其中path属性是Action的匹配路径,type属性说明实现Action的类,parameter属性用于指定往哪转发<br>也就是转发的目的URI.这三个属性是必须的,其它的可以省略.<br>forward属性和ForwardAction<br>&nbsp;&nbsp;使用forward进行页面跳转的配置方法如下<br>&nbsp;&nbsp;&lt;action path="/home"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forward="/index.jsp"<br>&nbsp;&nbsp;/&gt;<br>&nbsp;&nbsp;forward属性和ForardAction在页面中使用时是没有区别的,并且在通常情况下struts对这两种形式<br>的跳转的处理也是相同的.但是使用自己的RequestProcessor并且覆盖了父类的processForwardConfig()<br>方法时,这两种方式就存在一定的区别了.</p>
<p><strong><em style="COLOR: red">IncludeAction</em></strong></p>
<p>&nbsp;&nbsp;IncludeAction类的意义类似于ActionForward类,它和页面中的&lt;jsp:include&gt;动作或Servlet中的<br>RequestDispatcher的include()方法执行的功能一样的.在基于struts框架结构的应用中,最好不要在<br>&lt;jsp:include&gt;标记中直接引用另一个JSP页面,而是通过IncludeAciton来实现页面之间的引用,这样比较<br>安全等等.<br>&nbsp;&nbsp;IncludeAction的使用<br>IncludeAction的使用和Forward基本相同,在页面中还可以通过&lt;jsp:include&gt;标记来调用.<br>&lt;jsp:include page="/somePath/someAction.do" /&gt;<br>&nbsp;&nbsp;IncludeAction的配置<br>&nbsp;&nbsp;&lt;action path="/include"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type="org.apache.struts.actions.IncludeAction"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameter="/include.jsp"<br>&nbsp;&nbsp;/&gt;<br>&nbsp;&nbsp;include属性和IncludeAction<br>&nbsp;&nbsp;Struts也可以通过使用include属性来在Action的配置文件中直接定义被引用的页面.如<br>&nbsp;&nbsp;&lt;action path="/include"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include="/include.jsp"<br>&nbsp;&nbsp;/&gt;<br></p>
<img src ="http://www.blogjava.net/keweibo/aggbug/139960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-08-27 15:18 <a href="http://www.blogjava.net/keweibo/articles/139960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ActionForm中对集合属性的处理</title><link>http://www.blogjava.net/keweibo/articles/139821.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Mon, 27 Aug 2007 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/139821.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/139821.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/139821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/139821.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/139821.html</trackback:ping><description><![CDATA[<p>package com.ke.struts.bean;</p>
<p>import java.util.ArrayList;<br>import java.util.List;</p>
<p>import javax.servlet.http.HttpServletRequest;</p>
<p>import org.apache.struts.action.ActionErrors;<br>import org.apache.struts.action.ActionForm;<br>import org.apache.struts.action.ActionMapping;</p>
<p><br>public class ActionForm extends ActionForm {<br><br>&nbsp;private List&lt;String&gt; friends = new ArrayList&lt;String&gt;();<br>&nbsp;private static String[] skillLevels = new String[]{"Beginner","Intermediate","Advanced"};<br>&nbsp;private Map&lt;String,Object&gt; skills = new HashMap&lt;String,Object&gt;();<br>&nbsp;<br><br>public ActionErrors validate(ActionMapping mapping,<br>&nbsp;&nbsp;&nbsp;HttpServletRequest request) {<br>&nbsp;&nbsp;// TODO Auto-generated method stub<br>&nbsp;&nbsp;return null;<br>&nbsp;}<br>&nbsp;public void reset(ActionMapping mapping, HttpServletRequest request) {<br><br>&nbsp;&nbsp;this.friends.clear();<br>&nbsp;}<br>&nbsp;public Object getSkill(String key)<br>&nbsp;{<br>&nbsp;&nbsp;return skills.get(key);<br>&nbsp;}<br>&nbsp;public void setSkill(String key,Object value)<br>&nbsp;{<br>&nbsp;&nbsp;skills.put(key, value);<br>&nbsp;}<br>&nbsp;public Map getSkills()<br>&nbsp;{<br>&nbsp;&nbsp;return skills ;<br>&nbsp;}<br>&nbsp;public String[] getSkillLevels()<br>&nbsp;{<br>&nbsp;&nbsp;return skillLevels;<br>&nbsp;}<br>&nbsp;public List&lt;String&gt; getFriends() {<br>&nbsp;&nbsp;return friends;<br>&nbsp;}</p>
<p>&nbsp;public void setFriends(List&lt;String&gt; friends) {<br>&nbsp;&nbsp;this.friends = friends;<br>&nbsp;}<br>&nbsp;<br>&nbsp;public void setFriend(int index,String friend)<br>&nbsp;{<br>&nbsp;&nbsp;if(this.friends.size() &gt; index)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;/*用指定的元素替代此列表中指定位置上的元素*/<br>&nbsp;&nbsp;&nbsp;this.friends.set(index, friend);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;while(this.friends.size() &lt; index)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;this.friends.add(null);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;this.friends.add(index, friend);<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;<br>&nbsp;public String getFriend(int index)<br>&nbsp;{<br>&nbsp;&nbsp;if(this.friends.size() &gt; index)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;return (String)this.friends.get(index);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;return null ;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>}<br>输入页面<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Friend 1 :&lt;html:text property="friend[0]"&gt;&lt;/html:text&gt;&lt;br&gt;&nbsp;&nbsp;<span style="COLOR: red">&nbsp;&lt;!--&nbsp;调用setFriend(int index,String friend)--&gt;<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Friend 2 :&lt;html:text property="friend[1]"&gt;&lt;/html:text&gt;&lt;br&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Friend 3 :&lt;html:text property="friend[2]"&gt;&lt;/html:text&gt;&lt;br&gt;<br>java skill: &lt;html:select property="skill(java)"&gt;&nbsp;&nbsp;<span style="COLOR: red">&nbsp;&lt;!--&nbsp;调用setSkill(String key,Object value) --&gt;<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;html:options property="skillLevels"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:select&gt;&lt;br&gt;<br>&nbsp;&nbsp;jsp skill:&lt;html:select property="skill(jsp)"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;html:options property="skillLevels"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/html:select&gt;&lt;br&gt;<br>&nbsp;&nbsp;struts skill:&lt;html:select property="skill(struts)"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;html:options property="skillLevels"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:select&gt;&lt;br&gt;<br></p>
输出页面<br>&nbsp;&nbsp;&nbsp;&nbsp;Friend 1:&lt;bean:write name="ActionForm" property="friend[0]"/&gt;&lt;br&gt;<font color=#ff0000>&lt;!--&nbsp;调用getFriend(int index)--&gt;</font><br>&nbsp;&nbsp;&nbsp;&nbsp;Friend 2:&lt;bean:write name="ActionForm" property="friend[1]"/&gt;&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;Friend 3:&lt;bean:write name="ActionForm" property="friend[2]"/&gt;&lt;br&gt; <br>&nbsp;&nbsp;java skill :&lt;bean:write name="ActionForm" property="skill(java)"/&gt;&lt;br&gt;<font color=#ff0000>&lt;!--&nbsp;调用getSkill(String key) --&gt;</font><br>&nbsp;&nbsp;jsp skill :&lt;bean:write name="ActionForm" property="skill(jsp)"/&gt;&lt;br&gt;<br>&nbsp;&nbsp;struts skill :&lt;bean:write name="ActionForm" property="skill(struts)"/&gt;<br><br>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/139821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-08-27 11:09 <a href="http://www.blogjava.net/keweibo/articles/139821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>柱状图显示</title><link>http://www.blogjava.net/keweibo/articles/139803.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Mon, 27 Aug 2007 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/139803.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/139803.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/139803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/139803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/139803.html</trackback:ping><description><![CDATA[<p>&lt;%@ page language="java" contentType="text/html;charset=gbk"%&gt;<br>&lt;%@ taglib uri="<a href="http://java.sun.com/jsp/jstl/core">http://java.sun.com/jsp/jstl/core</a>" prefix="c" %&gt;</p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br>&lt;html&gt;<br>&nbsp; &lt;head&gt;<br>&nbsp;&nbsp;&nbsp; &lt;title&gt;柱状图显示页面&lt;/title&gt;<br>&nbsp; &lt;/head&gt;<br>&nbsp; &lt;body&gt; <br>&nbsp;&nbsp;&nbsp; &lt;div align="center"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h3&gt;Color Bar Chart (horizontal)&lt;/h3&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;table width="60%"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:forEach var="col" items="${weekWeather}"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td align="right" width="20%"&gt;${col.item }(${col.percent }%)&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td align="left" width="80%"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #ff00ff">&lt;table width="100%" height="20"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td width="${col.percent }%" bgcolor="#003366"&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td width="${100-col.percent }%"&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/c:forEach&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;hr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h3&gt;Color BAr Chart (vertical)&lt;/h3&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;table width="300" height="500"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:forEach var="row" items="${weekWeather }"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #ff00ff">&lt;table width="100%" height="100%"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;td height="${100-row.percent }%"&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td height="${row.percent }%" bgcolor="#006633"&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td align="center"&gt;${row.item }(${row.percent }%)&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/c:forEach&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br>&nbsp; &lt;/body&gt;<br>&lt;/html&gt;<br></p>
<img src ="http://www.blogjava.net/keweibo/aggbug/139803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-08-27 10:41 <a href="http://www.blogjava.net/keweibo/articles/139803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts中AtionErrors和ActionMessages的区别(转)</title><link>http://www.blogjava.net/keweibo/articles/138223.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Mon, 20 Aug 2007 12:26:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/138223.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/138223.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/138223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/138223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/138223.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.blogjava.net/mrklmxy/archive/2007/07/13/130164.html"><font color=#009933>struts中AtionErrors和ActionMessages的区别 </font></a></h2>
<p>尽管Struts框架提供了有效的异常处理机制，但不能保证处理所有的错误，这时Struts框架会把错误抛给Web容器，在默认情况下Web容器会向用户浏览器直接返回原始信息。如果想避免直接让用户看到这些原始信息，可以在web.xml中配置&lt;error-page&gt;元素，以下代码演示了如何避免用户看到HTTP 404、HTTP 500错误和Exception异常。<br><br>web.xml:<br>&nbsp; &lt;error-page&gt;<br>&nbsp; &nbsp; &lt;error-code&gt;404&lt;/error-code&gt;<br>&nbsp; &nbsp; &lt;location&gt;/exception/error404.jsp&lt;/location&gt;<br>&nbsp; &lt;/error-page&gt;<br>&nbsp; &lt;error-page&gt;<br>&nbsp; &nbsp; &lt;error-code&gt;500&lt;/error-code&gt;<br>&nbsp; &nbsp; &lt;location&gt;/exception/error500.jsp&lt;/location&gt;<br>&nbsp; &lt;/error-page&gt;<br>&nbsp; &lt;error-page&gt;<br>&nbsp; &nbsp; &lt;exception-type&gt;java.lang.Exception&lt;/exception-type&gt;<br>&nbsp; &nbsp; &lt;location&gt;/exception/default.jsp&lt;/location&gt;<br>&nbsp; &lt;/error-page&gt;<br>当WEB容器捕获到exception-type或error-code指定的错误时将跳到由location指定的页面。<br><br> 问题：当form bean 为动态bean时，在action中无法对form bean数据进行验证，因为formbean没有具体实现类。action中无法引用<br> ActionError/ActionErrors/ActionMessage/ActionMessages:<br><br>有时候你需要向用户提供相关处理信息，包括表单验证时发现错误等。<br>1. 相关类介绍：<br>ActionMessage：用于保存一个与资源束对应的提示信息。主要构造函数如：<br>ActionMessage(String message)；<br>ActionMessage(String message,paramater)。<br><br>ActionMessages:用于保存多个ActionMessage。并在html:errors 和html:messages中起作用。<br>主要构造函数：<br>ActionMessages().<br>主要方法是add(String property,ActionMessage message)<br>ActionMessages有一个HashMap类型messages保存多个ActionMessage对象，每个ActionMessage对象都有唯一的一个property标识。这个property可以是自定义的任意字符串，也可以由org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE指定<br>html:messages/html:errors使用property属性访问某个资源<br><br>ActionErrors：用于保存一个与资源束对应的错误信息。用法跟ActionMessages差不多。<br>ActionError不赞成使用。<br><br><br>2. 版本：<br>struts1.1中用ActionErrors报告错误，用ActionMessages提供信息。<br>在struts1.2中使用ActionMessages提供信息和错误，不赞成使用ActionError<br>struts1.3中已经没有ActionError类了。<br><br>3． AtionErrors和ActionMessages的区别<br><br>1． ActionErrors是ActionMessages的一个子类，功能几乎相同，不同点在于标签&lt;html:errors/&gt;和&lt;html:messages&gt;的使用上的区别。<br>html:errors指定了footer和header属性。默认值为errors.header和errors.footer,需要时可以自己指定。如果资源属性文件配置了 errors.header和errors.footer，则任何时候使用html:errors时开头和结尾都是这两个属性对应的资源信息。<br>而html:message默认情况下没有errors.header和errors.footer值，当然可以自己指定。<br><br>2． html:errors可以根据property属性指定显示一个错误信息。html:messages有一个必添项id。html:messages不能直接显示信息，它将选出的信息放入一个用id标识的Iterator对象里，然后在用ben:write或JSTL c:out标签显示每个信息.例如：<br>&lt;html:messages message="true" id="msg"&gt;<br>&nbsp; &nbsp; &lt;c:out value="${msg}"/&gt;&lt;br /&gt;<br>&lt;/html:messages&gt;<br><br>3. 具体的一个例子：<br>接受输入页面input.jsp:<br><br>&nbsp; &lt;html:form action="/errormessage/input"&gt;<br>&nbsp; &nbsp; phoneNumber : &lt;html:text property="phoneNumber"/&gt; &lt;html:errors &nbsp; &nbsp; property="&lt;%=org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %&gt;"/&gt;&lt;br/&gt;<br>&nbsp; &lt;html:submit/&gt;&lt;html:cancel/&gt;<br>&nbsp; &lt;/html:form&gt;<br><br>struts-config.xml:<br>&nbsp; &lt;form-beans &gt;<br>&nbsp; &nbsp; &lt;form-bean name="inputForm" type="cn.rolia.struts.form.errorexception.InputForm" /&gt;<br>&nbsp; &lt;/form-beans&gt;<br>&nbsp; &lt;action-mappings &gt;<br>&nbsp; &nbsp; &lt;action<br>&nbsp; &nbsp; &nbsp; attribute="inputForm"<br>&nbsp; &nbsp; &nbsp; input="/errormessage/input.jsp"<br>&nbsp; &nbsp; &nbsp; name="inputForm"<br>&nbsp; &nbsp; &nbsp; path="/errormessage/input"<br>&nbsp; &nbsp; &nbsp; scope="request"<br>&nbsp; &nbsp; &nbsp; type="com.yourcompany.struts.action.errormessage.InputAction"<br>&nbsp; &nbsp; &nbsp; validate="false"&gt;<br>&nbsp; &nbsp; &nbsp; &lt;forward name="success" path="/errormessage/success.jsp" /&gt;<br>&nbsp; &nbsp; &lt;/action&gt;<br>&nbsp; &lt;/action-mappings&gt;<br><br>InputAction.java:<br><br>public ActionForward execute(ActionMapping mapping, ActionForm form,<br>&nbsp; &nbsp; HttpServletRequest request, HttpServletResponse response) {<br>&nbsp; cn.rolia.struts.form.errorexception.InputForm inputForm = (cn.rolia.struts.form.errorexception.InputForm) form;// TODO Auto-generated method stub<br>&nbsp; String phoneNumber = inputForm.getPhoneNumber();<br>&nbsp; if(phoneNumber.length()&lt;4){<br>&nbsp; ActionErrors messages = new ActionErrors();<br>&nbsp; &nbsp; messages.add(org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE,new ActionMessage("error.errormessage.input"));<br>&nbsp; &nbsp; this.saveErrors(request, messages);<br>&nbsp; &nbsp; return mapping.getInputForward();<br>&nbsp; }<br><br>&nbsp; return mapping.findForward("success");<br>}<br>解说：用户输入手机号码，页面跳转到InputAction控制层进行处理，若输入数据小于4，则创建一个ActionMessage类存储相关错误信息。然后再创建ActionErrors类将此ActionMessage放入ActionErrors。再调用Action的saveErrors方法将此ActionErrors保存的request范围里，然后返回input.jsp页面要求重新输入并用html:errors提示错误信息。<br><br>4. Action包含saveErrors()方法和saveMessages()方法。</p>
<p>如果创建的ActionErrors则应该调用saveErrors()，若创建的是ActionMessages则应该调用saveMessages()方法。<br>saveErrors()接收ActionMessages而不是ActionErrors;同时将其保存在request中并用一个由org.apache.struts.Globals.ERROR_KEY指定的常量&#8221; org.apache.struts.Globals.ERROR_KEY&#8221;标识这个ActionMessages，便于html:errors查找。saveMessages()方法接收ActionMessages同时将其保存在request中并用一个由org.apache.struts.Globals.MESSAGE_KEY指定的常量&#8221; org.apache.struts.Globals.MESSAGE_KEY&#8221;标识这个ActionMessages，进而让html:messages从常量Globals.ERROR_KEY中遍历获取信息。可以将其属性message设置为true，那么它将从常量Globals.MESSAGE_KEY中遍历获取信息。<br><br>5. 默认情况下html:messages从如果你想将信息保存在session里而不是request，struts1.2提供了<br>struts1.1没有的saveMessages(HttpSession session, ActionMessages messages)方法和saveErrors(javax.servlet.http.HttpSession session, ActionMessages errors)方法。<br>InputAction.java:<br><br>public ActionForward execute(ActionMapping mapping, ActionForm form,<br>&nbsp; &nbsp; HttpServletRequest request, HttpServletResponse response) {<br>cn.rolia.struts.form.errorexception.InputForm inputForm = (cn.rolia.struts.form.errorexception.InputForm) form;// TODO Auto-generated method stub<br>&nbsp; String phoneNumber = inputForm.getPhoneNumber();<br>&nbsp; if(phoneNumber.length()&lt;4){<br>&nbsp; &nbsp; ActionErrors messages = new ActionErrors();<br>&nbsp; &nbsp; messages.add(org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE,new ActionMessage("error.errormessage.input"));<br>&nbsp; &nbsp; this.saveErrors(request.getSession(true), messages);<br>&nbsp; &nbsp; return mapping.getInputForward();<br>&nbsp; }<br><br>&nbsp; return mapping.findForward("success");<br>} </p>
<img src ="http://www.blogjava.net/keweibo/aggbug/138223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-08-20 20:26 <a href="http://www.blogjava.net/keweibo/articles/138223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts标签库(转)</title><link>http://www.blogjava.net/keweibo/articles/138222.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Mon, 20 Aug 2007 12:23:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/138222.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/138222.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/138222.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/138222.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/138222.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一.html标签1.html元素的标签:a1.&lt;html:link forward="index"&gt; 链接&lt;global-forwards&gt;中的name &lt;/html:link&gt;a2. &lt;html:link href="http://www.baidu.com" &gt; 链接到站点外&nbsp;&nbsp; &lt;/html:link&gt...&nbsp;&nbsp;<a href='http://www.blogjava.net/keweibo/articles/138222.html'>阅读全文</a><img src ="http://www.blogjava.net/keweibo/aggbug/138222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-08-20 20:23 <a href="http://www.blogjava.net/keweibo/articles/138222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Action中添加请求参数</title><link>http://www.blogjava.net/keweibo/articles/138088.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Mon, 20 Aug 2007 04:29:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/138088.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/138088.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/138088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/138088.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/138088.html</trackback:ping><description><![CDATA[添加一个查询参数到URI中，在添加之前应进行检查。<br>Action中的内容<br>ActionForward&nbsp; forwrad&nbsp; =&nbsp;&nbsp; mapping . findForward(" show" );<br><br>StringBuffered path = new StringBuffered(forward.getPath());<br><br>if (&nbsp;path.indexOf("?") &gt;= 0&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path.append(" &amp;nbsp;paramId=paramValue");<br>}<br>else<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path.append("?paramId=paramValue");<br>}<br><br>return new ActionForward( path.toString() );<br><br>struts-config.xml中的内容<br><br>&lt;forward&nbsp; name="show"&nbsp; path="/show.jsp"&nbsp; /&gt;<br><br>
<img src ="http://www.blogjava.net/keweibo/aggbug/138088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-08-20 12:29 <a href="http://www.blogjava.net/keweibo/articles/138088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts中配置Validator插件</title><link>http://www.blogjava.net/keweibo/articles/137801.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Sat, 18 Aug 2007 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/137801.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/137801.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/137801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/137801.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/137801.html</trackback:ping><description><![CDATA[&lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" /&gt;<br>&nbsp;&lt;/plug-in&gt;<br>required : 强制某个域不能为空，它没有参数。<br>validwhen : 通过一个域的值来检查另一个域的值。<br>minlength ; 检查用户输入的数据长度不小于某个指定的值，需要一个最小的长度变量。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;配置方法如下<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field property="username" depends="required,minlength"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg key="form.username" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg position="1" name="minlength" key="${var : minlength}" resource="false" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-name&gt;minlength&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-value&gt;6&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/field&gt;<br>maxlength : 检查用户输入的最大长度。具体配置方法参照上面minlength的配置。<br>mask : 根据正则表达式来检查数据的格式，它需要一个正则表达式掩码变量。从struts1.1开始，正则表达式必须以&#8220;^&#8221;开始并以&#8220;$&#8221;结束，其配置如下<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field property="username" depends="mask"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg key="form.username" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-name&gt;mask&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-value&gt;^[a-zA-Z]*$&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/field&gt;<br>data : 检查一个域是否可以被转换成Data对象。它使用java.text.SimpleDateFormat来进行分析和检验，它可以使用dataPatten或者dataPattenStrict(这个比较严格，它要求输入的数据长度必须与模式中的指定长度一致）例如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field property="birthday" depends="date"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg key="form.date"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-name&gt;dataPattern&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-value&gt;yyyy-MM-dd&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/field&gt;<br>intRange&nbsp; /&nbsp; floatRange&nbsp; /&nbsp; doubleRange :&nbsp;检验一个整数 / 浮点数 / 双精度浮点数 的值是否在一个指定的范围内，需要最大值和最小值来指定范围。这些检验分别要依赖于 integer&nbsp; /&nbsp; float&nbsp; / double&nbsp; 检验，所以也要要求将它们也指定到depends属性中。它定义的方法如下（这里以intRange为例）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field proerty="age" depends="required,integer,intRange"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg position="0" key="form.age" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg position="1"&nbsp;name="intRange" key="${var :&nbsp;min }" resource="false" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg position="2"&nbsp;name="intRange" key="${var :&nbsp;max}" resource="false" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-name&gt;min&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-value&gt;6&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-name&gt;max&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-value&gt;16&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/var&gt;<br>creditCard&nbsp;: 检验一个信用卡的格式是否正确，不需要任何参数，它的定义如下。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field property="card" depends="required,creditCard"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg key="form.card" /&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/field&gt;<br>email :&nbsp;检验电子邮件地址格式是否正确，不需要任何参数，它的定义如下。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field property="email" depends="required,email"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg key="form.email"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/field&gt;<br>url :&nbsp;检验URL的格式是否正确。它有四个参数，分别是allowallschemes,allow2slashes,nofragments和schemes 。<br>&nbsp;&nbsp;&nbsp;allowallschemes :&nbsp;用来指明是否允许所有的schemes&nbsp;。它的值可以为true(允许）/&nbsp; false（禁止），默认值为false。如果这个值被设置为真，那么将会忽略schemes变量。<br>&nbsp;&nbsp;&nbsp;allow2slashes : 用来指明是否允许两个&#8220;/&#8221;出现。它的值可以为true(允许）/&nbsp; false（禁止），默认值为false。<br>&nbsp;&nbsp;&nbsp;nofragments : 用来说明是否不允许分段。它的值可以为true(不允许）/&nbsp; false（允许），默认值为false。<br>&nbsp;&nbsp;&nbsp;schemes : 指定合法的schemes，多个可以用逗号分隔。如果没有进行指定，那么默认为http , https ,&nbsp; 和&nbsp;ftp&nbsp; 。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url检验的方法如下<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field proper="custUrl" depends="url" &gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg key = "form.coutUrl" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/field&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field proper="custUrl" depends="url" &gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg key = "form.coutUrl" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-name&gt;nofragments&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-value&gt;true&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-name&gt;schemes&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-value&gt;http,https,telnet,file&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/field&gt;<br>验证两个输入域是否相等<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field property="password2" depends="required,validwhen"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg position="0" key="form.password2" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg position="1" key="form.password" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;msg name="validwhen" key="error.password.mathch"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-name&gt;test&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-value&gt;(*this* == password)&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/field&gt;<br><br><br>初始化配置文件<br>&nbsp;validation.xml内容如下<br>&nbsp;&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN" "validator_1_1_3.dtd" &gt;<br>&lt;form-validation&gt;<br>&nbsp;&lt;formset&gt;<br>&nbsp;&nbsp;&lt;form name="userForm"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field proper="" depends=""&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....................................<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/field&gt;<br>&nbsp;&nbsp;&lt;/form&gt;<br>&nbsp;&lt;/formset&gt;<br>&lt;/form-validation&gt;<br>-------------------------------------------------------------------------------------------------------------------------------<br>Validator的调用配置<br>Validator的调用方法要依据所采用的验证方式而定。<br>&nbsp;&nbsp;&nbsp;后台服务器端验证<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Action中的Validate属性值设为 true<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还有在页面中通过&lt;html:errors /&gt;标记来显示错误信息<br>&nbsp;&nbsp;&nbsp;前台Javascrip验证<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Action中的Validate属性值设为 false<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还有在页面用使用&lt;html:javascript /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;html:form onsubmit="return ValidateXXXForm(this)" &gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/html:form&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;html:javascript forName="XXXForm" /&gt;<br>
<img src ="http://www.blogjava.net/keweibo/aggbug/137801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-08-18 13:02 <a href="http://www.blogjava.net/keweibo/articles/137801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重写ActionServlet解决乱码</title><link>http://www.blogjava.net/keweibo/articles/137536.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Fri, 17 Aug 2007 06:09:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/137536.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/137536.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/137536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/137536.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/137536.html</trackback:ping><description><![CDATA[<p>写一个MyActionServlet来并覆盖ActionServlet中的process（）方法。<br>添加一行代码:request.setCharacterEncoding("gbk");就可以了.</p>
<p>package com.ke.struts;</p>
<p>import java.io.IOException;<br>import javax.servlet.ServletException;<br>import javax.servlet.http.HttpServletRequest;<br>import javax.servlet.http.HttpServletResponse;</p>
<p>import org.apache.struts.action.ActionServlet;</p>
<p>public class MyActionSerlvet extends ActionServlet <br>{</p>
<p>&nbsp;@Override<br>&nbsp;protected void process(HttpServletRequest request,<br>&nbsp;&nbsp;&nbsp;HttpServletResponse response) throws IOException, ServletException {<br>&nbsp;&nbsp;request.setCharacterEncoding("gbk");<br>&nbsp;&nbsp;super.process(request, response);<br>&nbsp;}<br>&nbsp;<br>}</p>
<p>当然别忘了改一下web.xml里面的配置 <br>&nbsp; &lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.ke.struts.MyActionSerlvet&lt;/servlet-class&gt;&lt;!-- 需要修改的地方 --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br>&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;3&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br>&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;detail&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;3&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br>&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;0&lt;/load-on-startup&gt;<br>&nbsp; &lt;/servlet&gt;</p>
<p>&nbsp; &lt;servlet-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br>&nbsp; &lt;/servlet-mapping&gt;</p>
<p>改一下servlet-class标签中的内容就可以！</p>
<p>真的可以，一劳用yi！</p>
<p>具体编码的理论就不说了，google上已经够多了。</p>
<p>另外，如果不用struts的话，hibernate也可能碰到中文乱码问题，<br>只要在hibernate.cfg.xml配置中如下：</p>
<p>&lt;property name="hibernate.connection.url"&gt;&nbsp;&nbsp; jdbc:microsoft:sqlserver://Localhost:1433;SelectMethod=cursor;characterEncoding=GBK;DatabasName=myDatabase.&nbsp; <br>&lt;/property&gt;</p>
<p>characterEncoding=GBK！就可以了</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/137536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-08-17 14:09 <a href="http://www.blogjava.net/keweibo/articles/137536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使Struts 中的 properties属性的文件支持中文的插件的安装方法</title><link>http://www.blogjava.net/keweibo/articles/137531.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Fri, 17 Aug 2007 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/137531.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/137531.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/137531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/137531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/137531.html</trackback:ping><description><![CDATA[<p>使Struts 中的 properties属性的文件支持中文的插件的安装方法<br>&nbsp;在此想和大家分享一个不错的编写properties文件的Eclipse插件（plugin），<br>有了它我们在编辑一些简体中文、繁体中文等Unicode文本时，就不必再使用native2ascii编码了。<br>您可以通过Eclipse中的软件升级（Software Update）安装此插件，步骤如下：</p>
<p>1、展开Eclipse的Help菜单，将鼠标移到Software Update子项，在出现的子菜单中点击Find and Install；<br>2、在Install/Update对话框中选择Search for new features to install，点击Next；<br>3、在Install对话框中点击New Remote Site；<br>4、在New Update Site对话框的Name填入&#8220;PropEdit&#8221;或其它任意非空字符串，<br>&nbsp;在URL中填入<a href="http://propedit.sourceforge.jp/eclipse/updates/">http://propedit.sourceforge.jp/eclipse/updates/</a>；<br>5、在Site to include to search列表中，除上一步加入的site外的其它选项去掉，点击Finsih；<br>6、在弹出的Updates对话框中的Select the features to install列表中将所有结尾为&#8220;3.1.x&#8221;的选项去掉<br>&nbsp;（适用于Eclipse 3.2版本的朋友）；<br>7、点击Finish关闭对话框；<br>8、在下载后，同意安装，再按提示重启Eclipse，在工具条看到形似vi的按钮表示安装成功，插件可用。<br>&nbsp;此时，Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。<br>&nbsp;<br></p>
<img src ="http://www.blogjava.net/keweibo/aggbug/137531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2007-08-17 14:05 <a href="http://www.blogjava.net/keweibo/articles/137531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>