﻿<?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-study-随笔分类-Struts1</title><link>http://www.blogjava.net/lzj520/category/15591.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 31 Jan 2008 20:54:30 GMT</lastBuildDate><pubDate>Thu, 31 Jan 2008 20:54:30 GMT</pubDate><ttl>60</ttl><item><title>SSH集成Fckeditor</title><link>http://www.blogjava.net/lzj520/archive/2008/01/31/178672.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Thu, 31 Jan 2008 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2008/01/31/178672.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/178672.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2008/01/31/178672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/178672.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/178672.html</trackback:ping><description><![CDATA[使用Fckeditor的话，如果文本内容过长，可以自己去设计一个分页的方法。我想了一个方法，是另外建立2个表，为一对多关系：文章表——页面表。输入方式是用一个大的表单，里面可以有一个ADD的按钮来自行使用DOM来增加TEXT输入框数目，一个TEXT输入框为一个页。提交之后批量添加到页面表里，一个页面是一条记录。显示的时候按照平时做分页的方法来做。下面先贴上正常使用FCKeditor的方法：<br />
<br />
去下载了FCKeditor_2.5.1.zip和FCKeditor-2.3.zip，一个是JAVA版本的文件，一个是FCK原本的文件。摆放的方式大概如下图：<br />
<img height="525" alt="" src="http://www.blogjava.net/images/blogjava_net/lzj520/080131.jpg" width="414" border="0" /><br />
<br />
<strong>web.xml</strong>加入代码：<br />
<br />
<p>&nbsp;&lt;!-- fckeditor --&gt;</p>
<p>&nbsp; &lt;servlet&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Connector&lt;/servlet-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.fredck.FCKeditor.connector.ConnectorServlet&lt;/servlet-class&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;baseDir&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 此为文件浏览路径 --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/UserFiles/&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/servlet&gt; </p>
<p>&nbsp;&nbsp;&nbsp; &lt;servlet&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;SimpleUploader&lt;/servlet-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.fredck.FCKeditor.uploader.SimpleUploaderServlet&lt;/servlet-class&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;baseDir&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 此为文件上传路径，需要在WebRoot 目录下新建 UserFiles 文件夹 --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 根据文件的类型还需要新建相关的文件夹 Image、 Flash --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/UserFiles/&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 此参数为是否开启上传功能 --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;enabled&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;false&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;AllowedExtensionsFile&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 此参数为文件过滤，以下的文件类型都不可以上传 --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;DeniedExtensionsFile&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;php|php3|php5|phtml|asp|aspx|ascx|jsp|cfm|cfc|pl|bat|exe|dll|reg|cgi&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;AllowedExtensionsImage&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;jpg|gif|jpeg|png|bmp&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;DeniedExtensionsImage&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;AllowedExtensionsFlash&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;swf|fla&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;DeniedExtensionsFlash&lt;/param-name&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;&lt;/param-value&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;&nbsp;&nbsp; </p>
<p>&nbsp; &lt;servlet-mapping&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Connector&lt;/servlet-name&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector&lt;/url-pattern&gt; <br />
&nbsp; &lt;/servlet-mapping&gt; </p>
<p>&nbsp; &lt;servlet-mapping&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;SimpleUploader&lt;/servlet-name&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/FCKeditor/editor/filemanager/upload/simpleuploader&lt;/url-pattern&gt; <br />
&nbsp; &lt;/servlet-mapping&gt;<br />
<br />
输入的jsp文件类似如下：<br />
<br />
&nbsp; &lt;html:form action="/fck" method="post"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;fck:editor id = "fcktext" basePath = "/new1/FCKeditor/" <br />
&nbsp;&nbsp;&nbsp; height = "100%" <br />
&nbsp;&nbsp;&nbsp; skinPath = "/new1/FCKeditor/editor/skins/default/" <br />
&nbsp;&nbsp;&nbsp; toolbarSet = "Default" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imageBrowserURL = "/new1/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&amp;Connector=connectors/jsp/connector" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linkBrowserURL = "/new1/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=connectors/jsp/connector" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flashBrowserURL = "/new1/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Flash&amp;Connector=connectors/jsp/connector" <br />
&nbsp;&nbsp;&nbsp; imageUploadURL = "/new1/FCKeditor/editor/filemanager/upload/simpleuploader?Type=Image" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linkUploadURL = "/new1/FCKeditor/editor/filemanager/upload/simpleuploader?Type=File" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flashUploadURL = "/new1/FCKeditor/editor/filemanager/upload/simpleuploader?Type=Flash" &gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/fck:editor&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;html:submit/&gt;&lt;html:cancel/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/html:form&gt; <br />
<br />
其中的id是对应于ActionForm与validationv.xml里的property。分别类似如下：<br />
<br />
&nbsp;&nbsp;String strfcktext = fckForm.getString("fcktext");<br />
<br />
&lt;form name="fckForm"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field property="fcktext" depends="required"&gt; <br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;arg key="fckForm.fcktext"/&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;/field&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&lt;/form&gt;<br />
<br />
另外需要注意的是，如果显示找不到页面的错误，应该是form里FCK相关的路径设置不正确。数据库段的字段也需要设置足够大。如果传输过程里出现乱码，可以所有jsp页面加入：&lt;%@ page language="java" contentType="text/html; charset=UTF-8"%&gt;，在web.xml里加入u-f8 filter：<br />
<br />
&lt;!-- u-f8 filter --&gt;<br />
&nbsp; &lt;filter&gt;<br />
&nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
&nbsp; &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;<br />
&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp; &lt;param-name&gt;encoding&lt;/param-name&gt;<br />
&nbsp;&nbsp; &lt;param-value&gt;UTF-8&lt;/param-value&gt;<br />
&nbsp; &lt;/init-param&gt;<br />
&nbsp;&lt;/filter&gt;</p>
<p>&nbsp;&lt;filter-mapping&gt;<br />
&nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping&gt;</p>
<p>&nbsp;&lt;filter-mapping&gt;<br />
&nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
&nbsp; &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping&gt;</p>
<img src ="http://www.blogjava.net/lzj520/aggbug/178672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2008-01-31 14:24 <a href="http://www.blogjava.net/lzj520/archive/2008/01/31/178672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts+spring使用随机验证码</title><link>http://www.blogjava.net/lzj520/archive/2008/01/18/176261.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Fri, 18 Jan 2008 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2008/01/18/176261.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/176261.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2008/01/18/176261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/176261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/176261.html</trackback:ping><description><![CDATA[<p><strong>struts-config.xml</strong><br />
<br />
&nbsp;&nbsp;&nbsp; &lt;form-bean name="checkForm" type="org.apache.struts.validator.DynaValidatorForm"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="rand" type="java.lang.String" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form-bean&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;action<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attribute="checkForm"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input="/check/check.jsp"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="checkForm"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path="/check"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope="request"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validate="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="com.yourcompany.struts.action.CheckAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="ok" path="/check/checkok.jsp" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
<br />
<strong>validation.xml</strong><br />
<br />
&nbsp;&nbsp;&nbsp;&lt;form name="checkForm"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field property="rand" depends="required"&gt; <br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;arg key="checkForm.rand"/&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;/field&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&lt;/form&gt;<br />
<br />
<strong>spring config<br />
<br />
</strong>&lt;bean name="/check" class="com.yourcompany.struts.action.CheckAction"/&gt; <br />
<br />
<strong>checkAction.java</strong><br />
<br />
public class CheckAction 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 ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;HttpServletRequest request, HttpServletResponse response) {<br />
&nbsp;&nbsp;DynaValidatorForm checkForm = (DynaValidatorForm) form;// TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*HttpSession session=request.getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strrand = (String)session.getAttribute("rand");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("rand", strrand);*/<br />
&nbsp;&nbsp;return mapping.findForward("ok");<br />
&nbsp;}<br />
}<br />
<br />
<strong>check.jsp</strong></p>
<p>&lt;%@ page language="java" pageEncoding="ISO-8859-1"%&gt;<br />
&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%&gt; <br />
&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%&gt;<br />
&nbsp;<br />
&lt;html&gt; <br />
&nbsp;&lt;head&gt;<br />
&nbsp;&nbsp;&lt;title&gt;JSP for DynaValidatorForm form&lt;/title&gt;<br />
&nbsp;&nbsp;&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />
&nbsp;&nbsp;&lt;META HTTP-EQUIV="Pragma" CONTENT="no-cache"&gt; <br />
&nbsp;&nbsp;&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"&gt; <br />
&nbsp;&nbsp;&lt;META HTTP-EQUIV="Expires" CONTENT="0"&gt;<br />
&nbsp;&lt;/head&gt;<br />
&nbsp;&lt;body&gt;<br />
&nbsp;&nbsp;&lt;html:form action="/check"&gt;<br />
&nbsp;&nbsp;&lt;td&gt;&lt;img border=0 src="check/image.jsp"&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&lt;html:text property="rand"/&gt;&lt;html:errors property="rand"/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;html:submit/&gt;&lt;html:cancel/&gt;<br />
&nbsp;&nbsp;&lt;/html:form&gt;<br />
&nbsp;&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>&nbsp;</p>
<p><strong>checkok.jsp</strong></p>
<p>&lt;%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%&gt;<br />
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;html&gt;<br />
&nbsp; &lt;head&gt;&nbsp;&nbsp; <br />
&nbsp;&lt;meta http-equiv="pragma" content="no-cache"&gt;<br />
&nbsp;&lt;meta http-equiv="cache-control" content="no-cache"&gt;<br />
&nbsp;&lt;meta http-equiv="expires" content="0"&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;<br />
&nbsp;&lt;meta http-equiv="description" content="This is my page"&gt;<br />
&nbsp;&lt;!--<br />
&nbsp;&lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;<br />
&nbsp;--&gt;<br />
&nbsp; &lt;/head&gt;<br />
&nbsp; &lt;body&gt;<br />
&lt;% <br />
&nbsp;String rand = (String)session.getAttribute("rand");<br />
&nbsp;String input = request.getParameter("rand");<br />
&nbsp; if (rand.equals(input)) {<br />
%&gt;<br />
&lt;font color=green&gt;OK&lt;/font&gt;<br />
&lt;%<br />
&nbsp; } else {<br />
%&gt;<br />
&lt;font color=red&gt;FAIL&lt;/font&gt;<br />
&lt;%<br />
&nbsp; }<br />
%&gt;<br />
&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;<br />
<br />
<strong>image.jsp</strong><br />
</p>
<p>&lt;%@ page language="java" import="java.util.*" %&gt;<br />
&lt;%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,javax.imageio.*" %&gt;<br />
&lt;%@ page import="java.io.OutputStream" %&gt;<br />
&lt;%!<br />
Color getRandColor(int fc,int bc){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Random random = new Random();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(fc&gt;255) fc=255;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(bc&gt;255) bc=255;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int r=fc+random.nextInt(bc-fc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int g=fc+random.nextInt(bc-fc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int b=fc+random.nextInt(bc-fc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new Color(r,g,b);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
%&gt;<br />
&lt;%<br />
response.setHeader("Pragma","No-cache");<br />
response.setHeader("Cache-Control","no-cache");<br />
response.setDateHeader("Expires", 0);</p>
<p>int width=60, height=20;<br />
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);<br />
OutputStream os=response.getOutputStream();<br />
Graphics g = image.getGraphics();</p>
<p>Random random = new Random();</p>
<p><br />
g.setColor(getRandColor(200,250));<br />
g.fillRect(0, 0, width, height);</p>
<p>g.setFont(new Font("Times New Roman",Font.PLAIN,18));</p>
<p>g.setColor(getRandColor(160,200));<br />
for (int i=0;i&lt;155;i++)<br />
{<br />
&nbsp;int x = random.nextInt(width);<br />
&nbsp;int y = random.nextInt(height);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int xl = random.nextInt(12);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int yl = random.nextInt(12);<br />
&nbsp;g.drawLine(x,y,x+xl,y+yl);<br />
}</p>
<p>String sRand="";<br />
for (int i=0;i&lt;4;i++){<br />
&nbsp;&nbsp;&nbsp; String rand=String.valueOf(random.nextInt(10));<br />
&nbsp;&nbsp;&nbsp; sRand+=rand;</p>
<p>&nbsp;&nbsp;&nbsp; g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));<br />
&nbsp;&nbsp;&nbsp; g.drawString(rand,13*i+6,16);<br />
}</p>
<p>session.setAttribute("rand",sRand);</p>
<p>g.dispose();</p>
<p>ImageIO.write(image, "JPEG",os);<br />
os.flush();<br />
os.close();<br />
os=null;<br />
response.flushBuffer();<br />
out.clear();<br />
out = pageContext.pushBody();<br />
%&gt;</p>
<img src ="http://www.blogjava.net/lzj520/aggbug/176261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2008-01-18 16:09 <a href="http://www.blogjava.net/lzj520/archive/2008/01/18/176261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ssh上传并显示图片</title><link>http://www.blogjava.net/lzj520/archive/2008/01/17/176020.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Thu, 17 Jan 2008 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2008/01/17/176020.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/176020.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2008/01/17/176020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/176020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/176020.html</trackback:ping><description><![CDATA[使用的是将图片保存到服务器，并记录路径名的方式，代码如下：<br />
<br />
<strong>struts部分：<br />
</strong><br />
&nbsp;&lt;form-bean name="upfileForm" type="org.apache.struts.validator.DynaValidatorForm"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="filename" type="java.lang.String" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="filedata" type="org.apache.struts.upload.FormFile" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form-bean&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;action<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attribute="upfileForm"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input="/upload/uploadfile.jsp"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="upfileForm"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path="/upfile"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope="request"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validate="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="com.yourcompany.struts.action.UpfileAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="ok" path="/upload/ok.jsp" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;action path="/displayimg" type="com.yourcompany.struts.action.DisplayimgAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="ok" path="/upload/displayimg.jsp" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
<br />
<p>&nbsp;</p>
<p>public class UpfileAction 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 ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;HttpServletRequest request, HttpServletResponse response) {<br />
&nbsp;&nbsp;DynaActionForm upfileForm = (DynaActionForm) form;// TODO Auto-generated method stub&nbsp;&nbsp; <br />
&nbsp;&nbsp; Image image = new Image();</p>
<p>&nbsp;&nbsp; String strimgname = upfileForm.getString("filename");<br />
&nbsp;&nbsp; image.setImgname(strimgname);<br />
&nbsp;&nbsp; imageDAO.save(image);&nbsp;<br />
&nbsp;&nbsp;FormFile filedata = (FormFile)upfileForm.get("filedata");<br />
&nbsp;&nbsp; ServletContext servletContext = this.getServlet().getServletContext();<br />
&nbsp;&nbsp; String filePath = servletContext.getRealPath("/");<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; InputStream stream = filedata.getInputStream();<br />
&nbsp;&nbsp;&nbsp; OutputStream bos = new FileOutputStream(filePath + "/image/" + filedata.getFileName());<br />
&nbsp;&nbsp;&nbsp;&nbsp; int bytesRead = 0; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] buffer = new byte[8192]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( (bytesRead = stream.read(buffer, 0, 8192)) != -1) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bos.write(buffer, 0, bytesRead); <br />
&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; bos.close(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stream.close();<br />
&nbsp;&nbsp; }catch (FileNotFoundException e) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward("ok");<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;private ImageDAO imageDAO;<br />
&nbsp;public void setImageDAO(ImageDAO dao){<br />
&nbsp;&nbsp;this.imageDAO = dao;&nbsp;&nbsp;<br />
&nbsp;}<br />
&nbsp;<br />
}</p>
<p><br />
&nbsp;</p>
<p>public class DisplayimgAction 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 ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;HttpServletRequest request, HttpServletResponse response) {<br />
&nbsp;&nbsp;// TODO Auto-generated method stub<br />
&nbsp;&nbsp;List results = imageDAO.findAll();<br />
&nbsp;&nbsp;if(results!=null){<br />
&nbsp;&nbsp;&nbsp;HttpSession session=request.getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("results",results);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward("ok");<br />
&nbsp;&nbsp;}return mapping.findForward("fail");<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;private ImageDAO imageDAO;<br />
&nbsp;public void setImageDAO(ImageDAO dao){<br />
&nbsp;&nbsp;this.imageDAO = dao;&nbsp;&nbsp;<br />
&nbsp;}<br />
&nbsp;<br />
}</p>
<p><br />
ImageDAO.java<br />
<br />
&nbsp;public void save(Image transientInstance) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; Session session =this.getSession(); <br />
&nbsp;&nbsp;&nbsp;&nbsp; Transaction tx = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp; tx = session.beginTransaction();<br />
&nbsp;&nbsp;&nbsp;&nbsp; session.save(transientInstance);<br />
&nbsp;&nbsp;&nbsp;&nbsp; tx.commit();<br />
&nbsp;&nbsp;&nbsp;&nbsp; session.evict(transientInstance);<br />
&nbsp;}<br />
<br />
&nbsp;public List findAll() {<br />
&nbsp;&nbsp;Session session =this.getSession(); <br />
&nbsp;&nbsp;Query query = session.createQuery("from Image");<br />
&nbsp;&nbsp;return query.list();<br />
&nbsp;}<br />
<br />
displayimg.jsp<br />
<br />
&lt;logic:iterate id="element" name="results"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp; &lt;td width="100"&gt;&lt;bean:write name="element" property="id"/&gt; &lt;/td&gt;<br />
&nbsp;&nbsp; &lt;td width="100"&gt;&lt;img&nbsp; src="image/&lt;bean:write&nbsp; name='element' property='imgname'/&gt;"/&gt;&lt;/td&gt;<br />
&nbsp;&nbsp; &lt;/tr&gt;<br />
&lt;/logic:iterate&gt;<br />
<br />
uploadfile.jsp<br />
<br />
&lt;html:form action="/upfile" enctype = "multipart/form-data"&gt;<br />
&nbsp;&nbsp;&nbsp;filename : &lt;html:text&nbsp; property="filename"/&gt;&lt;html:errors property="filename"/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;filedata : &lt;html:file property="filedata"/&gt;&lt;html:errors property="filedata"/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;html:submit/&gt;&lt;html:cancel/&gt;<br />
&nbsp;&nbsp;&lt;/html:form&gt;<br />
<br />
</p>
<p>&lt;!-- u-f8 filter --&gt;<br />
&nbsp; &lt;filter&gt;<br />
&nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
&nbsp; &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;<br />
&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp; &lt;param-name&gt;encoding&lt;/param-name&gt;<br />
&nbsp;&nbsp; &lt;param-value&gt;UTF-8&lt;/param-value&gt;<br />
&nbsp; &lt;/init-param&gt;<br />
&nbsp;&lt;/filter&gt;</p>
<p>&nbsp;&lt;filter-mapping&gt;<br />
&nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping&gt;</p>
<p>&nbsp;&lt;filter-mapping&gt;<br />
&nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
&nbsp; &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping&gt;</p>
<img src ="http://www.blogjava.net/lzj520/aggbug/176020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2008-01-17 17:44 <a href="http://www.blogjava.net/lzj520/archive/2008/01/17/176020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH发送邮件的代码</title><link>http://www.blogjava.net/lzj520/archive/2008/01/14/175271.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Mon, 14 Jan 2008 10:10:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2008/01/14/175271.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/175271.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2008/01/14/175271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/175271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/175271.html</trackback:ping><description><![CDATA[直接放代码上来，经过测试成功。使用gmail来作为测试，因为gmail不是使用25端口，并且需要ssl支持，所以需要声明这些部分。<br />
<br />
<strong>serviceContext-moudle_sendmail.xml：<br />
</strong><br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="host" &gt; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;value&gt;smtp.gmail.com&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="javaMailProperties"&gt;<br />
&nbsp;&lt;props&gt;<br />
&nbsp;&lt;prop key="mail.smtp.auth"&gt;true&lt;/prop&gt; <br />
&nbsp;&nbsp; &lt;prop key="mail.smtp.socketFactory.class"&gt;javax.net.ssl.SSLSocketFactory&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;prop key="mail.smtp.socketFactory.fallback"&gt;false&lt;/prop&gt;<br />
&nbsp;&lt;prop key="mail.smtp.timeout"&gt;25000&lt;/prop&gt;<br />
&nbsp;&lt;/props&gt;<br />
&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;property name="port"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;465&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&lt;property name="username"&gt;<br />
&nbsp;&lt;value&gt;your_name@gmail.com&lt;/value&gt;<br />
&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;property name="password"&gt;<br />
&nbsp; &lt;value&gt;your_password&lt;/value&gt;<br />
&nbsp;&lt;/property&gt;&nbsp;&nbsp; <br />
&nbsp;&lt;/bean&gt; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;bean id ="enrollmentMailMessage" class="org.springframework.mail.SimpleMailMessage"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="to"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;value&gt;abc@21cn.com&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="from"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;value&gt;your_name@gmail.com&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="subject"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;value&gt;spring mail test&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&lt;bean id="SendMail" class="com.yourcompany.service.SendMailImpl"&gt;<br />
&nbsp;&lt;property name="mailMessage"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;ref bean="enrollmentMailMessage"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&lt;property name="mailSender"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;ref bean="mailSender"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&lt;/bean&gt;<br />
&lt;/beans&gt;<br />
<br />
<strong>SendMailAction.java</strong><br />
<br />
public ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;HttpServletRequest request, HttpServletResponse response) {<br />
&nbsp;&nbsp;DynaActionForm sendMailForm = (DynaActionForm) form;// TODO Auto-generated method stub<br />
&nbsp;&nbsp;String strcontent = sendMailForm.getString("content");<br />
&nbsp;&nbsp;sendMail.sendmail(strcontent);<br />
&nbsp;&nbsp;return mapping.findForward("ok");<br />
&nbsp;}<br />
&nbsp;private SendMail sendMail;<br />
&nbsp;public void setSendMail(SendMail dao){<br />
&nbsp;&nbsp;this.sendMail = dao;&nbsp;&nbsp;<br />
&nbsp;}<br />
<br />
<strong>SendMail.java</strong><br />
<br />
public interface SendMail {<br />
&nbsp;public void sendmail(String content);<br />
}<br />
<br />
<strong>SendMailImpl.java</strong><br />
<p>public class SendMailImpl implements SendMail {<br />
private MailSender mailSender;<br />
public void setMailSender(MailSender mailSender){<br />
&nbsp;this.mailSender = mailSender;<br />
}<br />
&nbsp;private SimpleMailMessage mailMessage;<br />
&nbsp;public void setMailMessage(SimpleMailMessage mailMessage){<br />
&nbsp;&nbsp;this.mailMessage = mailMessage;<br />
&nbsp;}</p>
<p>&nbsp;public void sendmail(String content){<br />
&nbsp;&nbsp;SimpleMailMessage message = new SimpleMailMessage(this.mailMessage);<br />
&nbsp;&nbsp;StringBuffer messageText = new StringBuffer();<br />
&nbsp;&nbsp;messageText.append(content);<br />
&nbsp;&nbsp;message.setText(messageText.toString());<br />
&nbsp;&nbsp;mailSender.send(message);<br />
&nbsp;}<br />
}</p>
<br />
<strong>struts-config.xml</strong><br />
<br />
&nbsp;&nbsp;&nbsp; &lt;form-bean name="sendMailForm" type="org.apache.struts.validator.DynaValidatorForm"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="content" type="java.lang.String" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form-bean&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;action<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attribute="sendMailForm"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input="/sendmail/SendMail.jsp"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="sendMailForm"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path="/sendMail"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope="request"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validate="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="com.yourcompany.struts.action.SendMailAction" &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="ok" path="/sendmail/SendMailOk.jsp" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
<br />
<strong>SendMail.jsp</strong><br />
<br />
&nbsp;&nbsp;&lt;html:form action="/sendMail"&gt;<br />
&nbsp;&nbsp;&nbsp;content : &lt;html:text property="content"/&gt;&lt;html:errors property="content"/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;html:submit/&gt;&lt;html:cancel/&gt;<br />
&nbsp;&nbsp;&lt;/html:form&gt;<br />
<br />
<strong>validation.xml</strong><br />
<br />
&nbsp;&nbsp;&nbsp;&lt;/form&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form name="sendMailForm"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;field property="content" depends="required"&gt; <br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;arg key="sendMailForm.content"/&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;/field&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&lt;/form&gt;
 <img src ="http://www.blogjava.net/lzj520/aggbug/175271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2008-01-14 18:10 <a href="http://www.blogjava.net/lzj520/archive/2008/01/14/175271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己写了一个ssh分页</title><link>http://www.blogjava.net/lzj520/archive/2008/01/10/174373.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Thu, 10 Jan 2008 10:55:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2008/01/10/174373.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/174373.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2008/01/10/174373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/174373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/174373.html</trackback:ping><description><![CDATA[关于分页经验不是很多，让我来做分页，我习惯用这样的一种方法，以前用ASP和PHP的时候也是这样来处理的。也没怎么认真去检查是否科学，不过先做出来再说，交出一个不怎么好的作品总比交不出作品好。不好的话还可以去完善和优化嘛。<br />
<br />
首先，先创建一个显示每一页（有若干条数据）的方法（如下面的hfindAll方法），决定好每一页接收一个页码参数，然后显示该页码里的数据。比如有100条数据，那么分10页，那第几页显示第几条至第几条数据。然后再创建一个方法是用于在view层显示页数（如下面的amountPage方法），最后是在view层上为每一页数的数字加上超链接。 <br />
<br />
以下是主要代码：<br />
public class LoginDAO extends HibernateDaoSupport {<br />
private int PageSize =5;<br />
/*设置每页的数据条数*/<br />
<br />
&nbsp;public Integer amountPage(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; Session session =this.getSession(); <br />
&nbsp;&nbsp;Query query = session.createQuery("from Login");<br />
&nbsp;&nbsp;query.setCacheable(true);<br />
&nbsp;&nbsp;int a = query.list().size()%PageSize;<br />
/*总记录数/每页数据数,判断是否能整除*/<br />
&nbsp;&nbsp;Integer&nbsp;amount;<br />
&nbsp;&nbsp;if(a!=0){<br />
&nbsp;&nbsp;&nbsp;amount = query.list().size()/PageSize+1;<br />
/*如果整除有余数，则页数加1*/<br />
&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;amount = query.list().size()/PageSize;<br />
/*如果整除没余数，则直接总记录数/每页数据数*/<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return amount;<br />
&nbsp;}<br />
<br />
&nbsp;public List hfindAll(String pagenum) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; Session session =this.getSession(); <br />
&nbsp;&nbsp;Query query = session.createQuery("from Login");<br />
&nbsp;&nbsp;if (pagenum == null){<br />
/*如果pagenum是空，则数据从第一条开始*/<br />
&nbsp;&nbsp;query.setFirstResult(0);<br />
/*设置查询开始的第几条数据，这里是从第1条开始*/<br />
&nbsp;&nbsp;query.setMaxResults(PageSize);<br />
/*设置查询数据条数，这里是5条*/<br />
&nbsp;&nbsp;query.setCacheable(true);<br />
/*设置一级缓存*/<br />
&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;Integer p = (Integer.valueOf(pagenum)-1) * PageSize;<br />
&nbsp;&nbsp;&nbsp;query.setFirstResult(p);<br />
&nbsp;&nbsp;&nbsp;query.setMaxResults(PageSize);<br />
&nbsp;&nbsp;&nbsp;query.setCacheable(true);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return query.list();<br />
&nbsp;}<br />
}<br />
<br />
然后需要解决的是一些数据传递，类型转换和在view层显示的问题，主要代码如下：<br />
<br />
在ACTION里：<br />
String strpagenum = request.getParameter("pagenum");<br />
&nbsp;&nbsp;List results= loginManage.hfind(strpagenum);<br />
&nbsp;&nbsp;Integer amountPage = loginManage.amountPage();<br />
&nbsp;&nbsp;&nbsp; if(results!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession session=request.getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("results",results);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("amountPage",amountPage);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward("ok");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return mapping.findForward("fail");<br />
<br />
在view视图里：<br />
显示每页数据的代码：<br />
<p>&nbsp;&lt;logic:iterate id="element" name="results"&gt;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp; &lt;td width="100"&gt;&lt;input type="checkbox" name="select" value="&lt;bean:write name="element" property="id"/&gt;"&gt;&lt;bean:write name="element" property="id"/&gt;&lt;/td&gt;<br />
&nbsp;&nbsp; &lt;td width="100"&gt;&lt;bean:write name="element" property="name"/&gt; &lt;/td&gt;<br />
&nbsp;&nbsp; &lt;td width="100"&gt;&lt;bean:write name="element" property="password"/&gt;&lt;/td&gt;<br />
&nbsp;&nbsp; &lt;/tr&gt;&lt;/logic:iterate&gt;<br />
<br />
显示页码的代码：<br />
&lt;%<br />
&nbsp;&nbsp; int i;<br />
&nbsp; int a=Integer.parseInt(session.getAttribute("amountPage").toString());<br />
&nbsp;&nbsp; for (i=1;i&lt;=a;i++){<br />
&nbsp;&nbsp; out.println("&lt;tr&gt;");&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;td&gt;&lt;a href='display.do?pagenum="+ i +"'&gt;"+ i +"&lt;/a&gt;&lt;/td&gt;");&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;/tr&gt;");&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; %&gt;</p>
<br />
 <img src ="http://www.blogjava.net/lzj520/aggbug/174373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2008-01-10 18:55 <a href="http://www.blogjava.net/lzj520/archive/2008/01/10/174373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>070825 struts1的ActionForm</title><link>http://www.blogjava.net/lzj520/archive/2007/08/25/139219.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Sat, 25 Aug 2007 01:17:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2007/08/25/139219.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/139219.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2007/08/25/139219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/139219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/139219.html</trackback:ping><description><![CDATA[<p>MyEclipse 6.0 GA for eclipse 3.3已经正式发布了，但还不支持struts2。我还是先用着5.5GA吧。<br><br>struts1里面的ActionForm有分ActionForm和DynaActionForm，如果需要使用Validator的话，也有分为ValidatorForm，ValidatorActionForm，DynaValidatorForm，DynaValidatorActionForm几种。一般用得比较多的是Dyna的Form，而其中又以Validator使用较为普遍。我都试过用，其中DynaValidatorForm和DynaValidatorActionForm比较容易混淆。<br><br>用简单的话说，这2者写法上的区别在于这3个地方：<br><br>1）struts-config.xml：ActionForm type应分别为org.apache.struts.validator.DynaValidatorForm和org.apache.struts.validator.DynaValidatorActionForm<br>2）Action里的分别使用为：DynaActionForm addLoginMemberForm = (DynaActionForm) form;和DynaValidatorActionForm addOrdersForm = (DynaValidatorActionForm) form;<br>3）validation.xml里：DynaValidatorForm引用form的方法是如addLoginMemberForm，用名称，而DynaValidatorActionForm是使用spring里注册的action路径：/addOrders<br><br>很多时候将一个ActionForm公用到多个Action上(两者通过name属性来关联),这时麻烦出来了.由于不同业务处理对数据的有效性验证的要求略有不同,这对处理数据验证的validator框架提供了一个要求----如何根据不同的业务请求,对同一个ActionForm进行不同的数据验证了?</p>
<p>使用DynaValidatorActionForm，校验是根据action元素的path属性值来区分FormBean，而action元素的path属性值正是不同action区分的唯一标记，这样根据不同的action我们对同一个ActionForm给出不同的验证规则了。<br></p>
<img src ="http://www.blogjava.net/lzj520/aggbug/139219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2007-08-25 09:17 <a href="http://www.blogjava.net/lzj520/archive/2007/08/25/139219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>070621 SSH一些出错小结（不断更新）</title><link>http://www.blogjava.net/lzj520/archive/2007/06/21/125513.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Thu, 21 Jun 2007 04:01:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2007/06/21/125513.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/125513.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2007/06/21/125513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/125513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/125513.html</trackback:ping><description><![CDATA[<p>Spring Hibernate在AOP方面的配置冲突<br>Spring2.0 Hibernate3.1.x/Hibernate3.2<br><br>在使用Spring的AOP编程时，会用到这几个lib：<br>asm-2.2.2.jar<br>asm-commons-2.2.2.jar<br>asm-util-2.2.2.jar<br><br>Hibernate如果使用lib：<br>asm.jar<br>asm-attrs.jar<br><br>其中asm-2.2.2.jar与asm.jar存在类上的冲突！！！<br>使用其中之一或两者都使用，可能会出现如下错误：<br>java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor<br>java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor<br>java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit。。。。。。<br><br>解决办法是：<br>1）.去掉类路径上的关于Hibernate的3个lib<br>asm.jar<br>asm-attrs.jar<br>cglib-2.1.3.jar<br>2）.加入Spring中的以下4个lib<br>asm-2.2.2.jar<br>asm-commons-2.2.2.jar<br>asm-util-2.2.2.jar<br>cglib-nodep-2.1_3.jar<br><br>如果再不行，都试试删删看。<br><br><br>java.lang.SecurityException: class "javax.xml.bind.JAXBContext"'s signer information does not match signer information of other classes in the same package<br>这个错误是因为载入的包里面有两个相同路径的类，就是在一个包里面有两个同名的类<br>有可能是将相同的包载入两次或者把包解开后，先将jar文件载入了，后又将解开的类载入了<br><br><br>Error configuring application listener of class org.springframework.web.context.ContextLoaderListener<br>试试自己去下一个spring的包，把包里的spring.jar加到项目里去。eclipse生成的时候可能会有些包没有放进去。<br><br><br>Error creating bean with name 'datasource' defined in file<br>Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool<br>试试将commons-dbcp.jar，commons-pool.jar和commons- collections.jar加入CLASSPATH中<br><br><br>hibernate 3.1 中的hibernateTemplate ，class应该为org.springframework.orm.hibernate3.HibernateTemplate，而非org.springframework.orm.hibernate.HibernateTemplate，因为某些原因我现在还用3.1，早前在玩springside的时候感觉hibernate 3.2 的Hibernate Annotations方便多了。<br><br>找不到action或报错的另一少有原因，一些版本hibernate版本会有些冲突方面的问题，可换一版本的hibernate试试，个人感觉hibernate的版本对应用会比较敏感 <br><br><br><font color=#008080><span style="COLOR: #000000">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in resource [/WEB-INF/dataAccessContext-hibernate.xml] of ServletContext: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/transaction/TransactionManager<br>java.lang.NoClassDefFoundError: javax/transaction/TransactionManager</span><br><br></font>原因：缺少jta.jar&nbsp;或者是找不到hbm.xml文件导致sessionfactory出错,检查hbm文件路径是否正确,文件是否存在<br>&lt;property name="mappingResources"&gt;<br>&nbsp;&nbsp;&lt;list&gt;<br>&nbsp;&nbsp;&lt;value&gt;com/yourcompany/model/Login.hbm.xml<br>&nbsp;&nbsp;&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/list&gt;<br>&nbsp;&nbsp;&lt;/property&gt; <br><br><br>2007-06-26 18:38:13,671 ERROR [com.yourcompany.model.dao.LoginDAO] - &lt;save failed&gt;<br>org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not insert: [com.yourcompany.model.Login]; bad SQL grammar [insert into mysql__login (name, password) values (?, ?)]; nested exception is java.sql.SQLException: Table 'mysql.mysql__login' doesn't exist<br>java.sql.SQLException: Table 'mysql.mysql__login' doesn't exist<br><br>把hbm文件里面的catalog="'mysql"去掉即可！<br>另注意的一点是eclipse生成的DAO文件应该是：<br>&nbsp;&nbsp;&nbsp; public void save(Login transientInstance) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("saving Login instance");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getHibernateTemplate().save(transientInstance);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("save successful");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (RuntimeException re) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.error("save failed", re);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw re;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>而不是原来的&nbsp;&nbsp;&nbsp; public void save(LoginDAO transientInstance) <br><br>只要在applicationContext.xml中加上 <br>&lt;property name="mappingResources"&gt; <br>&lt;list&gt; <br>&lt;value&gt;com/yourcompany/hibernate/Users.hbm.xml&lt;/value&gt; <br>&lt;/list&gt; <br>&lt;/property&gt; <br>加这段代码就会找不到action<br>换一个版本的hibernate应该就ok<br><br><br>Invalid path /addcustomer was requested<br>输入的路径不正确，检查spring中注册的action的路径和输入的路径是否一致，留意大小写是否一致</p>
<img src ="http://www.blogjava.net/lzj520/aggbug/125513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2007-06-21 12:01 <a href="http://www.blogjava.net/lzj520/archive/2007/06/21/125513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>070618 Struts的Validator验证遇到的一些小问题</title><link>http://www.blogjava.net/lzj520/archive/2007/06/18/124917.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Mon, 18 Jun 2007 04:50:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2007/06/18/124917.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/124917.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2007/06/18/124917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/124917.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/124917.html</trackback:ping><description><![CDATA[<p><strong><span></span></strong>&nbsp;</p>
validation.xml提示arg1、arg2出错：<br>检查bundle属性引用的dtd文档是否有相关定义。<br><br>其他出错提示：<br>1、检查bundle属性引用的dtd文档是否有相关定义。2、检查是否有拼写错误。（这个可能性还是挺大的）3、检查一下资源文件是否有问题（这个可能性不大） 
<img src ="http://www.blogjava.net/lzj520/aggbug/124917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2007-06-18 12:50 <a href="http://www.blogjava.net/lzj520/archive/2007/06/18/124917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）在Struts 2.0中国际化(i18n)您的应用程序</title><link>http://www.blogjava.net/lzj520/archive/2006/11/02/78626.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Thu, 02 Nov 2006 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2006/11/02/78626.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/78626.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2006/11/02/78626.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/78626.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/78626.html</trackback:ping><description><![CDATA[<p>国际化是商业系统中不可或缺的一部分，所以无论您学习的是什么Web框架，它都是必须掌握的技能。</p>
<p>其实，Struts 1.x在此部分已经做得相当不错了。它极大地简化了我们程序员在做国际化时所需的工作，例如，如果您要输出一条国际化的信息，只需在代码包中加入FILE-NAME_xx_XX.properties（其中FILE-NAME为默认资源文件的文件名），然后在struts-config.xml中指明其路径，再在页面用&lt;bean:message&gt;标志输出即可。 </p>
<p>不过，所谓&#8220;没有最好，只有更好&#8221;。Struts 2.0并没有在这部分止步，而是在原有的简单易用的基础上，将其做得更灵活、更强大。</p>
<h2>国际化Hello World</h2>
<p>下面让我们看一个例子——HelloWorld。这个例子演示如何根据用户浏览器的设置输出相应的HelloWorld。</p>
<ol>
    <li>在Eclipse创建工程配置开发和运行环境（如果对这个步骤有问题，可以参考我早前的文章《<a class=entrylistItemTitle id=A1 href="http://www.blogjava.net/max/archive/2006/10/10/74353.html">为Struts 2.0做好准备</a>》）。 <br>
    <li>在src文件夹中加入struts.properties文件，内容如下： <br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">struts.custom.i18n.resources</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">globalMessages</span></div>
    <center>
    <table style="BORDER-RIGHT: #f0c000 1px solid; BORDER-TOP: #f0c000 1px solid; MARGIN-TOP: 8px; MARGIN-BOTTOM: 8px; BORDER-LEFT: #f0c000 1px solid; BORDER-BOTTOM: #f0c000 1px solid; BACKGROUND-COLOR: #ffffce; TEXT-ALIGN: left" cellSpacing=0 cellPadding=0 border=0>
        <tbody>
            <tr>
                <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px"><img src="http://cwiki.apache.org/confluence/images/icons/emoticons/lightbulb_on.gif"></td>
                <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; FONT-FAMILY: 华文仿宋">Struts 2.0有两个配置文件，struts.xml和struts.properties都是放在WEB-INF/classes/下。
                <ul>
                    <li>struts.xml用于应用程序相关的配置
                    <li>struts.properties用于Struts 2.0的运行时（Runtime）的配置</li>
                </ul>
                </td>
            </tr>
        </tbody>
    </table>
    </center>
    <li>在src文件夹中加入globalMessages_en_US.properties文件，内容如下：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">HelloWorld</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Hello World!</span></div>
    <li>在src文件夹中加入globalMessages_zh_CN.properties文件，内容如下：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">HelloWorld</span><span style="COLOR: #000000">=你</span><span style="COLOR: #000000">好，世界！</span></div>
    <table style="BORDER-RIGHT: #f0c000 1px solid; BORDER-TOP: #f0c000 1px solid; MARGIN-TOP: 8px; MARGIN-BOTTOM: 8px; BORDER-LEFT: #f0c000 1px solid; BORDER-BOTTOM: #f0c000 1px solid; BACKGROUND-COLOR: #ffffce; TEXT-ALIGN: left" cellSpacing=0 cellPadding=0 border=0>
        <tbody>
            <tr>
                <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px"><img src="http://cwiki.apache.org/confluence/images/icons/emoticons/lightbulb_on.gif"></td>
                <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; FONT-FAMILY: 华文仿宋">在此想和大家分享一个不错的编写properties文件的Eclipse插件（plugin），有了它我们在编辑一些简体中文、繁体中文等Unicode文本时，就不必再使用native2ascii编码了。您可以通过Eclipse中的软件升级（Software Update）安装此插件，步骤如下：<br>
                <div style="PADDING-RIGHT: 36px; PADDING-LEFT: 36px">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;或其它任意非空字符串，在URL中填入http://propedit.sourceforge.jp/eclipse/updates/；<br>5、在Site to include to search列表中，除上一步加入的site外的其它选项去掉，点击Finsih；<br>6、在弹出的Updates对话框中的Select the features to install列表中将所有结尾为&#8220;3.1.x&#8221;的选项去掉（适用于Eclipse 3.2版本的朋友）；<br>7、点击Finish关闭对话框；<br>8、在下载后，同意安装，再按提示重启Eclipse，在工具条看到形似vi的按钮表示安装成功，插件可用。此时，Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。 </div>
                </td>
            </tr>
        </tbody>
    </table>
    <li>在WebContent文件夹下加入HelloWorl.jsp文件，内容如下：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ page &nbsp;contentType</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">text/html; charset=UTF-8</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@taglib prefix</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">s</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> uri</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">/struts-tags</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">title</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Hello World</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">title</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">h2</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">s:text </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="HelloWorld"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;&lt;/</span><span style="COLOR: #800000">h2</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">h2</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">s:property </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="%{getText('HelloWorld')}"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;&lt;/</span><span style="COLOR: #800000">h2</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span></div>
    <li>发布运行应用程序，在浏览器地址栏中输入<a href="http://localhost:8080/Struts2_i18n/HelloWorld.jsp">http://localhost:8080/Struts2_i18n/HelloWorld.jsp</a> ，出现图1所示页面。<br><img alt="图1 中文输出" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag2.gif"><br><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic">图1 中文输出</span>
    <li>将浏览器的默认语言改为&#8220;英语（美国）&#8221;，刷新页面，出现图2所示页面。<br><img alt="图2 英文输出" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag1.gif"><br><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic">图2 英文输出</span> </li>
</ol>
上面的例子的做法，与Struts 1.x的做法相似，似乎并不能体现Struts 2.0的优势。不过，我在上面的例子用了两种方法来显示国际化字符串，其输出是相同的。其实，这就是Struts 2.0的一个优势，因为它默认支持EL，所示我们可以用getText方法来简洁地取得国际化字符串。另外更普遍的情况——在使用UI表单标志时，getText可以用来设置label属性，例如：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:textfield </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="name"</span><span style="COLOR: #ff0000"> label</span><span style="COLOR: #0000ff">="%{getText('UserName')}"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span></div>
<h2>资源文件查找顺序</h2>
<p>之所以说Struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源（properties）文件。在Struts 2.0中有下面几种方法：</p>
<ol>
    <li>使用全局的资源文件，方法如上例所示。这适用于遍布于整个应用程序的国际化字符串，它们在不同的包（package）中被引用，如一些比较共用的出错提示；
    <li>使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。这就适用于在包中不同类访问的资源；
    <li>使用Action范围的资源文件。做法为Action的包下新建文件名（除文件扩展名外）与Action类名同样的资源文件。它只能在该Action中访问。如此一来，我们就可以在不同的Action里使用相同的properties名表示不同的值。例如，在ActonOne中title为&#8220;动作一&#8221;，而同样用title在ActionTwo表示&#8220;动作二&#8221;，节省一些命名工夫；
    <li>使用&lt;s:i18n&gt;标志访问特定路径的properties文件。使用方法请参考我早前的文章《<a class=entrylistItemTitle id=CategoryEntryList1_EntryStoryList_Entries_ctl02_TitleUrl href="http://www.blogjava.net/max/archive/2006/10/18/75857.html">常用的Struts 2.0的标志（Tag）介绍</a>》。在您使用这一方法时，请注意&lt;s:i18n&gt;标志的范围。在&lt;s:i18n name="xxxxx"&gt;到&lt;/s:i18n&gt;之间，所有的国际化字符串都会在名为xxxxx资源文件查找，如果找不到，Struts 2.0就会输出默认值（国际化字符串的名字）。</li>
</ol>
<p>上面我列举了四种配置和访问资源的方法，它们的范围分别是从大到小，而Struts 2.0在查找国际化字符串所遵循的是特定的顺序，如图3所示：</p>
<img alt="图3 资源文件查找顺序图" src="http://www.blogjava.net/images/blogjava_net/max/16758/o_Search.jpg"><br><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic">图3 资源文件查找顺序图</span>
<p>假设我们在某个ChildAction中调用了getText("user.title")，Struts 2.0的将会执行以下的操作： </p>
<ol>
    <li>查找ChildAction_xx_XX.properties文件或ChildAction.properties；
    <li>查找ChildAction实现的接口，查找与接口同名的资源文件MyInterface.properties；
    <li>查找ChildAction的父类ParentAction的properties文件，文件名为ParentAction.properties；
    <li>判断当前ChildAction是否实现接口ModelDriven。如果是，调用getModel()获得对象，查找与其同名的资源文件；
    <li>查找当前包下的package.properties文件；
    <li>查找当前包的父包，直到最顶层包；
    <li>在值栈（Value Stack）中，查找名为user的属性，转到user类型同名的资源文件，查找键为title的资源;
    <li>查找在struts.properties配置的默认的资源文件，参考例1;
    <li>输出user.title。</li>
</ol>
<h2>参数化国际化字符串</h2>
<p>许多情况下，我们都需要在动行时（runtime）为国际化字符插入一些参数，例如在输入验证提示信息的时候。在Struts 2.0中，我们通过以下两种方法做到这点：</p>
<ol>
    <li>在资源文件的国际化字符串中使用OGNL，格式为${表达式}，例如：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">validation.require</span><span style="COLOR: #000000">=</span><span style="MARGIN-BOTTOM: 8px; COLOR: #000000">${getText(fileName)} is required</span></div>
    <li>使用<a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/text/MessageFormat.html">java.text.MessageFormat</a>中的字符串格式，格式为{ 参数序号（从0开始）, 格式类形（number | date | time | choice）, 格式样式}，例如：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">validation.between</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Date must between {</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> date, short} and {</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> date, short}</span></div>
    </li>
</ol>
在显示这些国际化字符时，同样有两种方法设置参数的值：<br>
<ol>
    <li>使用标志的value0、value1...valueN的属性，如：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:text </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="validation.required"</span><span style="COLOR: #ff0000"> value0</span><span style="COLOR: #0000ff">="User Name"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span></div>
    <li>使用param子元素，这些param将按先后顺序，代入到国际化字符串的参数中，例如：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:text </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="validation.required"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:param </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="User Name"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">s:text</span><span style="COLOR: #0000ff">&gt;</span></div>
    </li>
</ol>
<h2>让用户方便地选择语言</h2>
<p>开发国际化的应用程序时，有一个功能是必不可少的——让用户快捷地选择或切换语言。在Struts 2.0中，通过ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。不过，由于这是一个比较普遍的应用场景（Scenario），所以Struts 2.0为您提供了一个名i18n的拦截器（Interceptor），并在默认情况下将其注册到拦截器链（Interceptor chain）中。它的原理为在执行Action方法前，i18n拦截器查找请求中的一个名为"request_locale"的参数。如果其存在，拦截器就将其作为参数实例化Locale对象，并将其设为用户默认的区域（Locale），最后，将此Locale对象保存在session的名为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性中。</p>
<p>下面，我将提供一完整示例演示它的使用方法。</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> tutorial;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Hashtable;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Locale;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Map;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_116_345_Open_Image onclick="this.style.display='none'; Codehighlighter1_116_345_Open_Text.style.display='none'; Codehighlighter1_116_345_Closed_Image.style.display='inline'; Codehighlighter1_116_345_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_116_345_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_116_345_Closed_Text.style.display='none'; Codehighlighter1_116_345_Open_Image.style.display='inline'; Codehighlighter1_116_345_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Locales </span><span id=Codehighlighter1_116_345_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_116_345_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_159_343_Open_Image onclick="this.style.display='none'; Codehighlighter1_159_343_Open_Text.style.display='none'; Codehighlighter1_159_343_Closed_Image.style.display='inline'; Codehighlighter1_159_343_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_159_343_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_159_343_Closed_Text.style.display='none'; Codehighlighter1_159_343_Open_Image.style.display='inline'; Codehighlighter1_159_343_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top> &nbsp; &nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Locale</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> getLocales() </span><span id=Codehighlighter1_159_343_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_159_343_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Locale</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> locales </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Hashtable</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Locale</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;locales.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">American English</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, Locale.US);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;locales.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Simplified Chinese</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, Locale.CHINA);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> locales;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top> &nbsp; &nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<span style="FONT-SIZE: smaller; FONT-STYLE: italic">tutorial/Locales.java</span><br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@taglib prefix</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">s</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> uri</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">/struts-tags</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script </span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text/javascript"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&lt;!--</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> langSelecter_onChanged() {<br>&nbsp; &nbsp; &nbsp; &nbsp; document.langForm.submit();<br>&nbsp; &nbsp; }<br></span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">--&gt;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:set </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="SESSION_LOCALE"</span><span style="COLOR: #ff0000"> value</span><span style="COLOR: #0000ff">="#session['WW_TRANS_I18N_LOCALE']"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="locales"</span><span style="COLOR: #ff0000"> name</span><span style="COLOR: #0000ff">="tutorial.Locales"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">form </span><span style="COLOR: #ff0000">action</span><span style="COLOR: #0000ff">="&lt;s:url includeParams="</span><span style="COLOR: #ff0000">get" encode</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">" name="langForm"&nbsp;<br>&nbsp; &nbsp; style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;"&gt;<br>&nbsp; &nbsp; Language: </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:select </span><span style="COLOR: #ff0000">label</span><span style="COLOR: #0000ff">="Language"</span><span style="COLOR: #ff0000">&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="COLOR: #0000ff">="#locales.locales"</span><span style="COLOR: #ff0000"> listKey</span><span style="COLOR: #0000ff">="value"</span><span style="COLOR: #ff0000"> &nbsp; &nbsp;listValue</span><span style="COLOR: #0000ff">="key"</span><span style="COLOR: #ff0000"><br>&nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="COLOR: #0000ff">="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"</span><span style="COLOR: #ff0000"><br>&nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="COLOR: #0000ff">="request_locale"</span><span style="COLOR: #ff0000"> id</span><span style="COLOR: #0000ff">="langSelecter"</span><span style="COLOR: #ff0000">&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; onchange</span><span style="COLOR: #0000ff">="langSelecter_onChanged()"</span><span style="COLOR: #ff0000"> theme</span><span style="COLOR: #0000ff">="simple"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">form</span><span style="COLOR: #0000ff">&gt;</span></div>
<span style="FONT-SIZE: smaller; FONT-STYLE: italic">LangSelector.jsp</span>
<p>上述代码的原理为，LangSelector.jsp先实例化一个Locales对象，并把对象的Map类型的属性locales赋予下拉列表（select） 。如此一来，下拉列表就获得可用语言的列表。大家看到LangSelector有&lt;s:form&gt;标志和一段Javascript脚本，它们的作用就是在用户在下拉列表中选择了后，提交包含&#8220;reqeust_locale&#8221;变量的表单到Action。在打开页面时，为了下拉列表的选中的当前区域，我们需要到session取得当前区域（键为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性），而该属性在没有设置语言前是为空的，所以通过值栈中locale属性来取得当前区域（用户浏览器所设置的语言）。</p>
你可以把LangSelector.jsp作为一个控件使用，方法是在JSP页面中把它包含进来，代码如下所示：
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:include </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="/LangSelector.jsp"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span></div>
<br>在例1中的HellloWorld.jsp中&lt;body&gt;后加入上述代码，并在struts.xml中新建Action，代码如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">action </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="HelloWorld"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/HelloWorld.jsp</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">action</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>或者，如果你多个JSP需要实现上述功能，你可以使用下面的通用配置，而不是为每一个JSP页面都新建一个Action。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">action </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="*"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/{1}.jsp</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">action</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>分布运行程序，在浏览器的地址栏中输入<a href="http://localhost:8080/Struts2_i18n/HelloWorld.action">http://localhost:8080/Struts2_i18n/HelloWorld.action</a>，出现图4所示页面：<br><img alt="图3 HelloWorld.action" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag3.gif"><br><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic">图3 HelloWorld.action<br></span><br>在下拉列表中，选择&#8220;American English&#8221;，出现图5所示页面：<br><img alt="图3 HelloWorld.action" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag4.gif"><br><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic">图4 HelloWorld.action</span><br>
<table style="BORDER-RIGHT: #f0c000 1px solid; BORDER-TOP: #f0c000 1px solid; MARGIN-TOP: 8px; MARGIN-BOTTOM: 8px; BORDER-LEFT: #f0c000 1px solid; BORDER-BOTTOM: #f0c000 1px solid; BACKGROUND-COLOR: #ffffce; TEXT-ALIGN: left" cellSpacing=0 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px"><img src="http://cwiki.apache.org/confluence/images/icons/emoticons/lightbulb_on.gif"></td>
            <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; FONT-FAMILY: 华文仿宋">可能大家会问为什么一定要通过Action来访问页面呢？<br>你可以试一下不用Action而直接用JSP的地址来访问页面，结果会是无论你在下拉列表中选择什么，语言都不会改变。这表示不能正常运行的。其原因为如果直接使用JSP访问页面，Struts 2.0在web.xml的配置的过滤器（Filter）就不会工作，所以拦截器链也不会工作。</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/lzj520/aggbug/78626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2006-11-02 11:32 <a href="http://www.blogjava.net/lzj520/archive/2006/11/02/78626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）Struts Validation 需要注意的细节</title><link>http://www.blogjava.net/lzj520/archive/2006/09/23/71471.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Sat, 23 Sep 2006 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2006/09/23/71471.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/71471.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2006/09/23/71471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/71471.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/71471.html</trackback:ping><description><![CDATA[<p><font size=2>1. validation.xml 中的Resourse属性<br>------------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;field property="username" depends="maxlength"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg0 name="maxlength" key="${var:maxlength}" resource="false" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-name&gt;maxlength&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-value&gt;10&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field&gt;<br>------------------------------------------------------------------------------</font> </p>
<p><font size=2>来，我们将它支解掉。:)&nbsp; 好象没有什么好说的。很简单。这是某个form下的一个properties的标准写法。其中我们要重视一下这句话： &lt;arg0 name="maxlength" key="${var:maxlength}" resource="false" /&gt; , resource属性指的是：是从资源文件里面读key的值吗?&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (resource == "false") {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请取当前定义的变量的值。[因为为false的时候，因为得必须得给个值来组装错误信息，因为此时我们不会到消息资源文件里提取值]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (resource == "true) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请到资源文件里提取用来组装错误消息的值.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>你会问：如果我不指定resourse的值怎么样？默认是true，即：默认下它会去读properties文件里面的值。 (这似乎与java的boolean的默认是false有点违背)，如果我没有配呢？那么是null.</font> </p>
<p><font size=2>当然我也做了一个实验证明了这点：</font> </p>
<p><font size=2>properties file tips<br>------------------------------------------------------------------------------<br>errors.maxlength = The length of the password can not surpass {0}<br>------------------------------------------------------------------------------<br>validation.xml tips :<br>------------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;field property="username" depends="maxlength"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg0 name="maxlength" key="${var:maxlength}" resource="false" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-name&gt;maxlength&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-value&gt;10&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field&gt;<br>------------------------------------------------------------------------------<br>如果username的长度超过10的话,那么打印的是：The length of the password can not surpass 10</font> </p>
<p><font size=2>resouse属性改成true, <br>properties file tips<br>------------------------------------------------------------------------------<br>errors.maxlength = The length of the password can not surpass {0}<br>username.maxlength&nbsp; = 10<br>------------------------------------------------------------------------------<br>validation.xml tips :<br>------------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;field property="username" depends="maxlength"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg0 name="maxlength" key="username.maxlength" resource="true" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-name&gt;maxlength&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-value&gt;10&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field&gt;<br>------------------------------------------------------------------------------<br>这样我们也能达到同样的效果。Right? 但是谁愿意呢? 只是我这样写似乎更加容易理解吧.并且这样做就失去了validation的某些特别的功效,你得为每个重新在资源文件里写一条message,不值得。</font> </p>
<p><font size=2>2. validation.xml 中的msg属性.<br>官方资料：[The default error message for a pluggable validator can be overriden with the msg element. So instead of using the msg attribute for the mask validator to generate the error message the msg attribute from the field will be used if the name of the field's name attribute matches the validator's name attribute.]后面的例子我也就没有给出来，那么这句话到底在肌理哇啦个什么呢? 先看一小段代码：<br>------------------------------------------------------------------------------------------------<br>&lt;field property="username" depends="maxlength"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;arg0 name="maxlength" key="${var:maxlength}" resource="false" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-name&gt;maxlength&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-value&gt;10&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/var&gt;<br>&nbsp;&nbsp; &lt;/field&gt;<br>------------------------------------------------------------------------------------------------<br>再强调一遍：validation的错误信息是这样组装的：通过arg0 - arg3等来和资源文件里面的并且消息名字在validator-rule.xml定义好的规则所对应的消息来合成的。validator-rule.xml所定义的msg是面向所有的该规则的错误消息，每个form field可以通过arg0-arg3来定制自己的消息(这个我提到过)</font> </p>
<p><font size=2>如果我们加入msg消息到filed标签下面：</font> </p>
<p><font size=2>------------------------------------------------------------------------------------------------<br>&lt;field property="username" depends="maxlength"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;msg name="maxlength" key="msg.maxlength" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;arg0 name="maxlength" key="${var:maxlength}" resource="false" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-name&gt;maxlength&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-value&gt;10&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/var&gt;<br>&nbsp;&nbsp; &lt;/field&gt;<br>------------------------------------------------------------------------------------------------<br>那么此时的maxlength在规则里面的msg将会被&lt;field&gt;里面的msg覆盖，也就是说&lt;arg0&gt;的定义形同虚设，更会无视resourse属性的false or true;</font> </p>
<p><font size=2>3.几个规则(rules)作用于同一个form的属性上面<br>------------------------------------------------------------------------------------------------<br>&lt;field property="username" depends="required,maxlength,minlength"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;arg0 name="maxlength" key="${var:maxlength}" resource="false" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;arg1 name="required" key="prompt.username" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;arg2 name="minlength" key="${var:minlength}" resource="false" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-name&gt;maxlength&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-value&gt;10&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/var&gt;<br>&nbsp;&nbsp;&nbsp; &lt;var&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-name&gt;minlength&lt;/var-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;var-value&gt;3&lt;/var-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/var&gt;<br>&nbsp;&nbsp; &lt;/field&gt;<br>------------------------------------------------------------------------------------------------<br>如果很多约束针对某一个form的属性，我们可以这样写，当然如果你非要分开写也可以。那么在xml文件中一个form的field就有多条记录.<br>这里有一点需要注意一下：&lt;arg0&gt;&lt;arg1&gt;&lt;arg2&gt;在这里定义了以后，别的form的属性也要按照这种顺序来，也就是：&lt;arg0&gt;对应的是 maxlength. &lt;arg1&gt;对应的是minlength.&lt;arg2&gt;对应的是 requried.为什么这样做？<br>因为在我们的properties文件中是写死的。如果不这样做，那么就会出现得到null值的错误啦.<br>------------------------------------------------------------------------------------------------<br>errors.required ={1} is required.<br>errors.maxlength = The length of the password can not surpass {0}<br>errors.minlength = The length of the password can not shorter than {2}<br>------------------------------------------------------------------------------------------------</font> <br><br>补充一下validwhen的用法</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>&lt;field property="emailAddress" depends="validwhen"&gt;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US>&lt;arg0 key="userinfo.emailAddress.label"/&gt;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US>&lt;var&gt;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt"><span lang=EN-US>&lt;var-name&gt;test&lt;/var-name&gt;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt"><span lang=EN-US>&lt;var-value&gt;((sendNewsletter == null) or (*this* != null))&lt;/var-value&gt;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US>&lt;/var&gt;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>&lt;/field&gt;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面定义的意思是：如果通讯地址是空或不空时这个字段时有效的</span></p>
<img src ="http://www.blogjava.net/lzj520/aggbug/71471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2006-09-23 16:44 <a href="http://www.blogjava.net/lzj520/archive/2006/09/23/71471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>