﻿<?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-BaoYaEr-文章分类-Strtus</title><link>http://www.blogjava.net/baoyaer/category/17566.html</link><description>java</description><language>zh-cn</language><lastBuildDate>Fri, 11 Jan 2008 12:17:19 GMT</lastBuildDate><pubDate>Fri, 11 Jan 2008 12:17:19 GMT</pubDate><ttl>60</ttl><item><title>struts中dispathAction  </title><link>http://www.blogjava.net/baoyaer/articles/174702.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 11 Jan 2008 10:30:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/174702.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/174702.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/174702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/174702.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/174702.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp; <br />
当在stuts中需要在一个action中定义多个方法时，可以使用dispathAction来完成</p>
<p>下面是测试的一个简单的例子：</p>
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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">Created&nbsp;by&nbsp;MyEclipse&nbsp;Struts<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;XSL&nbsp;source&nbsp;(default):&nbsp;platform:/plugin/com.genuitec.eclipse.cross.easystruts.eclipse_4.1.0/xslt/JavaClass.xsl</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.test.struts.action;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.http.HttpServletRequest;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.http.HttpServletResponse;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.struts.action.ActionForm;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.struts.action.ActionForward;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.struts.action.ActionMapping;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.struts.actions.DispatchAction;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_459_579_Open_Image" onclick="this.style.display='none'; Codehighlighter1_459_579_Open_Text.style.display='none'; Codehighlighter1_459_579_Closed_Image.style.display='inline'; Codehighlighter1_459_579_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_459_579_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_459_579_Closed_Text.style.display='none'; Codehighlighter1_459_579_Open_Image.style.display='inline'; Codehighlighter1_459_579_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_459_579_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">/**&nbsp;*/</span><span id="Codehighlighter1_459_579_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;MyEclipse&nbsp;Struts<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;Creation&nbsp;date:&nbsp;04-21-2006<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;XDoclet&nbsp;definition:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;@struts.action&nbsp;parameter="method"<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_633_1409_Open_Image" onclick="this.style.display='none'; Codehighlighter1_633_1409_Open_Text.style.display='none'; Codehighlighter1_633_1409_Closed_Image.style.display='inline'; Codehighlighter1_633_1409_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_633_1409_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_633_1409_Closed_Text.style.display='none'; Codehighlighter1_633_1409_Open_Image.style.display='inline'; Codehighlighter1_633_1409_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyDispathAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;DispatchAction&nbsp;</span><span id="Codehighlighter1_633_1409_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"  alt="" /></span><span id="Codehighlighter1_633_1409_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;---------------------------------------------------------&nbsp;Instance&nbsp;Variables<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;---------------------------------------------------------&nbsp;Methods</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
<img id="Codehighlighter1_790_917_Open_Image" onclick="this.style.display='none'; Codehighlighter1_790_917_Open_Text.style.display='none'; Codehighlighter1_790_917_Closed_Image.style.display='inline'; Codehighlighter1_790_917_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_790_917_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_790_917_Closed_Text.style.display='none'; Codehighlighter1_790_917_Open_Image.style.display='inline'; Codehighlighter1_790_917_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span id="Codehighlighter1_790_917_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">/**&nbsp;*/</span><span id="Codehighlighter1_790_917_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;*&nbsp;Method&nbsp;execute<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;mapping<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;form<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;request<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;response<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;ActionForward<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ActionForward&nbsp;Add(<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;ActionMapping&nbsp;mapping,<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;ActionForm&nbsp;form,<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request,<br />
<img id="Codehighlighter1_1057_1153_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1057_1153_Open_Text.style.display='none'; Codehighlighter1_1057_1153_Closed_Image.style.display='inline'; Codehighlighter1_1057_1153_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1057_1153_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1057_1153_Closed_Text.style.display='none'; Codehighlighter1_1057_1153_Open_Image.style.display='inline'; Codehighlighter1_1057_1153_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response)&nbsp;</span><span id="Codehighlighter1_1057_1153_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"  alt="" /></span><span id="Codehighlighter1_1057_1153_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;request.setAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">method</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">add</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;mapping.findForward(</span><span style="color: #000000">"</span><span style="color: #000000">sucess</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ActionForward&nbsp;Delete(<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;ActionMapping&nbsp;mapping,<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;ActionForm&nbsp;form,<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request,<br />
<img id="Codehighlighter1_1295_1407_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1295_1407_Open_Text.style.display='none'; Codehighlighter1_1295_1407_Closed_Image.style.display='inline'; Codehighlighter1_1295_1407_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1295_1407_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1295_1407_Closed_Text.style.display='none'; Codehighlighter1_1295_1407_Open_Image.style.display='inline'; Codehighlighter1_1295_1407_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response)&nbsp;</span><span id="Codehighlighter1_1295_1407_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"  alt="" /></span><span id="Codehighlighter1_1295_1407_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;request.getSession().setAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">method</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">delete</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;mapping.findForward(</span><span style="color: #000000">"</span><span style="color: #000000">sucess</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">stuts-config.xml:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">parameter</span><span style="color: #0000ff">="method"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path</span><span style="color: #0000ff">="/dispath"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff">="com.test.struts.action.MyDispathAction"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validate</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">forward&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="sucess"</span><span style="color: #ff0000">&nbsp;path</span><span style="color: #0000ff">="/sucess.jsp"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span></div>
<br />
<p>需要注意的是要将action中的execute方法删除！！！</p>
<p>&nbsp;</p>
<p>调用：</p>
<p>http://127.0.0.1:8080/test/dispath.do?method=Add</p>
<p>http://127.0.0.1:8080/test/dispath.do?method=Delete</p>
<br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/174702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-01-11 18:30 <a href="http://www.blogjava.net/baoyaer/articles/174702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Java实现随机验证码功能实例 </title><link>http://www.blogjava.net/baoyaer/articles/167383.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 13 Dec 2007 01:18:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/167383.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/167383.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/167383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/167383.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/167383.html</trackback:ping><description><![CDATA[现在许多系统的注册、登录或者发布信息模块都添加的随机码功能，就是为了避免自动注册程序或者自动发布程序的使用。 <br />
<br />
验证码实际上就是随机选择一些字符以图片的形式展现在页面上，如果进行提交操作的同时需要将图片上的字符同时提交，如果提交的字符与服务器session保存的不同，则认为提交信息无效。为了避免自动程序分析解析图片，通常会在图片上随机生成一些干扰线或者将字符进行扭曲，增加自动识别的难度。 <br />
<br />
在这里，我们使用servlet来实现随机验证码的实现。 <br />
<br />
package com.servlet; <br />
<br />
import java.awt.Color; <br />
import java.awt.Font; <br />
import java.awt.Graphics2D; <br />
import java.awt.image.BufferedImage; <br />
import java.util.Random; <br />
<br />
import javax.imageio.ImageIO; <br />
import javax.servlet.ServletException; <br />
import javax.servlet.ServletOutputStream; <br />
import javax.servlet.http.HttpServlet; <br />
import javax.servlet.http.HttpServletRequest; <br />
import javax.servlet.http.HttpServletResponse; <br />
import javax.servlet.http.HttpSession; <br />
<br />
/**<br />
* 生成随机验证码<br />
* @author bitiliu<br />
*<br />
*/<br />
public class ValidateCodeServlet extends HttpServlet <br />
{<br />
<br />
private static final long serialVersionUID = 1L; <br />
<br />
//验证码图片的宽度。<br />
private int width=60; <br />
//验证码图片的高度。<br />
private int height=20; <br />
//验证码字符个数<br />
private int codeCount=4; <br />
<br />
<br />
private int x=0; <br />
//字体高度<br />
private int fontHeight; <br />
private int codeY; <br />
<br />
char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',<br />
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',<br />
'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; <br />
<br />
/**<br />
* 初始化验证图片属性<br />
*/<br />
public void init() throws ServletException<br />
{<br />
//从web.xml中获取初始信息<br />
//宽度<br />
String strWidth=this.getInitParameter("width"); <br />
//高度<br />
String strHeight=this.getInitParameter("height"); <br />
//字符个数<br />
String strCodeCount=this.getInitParameter("codeCount"); <br />
<br />
//将配置的信息转换成数值<br />
try<br />
{<br />
if(strWidth!=null &amp;&amp; strWidth.length()!=0)<br />
{<br />
width=Integer.parseInt(strWidth); <br />
}<br />
if(strHeight!=null &amp;&amp; strHeight.length()!=0)<br />
{<br />
height=Integer.parseInt(strHeight); <br />
}<br />
if(strCodeCount!=null &amp;&amp; strCodeCount.length()!=0)<br />
{<br />
codeCount=Integer.parseInt(strCodeCount); <br />
}<br />
}<br />
catch(NumberFormatException e)<br />
{}<br />
<br />
x=width/(codeCount+1); <br />
fontHeight=height-2; <br />
codeY=height-4; <br />
<br />
}<br />
<br />
protected void service(HttpServletRequest req, HttpServletResponse resp)<br />
throws ServletException, java.io.IOException {<br />
<br />
//定义图像buffer<br />
BufferedImage buffImg = new BufferedImage(<br />
width, height,BufferedImage.TYPE_INT_RGB); <br />
Graphics2D g = buffImg.createGraphics(); <br />
<br />
//创建一个随机数生成器类<br />
Random random = new Random(); <br />
<br />
//将图像填充为白色<br />
g.setColor(Color.WHITE); <br />
g.fillRect(0, 0, width, height); <br />
<br />
//创建字体，字体的大小应该根据图片的高度来定。<br />
Font font = new Font("Fixedsys", Font.PLAIN, fontHeight); <br />
//设置字体。<br />
g.setFont(font); <br />
<br />
//画边框。<br />
g.setColor(Color.BLACK); <br />
g.drawRect(0, 0, width - 1, height - 1); <br />
<br />
//随机产生160条干扰线，使图象中的认证码不易被其它程序探测到。<br />
g.setColor(Color.BLACK); <br />
for(int i = 0; i ＜ 160; i++) <br />
{<br />
int x = random.nextInt(width); <br />
int y = random.nextInt(height); <br />
int xl = random.nextInt(12); <br />
int yl = random.nextInt(12); <br />
g.drawLine(x, y, x + xl, y + yl); <br />
}<br />
<br />
//randomCode用于保存随机产生的验证码，以便用户登录后进行验证。<br />
StringBuffer randomCode = new StringBuffer(); <br />
int red = 0, green = 0, blue = 0; <br />
<br />
//随机产生codeCount数字的验证码。<br />
for (int i = 0; i ＜ codeCount; i++) {<br />
//得到随机产生的验证码数字。<br />
String strRand = String.valueOf(codeSequence[random.nextInt(36)]); <br />
//产生随机的颜色分量来构造颜色值，这样输出的每位数字的颜色值都将不同。<br />
red = random.nextInt(255); <br />
green = random.nextInt(255); <br />
blue = random.nextInt(255); <br />
<br />
//用随机产生的颜色将验证码绘制到图像中。<br />
g.setColor(new Color(red, green, blue)); <br />
g.drawString(strRand, (i + 1) * x, codeY); <br />
<br />
//将产生的四个随机数组合在一起。<br />
randomCode.append(strRand); <br />
}<br />
// 将四位数字的验证码保存到Session中。<br />
HttpSession session = req.getSession(); <br />
session.setAttribute("validateCode", randomCode.toString()); <br />
<br />
// 禁止图像缓存。<br />
resp.setHeader("Pragma", "no-cache"); <br />
resp.setHeader("Cache-Control", "no-cache"); <br />
resp.setDateHeader("Expires", 0); <br />
<br />
resp.setContentType("image/jpeg"); <br />
<br />
//将图像输出到Servlet输出流中。<br />
ServletOutputStream sos = resp.getOutputStream(); <br />
ImageIO.write(buffImg, "jpeg", sos); <br />
sos.close(); <br />
}<br />
<br />
} <br />
<br />
需要在web.xml中声明servlet <br />
<br />
＜servlet＞ <br />
＜servlet-name＞ValidateCodeServlet＜/servlet-name＞ <br />
＜servlet-class＞com.servlet.ValidateCodeServlet＜/servlet-class＞ <br />
＜init-param＞ <br />
＜param-name＞width＜/param-name＞ <br />
＜param-value＞200＜/param-value＞ <br />
＜/init-param＞ <br />
＜init-param＞ <br />
＜param-name＞height＜/param-name＞ <br />
＜param-value＞80＜/param-value＞ <br />
＜/init-param＞ <br />
＜init-param＞ <br />
＜param-name＞codeCount＜/param-name＞ <br />
＜param-value＞5＜/param-value＞ <br />
＜/init-param＞ <br />
＜/servlet＞ <br />
<br />
＜servlet-mapping＞ <br />
＜servlet-name＞ValidateCodeServlet＜/servlet-name＞ <br />
＜url-pattern＞/validateCodeServlet＜/url-pattern＞ <br />
＜/servlet-mapping＞ <br />
<br />
用户提交后就可以将用户输入的验证码与session中保存的字符串进行比对，达到验证的效果。<br />
 <img src ="http://www.blogjava.net/baoyaer/aggbug/167383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-13 09:18 <a href="http://www.blogjava.net/baoyaer/articles/167383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts的ActionMessage以及html:errors不用资源文件</title><link>http://www.blogjava.net/baoyaer/articles/164297.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 30 Nov 2007 07:14:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/164297.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/164297.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/164297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/164297.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/164297.html</trackback:ping><description><![CDATA[<strong><br />
</strong><span class="tpc_content">
<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"  alt="" /><span style="color: #000000">ErrorsTag.<br />
<img id="Codehighlighter1_36_257_Open_Image" onclick="this.style.display='none'; Codehighlighter1_36_257_Open_Text.style.display='none'; Codehighlighter1_36_257_Closed_Image.style.display='inline'; Codehighlighter1_36_257_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_36_257_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_36_257_Closed_Text.style.display='none'; Codehighlighter1_36_257_Open_Image.style.display='inline'; Codehighlighter1_36_257_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(report.isResource())&nbsp;</span><span id="Codehighlighter1_36_257_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"  alt="" /></span><span id="Codehighlighter1_36_257_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TagUtils.getInstance().message(<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pageContext,<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bundle,<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locale,<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;report.getKey(),<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;report.getValues());<br />
<img id="Codehighlighter1_264_311_Open_Image" onclick="this.style.display='none'; Codehighlighter1_264_311_Open_Text.style.display='none'; Codehighlighter1_264_311_Closed_Image.style.display='inline'; Codehighlighter1_264_311_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_264_311_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_264_311_Closed_Text.style.display='none'; Codehighlighter1_264_311_Open_Image.style.display='inline'; Codehighlighter1_264_311_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_264_311_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"  alt="" /></span><span id="Codehighlighter1_264_311_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;report.getKey();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
<br />
说明，是可以不使用资源文件的。<br />
再看，ActionMessage构造方法，<br />
new ActionMessage( String value, boolean isResource );<br />
只要这样构造就不用资源文件，<br />
ActionMessage msg = new ActionMessage("随便写",false);<br />
之后把<br />
ActionMessages errors = ..<br />
errors.add( "mykey",msg)<br />
...<br />
最后页面上使用<br />
&lt;html:errors property="mykey"/&gt;<br />
这样就输出了<br />
"随便写"。<br />
所以，结论是，可是不用资源文件使用ActionMessage,以及&lt;html:errors&gt;</span><br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/164297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-11-30 15:14 <a href="http://www.blogjava.net/baoyaer/articles/164297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分页pager-taglib使用指南 </title><link>http://www.blogjava.net/baoyaer/articles/163162.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 26 Nov 2007 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/163162.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/163162.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/163162.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/163162.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/163162.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;一简介 Pager-taglib，是一套分页标签库，可以灵活地实现多种不同风格的分页导航页面，并且可以很好的与服务器分页逻辑分离支持多种风格的分页显示。通过这些标签的不同的组合，会形成多种不一样的分页页面，风格各异，它自带的DEMO就有七种左右的分页风格，包括Google的分页风格。而需要订制自已的风格的分页页面也非常简单。 分页方式有两种： 一种是从Action中得到...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/163162.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/163162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-11-26 15:06 <a href="http://www.blogjava.net/baoyaer/articles/163162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ServletContextListener   || HttpSessionListener 的用法 </title><link>http://www.blogjava.net/baoyaer/articles/152853.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 15 Oct 2007 01:17:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/152853.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/152853.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/152853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/152853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/152853.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这个J2EE小提示阐述了ServletContextListener的用法。这个事件类作为Web应用服务的一部分，处理Web应用的 servlet上下文(context)的变化的通知。这可以解释为，好像有个人在服务器旁不断地通知我们服务器在发生什么事件。那当然需要监听者了。因 此，在通知上下文(context)初始化和销毁的时候，ServletContextListner非常有用。 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/152853.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/152853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-15 09:17 <a href="http://www.blogjava.net/baoyaer/articles/152853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts标签库 </title><link>http://www.blogjava.net/baoyaer/articles/130900.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 17 Jul 2007 09:50:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/130900.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/130900.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/130900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/130900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/130900.html</trackback:ping><description><![CDATA[<div>&nbsp;</div>
<p align=center><strong><span>Struts</span></strong><strong><span>标签库</span></strong><strong></strong></p>
<p><strong><span>一<span>.html</span>标签</span></strong></p>
<p><strong><span>1.html</span></strong><strong><span>元素的标签<span>:</span></span></strong></p>
<p><span>a1.&lt;html:link <strong><span>forward</span></strong>="index"&gt; </span><span>链接<span>&lt;global-forwards&gt;</span>中的<span>name &lt;/html:link&gt;</span></span></p>
<p><span>a2.</span><span> </span><span>&lt;html:link <strong><span>href</span></strong>="http://www.baidu.com" &gt; </span><span>链接到站点外<span><span>&nbsp;&nbsp; </span>&lt;/html:link&gt;</span></span></p>
<p><span>a3.</span><span> </span><span>&lt;html:link <strong><span>page</span></strong>="/HtmlBasic.do"&gt;</span><span>同一个应用<span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/html:link&gt; </span></span></p>
<p><span>如<span>:</span>包含请求参数<span>: &lt;html:link page="/HtmlBasic.do?<strong>prop1=abc&amp;amp;prop2=123</strong>" /&gt; </span></span></p>
<p><span><span>&nbsp;&nbsp; </span></span><span>包含单个请求变量<span>:&lt;% String stringBean = "Value to Pass on URL";</span></span></p>
<p><span>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>pageContext.setAttribute("<strong>stringBean</strong>", stringBean);%&gt;</span></p>
<p><span>&lt;html:link page="/HtmlBasic.do" paramId="urlParamName" <strong><span>paramName</span></strong>="<strong>stringBean</strong>" /&gt;</span></p>
<p><span>&lt;jsp:useBean id="javaBean" scope="page" class="CustomerBean" /&gt;</span></p>
<p><span>&lt;jsp:setProperty name="javaBean" property="name" value="weiqin" /&gt; //</span><span>要有范围</span></p>
<p><span>&lt;html:link page="/Html" paramId="url" paramName="<strong>javaBean</strong>"<strong> <span>paramProperty</span></strong>="name"/&gt; </span></p>
<p><span>包含多个请求变量<span>:</span></span><span> </span><span>&lt;%&nbsp;java.util.HashMap myMap = new java.util.HashMap();</span></p>
<p><span>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>myMap.put("myString", new String("myStringValue") );</span></p>
<p><span>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>myMap.put("myArray", new String[] { "str1", "str2", "str3" });</span></p>
<p><span>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>pageContext.setAttribute("<strong><span>map</span></strong>", myMap);%&gt; </span></p>
<p><span>&lt;html:link page="/HtmlBasic.do" name="<strong><span>map</span></strong>"&gt; url &lt;/html:link&gt;</span></p>
<p><span>b.&lt;html:img&gt;:</span><span> </span><span>&lt;html:img page="/struts-power.gif" /&gt; //</span><span>也可以包含单个或多个请求变量</span></p>
<p><span>&lt;html:img src="/struts-power.gif" paramId="urlParamName" <strong>paramName</strong>="stringBean" /&gt; </span></p>
<p><span>&lt;html:img page="/struts-power.gif" name="map" /&gt; </span></p>
<p><strong><span><br><br>2.</span></strong><strong><span>基本表单标签</span></strong><span>:&lt;html:form&gt;,&lt;html:text&gt;,&lt;html:hidden&gt;,&lt;html:submit&gt;,&lt;html:reset&gt;</span></p>
<p><span>&lt;html:cancel&gt;Cancel&lt;/html:cancel&gt; :Action</span><span>中的取消事件<span>:</span></span></p>
<p><span>FormBasicForm fbf = (FormBasicForm) form;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (<strong><span>isCancelled(request)</span></strong>) { fbf.setStatus("Cancel was pressed!");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return (mapping.findForward("success"));<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}//</span><span>表示取消选中</span></p>
<p><span>&nbsp;else { fbf.setStatus("Submit was pressed!");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>return (mapping.findForward("success"));<span>&nbsp;&nbsp;&nbsp; </span>} </span></p>
<p><strong><span><br>3.</span></strong><strong><span>下拉列表和多选列表</span></strong></p>
<p><span>&lt;html:select property="colors" size="6" multiple="true" &gt; // multiple</span><span>下拉可多选</span></p>
<p><span>&lt;html:option value="htmlselect.orange"&gt;Orange&lt;/html:option&gt; //</span><span>基本的页面输入</span></p>
<p><span>&lt;html:option value="red" bundle="htmlselect.Colors" key="red"/&gt;//</span><span>从资源文件中显示</span></p>
<p><span>&lt;% Vector colorCollection = new Vector(); colorCollection.add(</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>new org.apache.struts.util.LabelValueBean("Pink", "htmlselect.pink"));</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>colorCollection.add(<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// Pink</span><span>为<span>label htmlselect.pink</span>为<strong><span>value</span></strong></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>new org.apache.struts.util.LabelValueBean("Brown", "htmlselect.brown"));</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pageContext.setAttribute("colorCollection", colorCollection);<span>&nbsp;&nbsp; </span>%&gt; </span></p>
<p><strong><span>&lt;html:options</span></strong><span>&nbsp;collection="colorCollection"&nbsp;<strong><span>property</span></strong>="value"&nbsp;//</span><span>实际值<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p>
<p><strong><span>labelProperty</span></strong><span>="label" /&gt; <span>&nbsp;&nbsp;</span>&lt;/html:select&gt;// labelProperty</span><span>显示值</span></p>
<p><span><br><br>4.</span><strong><span>显示错误消息</span></strong><span>: errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("key") );</span></p>
<p><span>a.</span><span>显示全局<span>:&lt;html:errors property="org.apache.struts.action.GLOBAL_MESSAGE"/&gt;</span></span></p>
<p><span>b.</span><span>显示特定字段<span>:</span></span><span> </span><span>errors.add("checkbox1", new ActionMessage("error.checkbox"));</span></p>
<p><span>&lt;html:errors property="checkbox1" <strong>bundle</strong>="HtmlErrors" /&gt; //bundle</span><span>资源文件</span></p>
<p><strong><span><br><br>5.</span></strong><strong><span>显示信息<span>&lt;html:messages&gt;:</span></span></strong></p>
<p><span>a.&lt;html:messages id=&#8221;message&#8221; message=&#8221;true&#8221;/&gt;//</span><span>如果为<span>true</span>则从全局中搜索</span></p>
<p><span>则<span>:ActionMessages actionMessages=new ActionMessages();</span></span></p>
<p><span>actionMessages.add(ActionMessages.GLOBAL_MESSAGE,new ActionMessage(&#8220;key&#8221;));</span></p>
<p><span>saveMessages(request,actionMessages);</span></p>
<p><span>b.</span><span>从一定的范围中查找<span>:&lt;html:messages id=&#8221;<strong><span>message</span></strong>&#8221;&gt;</span></span></p>
<p><span>&lt;bean:write name=&#8221;<strong><span>message</span></strong>&#8221; /&gt;&nbsp;&lt;/html:messages&gt;</span></p>
<p><span>则<span>:protected void saveMessages(HttpServletRequest request,ActionMessages messages){</span></span></p>
<p><span>...request.setAttribute(GLOBAL_MESSAGE_key,messages); }</span></p>
<p>&nbsp;</p>
<p><strong><span>二<span>:Struts Bean</span>标签</span></strong></p>
<p><strong><span>1.</span></strong><strong><span>访问<span>http</span>请求信息和<span>JSP</span>对象</span></strong></p>
<p><span>a. <strong>&lt;bean:cookie</strong> id="<strong>cookie</strong>" name="cookiedemo" value="firsttime"/&gt;&nbsp;// value</span><span>为默认值</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;%&nbsp;if (cookie.getValue().equals("firsttime")) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Cookie c = new Cookie("cookiedemo", "Hi Linda!");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>c.setComment("A test cookie");c.setMaxAge(3600);response.addCookie(c);}&nbsp;%&gt;</span></p>
<p><span>输出<span>:</span></span><span> </span><span>&lt;bean:write name="<strong>cookie</strong>" property="value"/&gt;</span></p>
<p><span>b.</span><span> </span><strong><span>&lt;bean:header</span></strong><span> id="lang" name="Accept-Language"/&gt; &lt;bean:write name="lang"/&gt;</span></p>
<p><span>c.</span><strong><span> </span></strong><strong><span>&lt;bean:page</span></strong><span> id="this_session" property="<strong><span>session</span></strong>"/&gt;//</span><span>检索<span>JSP</span>范围<span>,</span>隐含对象</span></p>
<p><span><span>&nbsp;&nbsp; </span>&lt;bean:write name="this_session"&nbsp;property="creationTime"/&gt;</span></p>
<p><span>d.</span><span> </span><strong><span>&lt;bean:parameter</span></strong><span> id="arg1" name="testarg" value="noarg"/&gt; // value</span><span>为默认值</span></p>
<p><span><span>&nbsp;&nbsp; </span>&lt;bean:write name="arg1"/&gt;</span></p>
<p><span>检索多值：<span>&lt;bean:parameter id="arg2" <strong><span>multiple="yes"</span></strong> name="testarg" value="noarg"/&gt;</span></span></p>
<p><span>通过链接传递参数：<span>&lt;html:link page="/this.jsp?testarg=123&amp;testarg=456&amp;testarg=789"&gt;</span></span></p>
<p><span>循环输出：<span>&lt;% for (int i=0; i &lt;arg2.length; i++) {out.write(arg2[i] + "&lt;BR&gt;");}&nbsp;%&gt;</span></span></p>
<p><strong><span><br><br>2</span></strong><strong><span>．访问<span>WEB</span>应用资源：</span></strong><span>&nbsp;&lt;message-resources parameter="res" key="special" /&gt;</span></p>
<p><span>a.</span><span> </span><strong><span>&lt;bean:messag</span></strong><span>e key="hello" arg0="Linda" /&gt;&nbsp;//</span><span>默认资源文件中：<span>hello=Hello,{0}</span></span></p>
<p><span>&lt;% request.setAttribute("stringBean","hello"); SomeBean bean=new SomeBean();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>bean.setName("hello");<span>&nbsp;&nbsp; </span>request.setAttribute("someBean",bean);<span>&nbsp;&nbsp; </span>%&gt;</span></p>
<p><strong><span>通过变量名或<span>javaBean</span>得到<span>key</span>值再访问资源文件：</span></strong><strong></strong></p>
<p><span>&lt;bean:message bundle="special" name="stringBean"/&gt;// bundle</span><span>不能省<span>,</span>只能访问资源文件</span></p>
<p><span>&lt;bean:message bundle="special" name="someBean" property="name"/&gt;</span></p>
<p><span>b. <strong><span>&lt;bean:include&gt;</span></strong></span><span>同<span>&lt;jsp:include&gt;,</span>但将<span>WEB</span>资源存放在一个变量中，有<span>forward,page,href</span></span></p>
<p><span>&lt;bean:include id="tp1" <strong>page</strong>="/testpage1.jsp"/&gt;</span><span> &lt;bean:write name="tp1" filter="false"/&gt;</span></p>
<p><span>&lt;bean:include id="tp2" <strong>forward</strong>="testpage2"/&gt;</span><span> </span><span>&lt;bean:write name="tp2" filter="false"/&gt;</span></p>
<p><strong><span><br><br>3.</span></strong><strong><span>定义或输出<span>javaBean</span>，</span></strong><span>bean:write</span><span>标签<span>filter</span>为<span>true</span>时会将特殊符号转换成普通字符串</span><strong></strong></p>
<p><span>a.value</span><span>属性：<strong><span>&lt;bean:define</span></strong><span> id="name" value="lib"/&gt;&lt;bean:write name="name"/&gt;</span></span></p>
<p><span>&nbsp;name</span><span>和<span>property</span>属性：<span>&lt;% request.setAttribute("<strong>sessionBean</strong>", session); %&gt;</span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;bean:define id="contextBean" name="<strong>sessionBean</strong>" property="servletContext"/&gt;</span></p>
<p><span>// contextBean</span><span>为<span>javax.servlet.ServletContext</span>类型，实例化</span></p>
<p><span>&lt;bean:write name="contextBean" property="servletContextName"/&gt;</span></p>
<p><span>&nbsp;&nbsp;name</span><span>和<span>type</span>属性（用于复制）：<span>&lt;bean:define id="contextBean_copy" name="contextBean"</span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span>type="javax.servlet.ServletContext"/&gt;</span></p>
<p><span>&lt;bean:write name="contextBean_copy" property="majorVersion"/&gt;</span></p>
<p><strong><span><br><br>三．<span>Struts Logic</span>标签：</span></strong></p>
<p><strong><span>1.</span></strong><strong><span>逻辑判断：（<span>greatEqual,lessEqual,greatThan...</span>）</span></strong></p>
<p><span>&lt;% Cookie c = new Cookie("username", "Linda");<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>c.setComment("A test cookie");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>c.setMaxAge(3600);<span>&nbsp;&nbsp;&nbsp; </span>response.addCookie(c); %&gt;</span></p>
<p><span>a.<strong><span>&lt;logic:equal</span></strong> cookie="username" value="Linda"&gt;UserName is Linda&nbsp;&lt;/logic:equal&gt;</span></p>
<p><span>b.</span><span> </span><span>&lt;%&nbsp;SomeBean bean=new SomeBean();<span>&nbsp;&nbsp;&nbsp; </span>bean.setName("Linda");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>request.setAttribute("someBean",bean);%&gt;</span></p>
<p><strong><span>&lt;logic:notEqual</span></strong><span> name="someBean" property="name" value="Tom"&gt;not Tom &lt;/logic:notEqual&gt;</span></p>
<p><span>c. &lt;% request.setAttribute("number","100"); %&gt;</span></p>
<p><strong><span>&lt;logic:lessThan</span></strong><span> name="number" value="<st1:chmetcnv w:st="on" UnitName="a" SourceValue="100" HasSpace="False" Negative="False" NumberType="1" TCSC="0">100.0a</st1:chmetcnv>" &gt; "100" </span><span>小于<span>"<st1:chmetcnv w:st="on" UnitName="a" SourceValue="100" HasSpace="False" Negative="False" NumberType="1" TCSC="0">100.0a</st1:chmetcnv>"&lt;/logic:lessThan &gt;</span></span></p>
<p><strong><span><br><br>2</span></strong><strong><span>．字符串匹配：变量中是否包含指定的字符串</span></strong></p>
<p><span>&lt;%&nbsp;request.setAttribute("authorName", "LindaSun");%&gt;</span></p>
<p><span>a.<strong>&lt;logic:match</strong> name="authorName" scope="request" value="Linda"&gt;</span></p>
<p><span><span>&nbsp;&nbsp; </span>&lt;bean:write name="authorName"/&gt; has the string 'Sun' in it.&lt;/logic:match&gt;</span></p>
<p><span>&nbsp;&nbsp;<strong>&lt;logic:notMatch</strong> name="authorName" scope="request" value="Linda" /&gt; //</span><span>还有<span>end</span>属性</span></p>
<p><span>&lt;logic:match name="authorName" scope="request" value="Linda" <strong><span>location="start"</span></strong>&gt;</span></p>
<p><span>&lt;bean:write name="authorName"/&gt; starts with the string 'Linda'.&lt;/logic:match&gt; </span></p>
<p><strong><span><br><br>3</span></strong><strong><span>．判断指定内容是否存在</span></strong></p>
<p><span>&lt;% ActionErrors errors = new ActionErrors();</span></p>
<p><span>errors.add("totallylost", new ActionMessage("application.totally.lost"));</span></p>
<p><span>request.setAttribute(Globals.ERROR_KEY, errors);</span></p>
<p><span>request.setAttribute("myerrors",errors);request.setAttribute("emptyString","");%&gt; <strong></strong></span></p>
<p><strong><span>a.&lt;logic:empty</span></strong><span> name="emptyString"&gt;&nbsp;emptyString is empty!&nbsp;&lt;/logic:empty&gt;</span></p>
<p><strong><span>b.&lt;logic:notPresent</span></strong><span> name="noSuchBean" property="noSuchProperty"&gt;</span></p>
<p><span>&nbsp;</span><span>判断指定的安全角色，用户<span>,cookie,header</span>或<span>javaBean</span>是否存在 <span>&lt;/logic:notPresent&gt;</span></span></p>
<p><span>c.</span><span> </span><span>&lt;logic:messagesPresent <strong><span>name</span></strong>="myerrors" &gt;</span><span>在范围内检索<span>key&lt;/logic:messagesPresent&gt;</span></span></p>
<p><span>&lt;logic:messagesNotPresent <strong><span>message</span></strong>="true"&gt;</span></p>
<p><span>从<span>Globals.MESSAGE_KEY</span>中检索，不同于<span>Globals.ERROR_KEY &lt;/logic:messagesNotPresent&gt;</span></span></p>
<p><span>&lt;logic:messagesNotPresent</span><span> &nbsp;<strong><span>property</span></strong>="noSuchError"&gt;</span></p>
<p><span><span>&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span><span>从指定的<span>ActionMessages</span>对象中检索<span>&nbsp;&lt;/logic:messagesNotPresent&gt;</span></span></p>
<p><strong>&nbsp;</strong></p>
<p><strong><span><br>4</span></strong><strong><span>．请求转发或重定向</span></strong><span>a.<strong>&lt;logic:forward</strong> name="index"/&gt;,</span><span>与配置中<span>&lt;global-forwards&gt;</span>同名</span></p>
<p><span>b.<strong>&lt;logic:redirect</strong> href="http://www.apache.org"/&gt;,</span><span>也有<span>page,href</span>和<span>forward</span>三种属性</span></p>
<p><strong><span><br><br>5</span></strong><strong><span>．循环遍历<span>//offset</span>为开始位置，<span>indexId</span>为序号</span></strong></p>
<p><strong><span>a. </span></strong><strong><span>遍历集合</span></strong><span>&lt;% Vector animals=new Vector(); animals.addElement("Dog");</span></p>
<p><span>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>animals.addElement("Cat"); animals.addElement("Bird");</span></p>
<p><span>request.setAttribute("Animals", animals);%&gt;</span></p>
<p><strong><span>&lt;logic:iterate id="element" indexId="index" name="Animals" offset="1" length="2"&gt;</span></strong></p>
<p><span>&lt;bean:write name="index"/&gt;.&lt;bean:write name="element"/&gt;&lt;BR&gt;&lt;/logic:iterate&gt;</span></p>
<p><span>b.<strong> </strong></span><strong><span>遍历<span>Map</span></span></strong><span>&lt;% HashMap h= new HashMap();String fruits[ ] = {"apple","orange","banana"};</span></p>
<p><span>h.put("Fruits", fruits); request.setAttribute("catalog", h); %&gt;</span></p>
<p><strong><span>&lt;logic:iterate</span></strong><span> id="map" name="catalog"&gt; &lt;bean:write name="map" property="key"/&gt;&lt;BR&gt;</span></p>
<p><span>&lt;logic:iterate id="val" name="map" property="value"&gt;&lt;bean:write name="val"/&gt;</span></p>
<p><span>&lt;/logic:iterate&gt;<span>&nbsp;&nbsp; </span><strong><span>&lt;/logic:iterate&gt;</span></strong><span>&nbsp;&nbsp; </span>//</span><span>如果<span>value</span>不是集合就不用嵌套了</span></p>
<p><strong><span><br><br>四．利用<span>Tiles</span>模板和<span>Tiles</span>组件创建复合式网页</span></strong></p>
<p><span>1.</span><span>在<span>web.xml</span>中配置所需要的<span>&lt;tablib&gt;url</span>和<span>location</span></span></p>
<p align=left><span>2.</span><span>建立<span>tiles</span>的<span>xml</span>文件放在<span>WEB-INF</span>下：<span>&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;</span></span></p>
<p align=left><span>&nbsp;&lt;!DOCTYPE tiles-definitions PUBLIC</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd"&gt;</span></p>
<p align=left><span>&lt;tiles-definitions&gt;&nbsp;&lt;definition&nbsp;name="<strong><span>index-definition</span></strong>" path="/layout.jsp"&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;<strong><span>put</span></strong> name="header"&nbsp;value="header.jsp"/&gt;<span>&nbsp;&nbsp; </span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;put name="content" value="indexContent.jsp"/&gt;<span>&nbsp;&nbsp; </span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;put name="footer"&nbsp;value="footer.jsp"/&gt; &lt;/definition&gt;&nbsp;&nbsp;</span></p>
<p align=left><span>&lt;definition&nbsp;name="<strong><span>product-definition</span></strong>"&nbsp;path="/layout.jsp"&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;put name="sidebar" value="sidebar.jsp"/&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;put name="header"&nbsp;value="header.jsp"/&gt;<span>&nbsp;&nbsp; </span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;put name="content" value="productContent.jsp"/&gt;<span>&nbsp;&nbsp; </span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;put name="footer"&nbsp;value="footer.jsp"/&gt;<span>&nbsp;&nbsp;&nbsp; </span>&lt;/definition&gt;</span></p>
<p align=left><span>&lt;/tiles-definitions&gt;</span></p>
<p align=left><span>3</span><span>．在<span>struts</span>配置文件中配置<span>TilesPlugin</span>插件（<span>ctrl+n</span>）<span>:</span></span></p>
<p align=left><span>&lt;plug-in className="org.apache.struts.tiles.TilesPlugin" &gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>&lt;set-property property="definitions-<strong><span>config</span></strong>" value="/WEB-INF/tiles-defs.xml"/&gt;</span></p>
<p align=left><span>&lt;set-property property="definitions-<strong><span>parser</span></strong>-validate" value="true"/&gt;&nbsp;&lt;/plug-in&gt;</span></p>
<p align=left><span>4.</span><span>在<span>Action</span>已经存在<span>ActionServlet,</span>并在<span>struts</span>配置文件中配置<span>Action</span>来调用<span>Tiles</span>组件</span></p>
<p align=left><span>&lt;action path="/<strong>index</strong>"<span>&nbsp;&nbsp; </span>type="org.apache.struts.actions.<strong><span>ForwardAction</span></strong>"</span></p>
<p align=left><strong><span>parameter="index-definition"</span></strong><span>&gt;<span>&nbsp;&nbsp;&nbsp; </span>&lt;/action&gt;</span></p>
<p align=left><strong><span>ForwardAction</span></strong><strong><span>为<span>Action</span>内置对象，专门负责转发功能，在将请求转发给<span>parameter</span>的组件</span></strong></p>
<p align=left>&nbsp;</p>
<p align=left><span>5</span><span>．在<span>index.jsp</span>中插入<span>Tiles</span>组件<span>&lt;%@ page contentType="text/html; charset=UTF-8" %&gt;</span></span></p>
<p align=left><span>&lt;%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %&gt;</span></p>
<p align=left><strong><span>&lt;tiles:insert definition="index-definition"/&gt;</span></strong></p>
<p align=left><span>6.</span><span>在<span>layout.jsp</span>文件中进行布局并设计好其他页面：</span></p>
<p align=left><span>&lt;%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%&gt;</span></p>
<p align=left><span>&lt;table width="100%" height="100%"&gt;</span></p>
<p align=left><span>&nbsp;&lt;tr&gt;&lt;td height="15%"&gt;<strong><span>&lt;tiles:insert attribute="header"/&gt;</span></strong> &lt;/td&gt; &nbsp;&lt;/tr&gt;</span></p>
<p align=left><span>&nbsp;&lt;tr&gt;&lt;td valign="top"&gt;<strong>&lt;tiles:insert attribute="content"/&gt;</strong> &lt;/td&gt; &lt;/tr&gt;</span></p>
<p align=left><span>&nbsp;&lt;tr&gt;&lt;td valign="bottom"&gt;<strong>&lt;tiles:insert attribute="footer"/&gt;</strong>&lt;/td&gt;&lt;/tr&gt;&nbsp;&lt;/table&gt;</span></p>
<p align=left><span>备注：在需要出现的页面只有写<strong><span>&lt;tiles:insert definition="*"/&gt;</span></strong>就可以插入框架，根据<strong><span>definition</span><span>中的<span>content</span></span></strong>改变主体。</span></p>
<p align=left><span><br><br>7</span><span>．<span>Tiles</span>组件的组合<strong><span>（<span>type="definition"</span>）</span>以示区别</strong></span></p>
<p align=left><span>&lt;tiles-definitions&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>&lt;definition&nbsp;name="sidebar-definition"<span>&nbsp;&nbsp; </span>path="/sidebar-layout.jsp"&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;put name="top"&nbsp;value="flags.jsp"/&gt;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/definition&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>&lt;definition&nbsp;name="index-definition"<span>&nbsp;&nbsp; </span>path="/layout.jsp"&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span>&lt;put name="sidebar" value="sidebar-definition" type="definition"/&gt;</span></strong></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;put name="header"&nbsp;value="header.jsp"/&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>&lt;/definition&gt;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/tiles-definitions&gt;//</span><span>将一个组件<span>put</span>成另一个组件的元素</span></p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/130900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-07-17 17:50 <a href="http://www.blogjava.net/baoyaer/articles/130900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts结合Velocity开发web应用</title><link>http://www.blogjava.net/baoyaer/articles/120805.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 30 May 2007 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/120805.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/120805.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/120805.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/120805.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/120805.html</trackback:ping><description><![CDATA[<div class=postcontent>
<p>在开始我们的例子前需要说明一下，这篇文章并不打算讲解如何使用struts和velocity，而是将目标锁定在struts和velocity的协同工作上面。</p>
<p>一切准备就绪后，就开始我们的第一个例子吧。</p>
<p>1、建立一个test.vm文件，和jsp放在同一目录中。</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 id=Codehighlighter1_2_28_Open_Image onclick="this.style.display='none'; Codehighlighter1_2_28_Open_Text.style.display='none'; Codehighlighter1_2_28_Closed_Image.style.display='inline'; Codehighlighter1_2_28_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_2_28_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2_28_Closed_Text.style.display='none'; Codehighlighter1_2_28_Open_Image.style.display='inline'; Codehighlighter1_2_28_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top> <span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span> <span id=Codehighlighter1_2_28_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_2_28_Open_Text><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@&nbsp;page&nbsp;pageEncoding</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">utf-8</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span> </span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span> <span style="COLOR: #000000"><br><img id=Codehighlighter1_34_73_Open_Image onclick="this.style.display='none'; Codehighlighter1_34_73_Open_Text.style.display='none'; Codehighlighter1_34_73_Closed_Image.style.display='inline'; Codehighlighter1_34_73_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_34_73_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_34_73_Closed_Text.style.display='none'; Codehighlighter1_34_73_Open_Image.style.display='inline'; Codehighlighter1_34_73_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top> </span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span> <span id=Codehighlighter1_34_73_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_34_73_Open_Text><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>request.setCharacterEncoding(</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">utf-8</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span> </span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">html</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">head</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">meta&nbsp;</span> <span style="COLOR: #ff0000">http-equiv</span> <span style="COLOR: #0000ff">="Content-Type"</span> <span style="COLOR: #ff0000">&nbsp;content</span> <span style="COLOR: #0000ff">="text/html;&nbsp;charset=utf-8"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">title</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">struts&nbsp;velocity&nbsp;六月天</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">title</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">head</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">body</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>${test.getTest()}&nbsp;//注意这里使用了velocity代码，从test对象中取数据。<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">body</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">html</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span></div>
<p>2、新建Form Bean，使它拥有一个属性test。</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 id=Codehighlighter1_41_198_Open_Image onclick="this.style.display='none'; Codehighlighter1_41_198_Open_Text.style.display='none'; Codehighlighter1_41_198_Closed_Image.style.display='inline'; Codehighlighter1_41_198_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_41_198_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_41_198_Closed_Text.style.display='none'; Codehighlighter1_41_198_Open_Image.style.display='inline'; Codehighlighter1_41_198_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">&nbsp;TestForm&nbsp;</span> <span style="COLOR: #0000ff">extends</span> <span style="COLOR: #000000">&nbsp;ActionForm&nbsp;</span> <span id=Codehighlighter1_41_198_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_41_198_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #000000">&nbsp;String&nbsp;test;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_98_125_Open_Image onclick="this.style.display='none'; Codehighlighter1_98_125_Open_Text.style.display='none'; Codehighlighter1_98_125_Closed_Image.style.display='inline'; Codehighlighter1_98_125_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_98_125_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_98_125_Closed_Text.style.display='none'; Codehighlighter1_98_125_Open_Image.style.display='inline'; Codehighlighter1_98_125_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;String&nbsp;getTest()&nbsp;</span> <span id=Codehighlighter1_98_125_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_98_125_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;test;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br><img id=Codehighlighter1_164_196_Open_Image onclick="this.style.display='none'; Codehighlighter1_164_196_Open_Text.style.display='none'; Codehighlighter1_164_196_Closed_Image.style.display='inline'; Codehighlighter1_164_196_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_164_196_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_164_196_Closed_Text.style.display='none'; Codehighlighter1_164_196_Open_Image.style.display='inline'; Codehighlighter1_164_196_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000">&nbsp;setTest(String&nbsp;test)&nbsp;</span> <span id=Codehighlighter1_164_196_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_164_196_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">this</span> <span style="COLOR: #000000">.test&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;test;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span></div>
<p>3、新建一个TestAction。</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 id=Codehighlighter1_39_449_Open_Image onclick="this.style.display='none'; Codehighlighter1_39_449_Open_Text.style.display='none'; Codehighlighter1_39_449_Closed_Image.style.display='inline'; Codehighlighter1_39_449_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_39_449_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_449_Closed_Text.style.display='none'; Codehighlighter1_39_449_Open_Image.style.display='inline'; Codehighlighter1_39_449_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">&nbsp;TestAction&nbsp;</span> <span style="COLOR: #0000ff">extends</span> <span style="COLOR: #000000">&nbsp;Action&nbsp;</span> <span id=Codehighlighter1_39_449_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_39_449_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;ActionForward&nbsp;execute(ActionMapping&nbsp;mapping,&nbsp;ActionForm&nbsp;form,<br><img id=Codehighlighter1_164_447_Open_Image onclick="this.style.display='none'; Codehighlighter1_164_447_Open_Text.style.display='none'; Codehighlighter1_164_447_Closed_Image.style.display='inline'; Codehighlighter1_164_447_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_164_447_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_164_447_Closed_Text.style.display='none'; Codehighlighter1_164_447_Open_Image.style.display='inline'; Codehighlighter1_164_447_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>HttpServletRequest&nbsp;req,&nbsp;HttpServletResponse&nbsp;res)&nbsp;</span> <span id=Codehighlighter1_164_447_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_164_447_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestForm&nbsp;cform&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;(TestForm)form;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cform.setTest(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">hello&nbsp;struts&nbsp;and&nbsp;velocity</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">注意这里，将form置入request中，它的key是test<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">这个key也就是vm页面中的test对象的引用${test.getTest()}</span> <span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> </span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.setAttribute(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">test</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">,&nbsp;cform);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;mapping.findForward(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">success</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span></div>
<p><br>4、配置struts-config.xml文件</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">&lt;</span> <span style="COLOR: #800000">form-beans</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">form-bean&nbsp;</span> <span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="TestForm"</span> <span style="COLOR: #ff0000">&nbsp;type</span> <span style="COLOR: #0000ff">="org.junesky.form.TestForm"</span> <span style="COLOR: #0000ff">/&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">form-beans</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">action<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span> <span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="TestForm"</span> <span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>input</span> <span style="COLOR: #0000ff">="/error.jsp"</span> <span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>scope</span> <span style="COLOR: #0000ff">="request"</span> <span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>path</span> <span style="COLOR: #0000ff">="/test"</span> <span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>validate</span> <span style="COLOR: #0000ff">="false"</span> <span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>type</span> <span style="COLOR: #0000ff">="org.junesky.action.TestAction"</span> <span style="COLOR: #ff0000">&nbsp;</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">forward&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span> <span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="success"</span> <span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>path</span> <span style="COLOR: #0000ff">="/test.vm"</span> <span style="COLOR: #ff0000">&nbsp;</span> <span style="COLOR: #0000ff">/&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">action</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span></div>
<p>检查没有错误后，运行，就会在页面上显示出hello struts and velocity。</p>
<p>　　关于struts和velocity的配置是很容易理解的，最令初学者头痛的是，velocity是如何取到数据的？我们在单独使用velocity进行开发时，需要初始化，并为其设置想要返回的页面。如下：</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: #000000">VelocityEngine&nbsp;ve&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000">&nbsp;VelocityEngine();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>ve.init();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Template&nbsp;t&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;ve.getTemplate(&nbsp;</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">hellosite.vm</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">&nbsp;);</span> </div>
<p>而当与struts一同进行开发时，这一步就可以省去了，并且我们不必在为context中赋值：</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: #000000">VelocityContext&nbsp;context&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000">&nbsp;VelocityContext();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>context.put(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">test</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">,&nbsp;</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">hello&nbsp;struts&nbsp;and&nbsp;velocity&nbsp;</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);</span> </div>
<p>我们只需在Struts的Action层中将值置入request或session中即能达到相同的效果。</p>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/120805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-05-30 09:54 <a href="http://www.blogjava.net/baoyaer/articles/120805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 使用struts-menu制作树型菜单实例 </title><link>http://www.blogjava.net/baoyaer/articles/120615.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 29 May 2007 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/120615.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/120615.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/120615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/120615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/120615.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;新建j2ee工程，工程名称为：struts-menuContext root URL: /menu选中Add JSTL libraries to WEB-INF/lib forlder? JSTL版本（随意）&nbsp;以下所有的文件可以从源代码中拷贝拷贝文件中的以下内容到工程的webroot目录中images、scripts、styles、template...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/120615.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/120615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-05-29 10:07 <a href="http://www.blogjava.net/baoyaer/articles/120615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts filter使用学习笔记</title><link>http://www.blogjava.net/baoyaer/articles/120028.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 25 May 2007 08:37:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/120028.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/120028.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/120028.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/120028.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/120028.html</trackback:ping><description><![CDATA[<p>filter: 过滤组件，就是在请求与服务器之间的一个过滤组件。<br>使用struts的filter组件，需要下面步奏： <br><span style="COLOR: red">1.在web.xml中配置filter的相关信息<br>2.写相应的filter。</span><br><br>下面列了几个简单的filter列子：<br><span style="COLOR: red"><strong>一．页面编码过滤器</strong></span> <br>在web.xml文件中加入如下配置信息</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: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;页面请求编码过滤器&nbsp;注意每个页面的pageEncoding="GB2312"&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">encodingFilter</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">bluemoon.crm.systemmanage.struts.Filter.EncodingFilter</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Encoding</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">GB2312</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">encodingFilter</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;对全部的jsp页面有效，比较郁闷的是没有太多的配置方式&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">页面请求编码过滤器结束</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
相关代码：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">&nbsp;bluemoon.crm.systemmanage.struts.Filter;<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">&nbsp;java.io.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;EncodingFilter&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;Filter&nbsp;<br><img id=Codehighlighter1_141_816_Open_Image onclick="this.style.display='none'; Codehighlighter1_141_816_Open_Text.style.display='none'; Codehighlighter1_141_816_Closed_Image.style.display='inline'; Codehighlighter1_141_816_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_141_816_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_141_816_Closed_Text.style.display='none'; Codehighlighter1_141_816_Open_Image.style.display='inline'; Codehighlighter1_141_816_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_141_816_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_141_816_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;String&nbsp;encoding&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;FilterConfig&nbsp;config;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;init(FilterConfig&nbsp;filterConfig)&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;ServletException&nbsp;<br><img id=Codehighlighter1_281_396_Open_Image onclick="this.style.display='none'; Codehighlighter1_281_396_Open_Text.style.display='none'; Codehighlighter1_281_396_Closed_Image.style.display='inline'; Codehighlighter1_281_396_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_281_396_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_281_396_Closed_Text.style.display='none'; Codehighlighter1_281_396_Open_Image.style.display='inline'; Codehighlighter1_281_396_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_281_396_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_281_396_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.config&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;filterConfig;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从web.xml配置文件中获取编码配置&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.encoding&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;filterConfig.getInitParameter(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Encoding</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;doFilter(ServletRequest&nbsp;request,&nbsp;ServletResponse&nbsp;response,&nbsp;FilterChain&nbsp;chain)&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;IOException,&nbsp;ServletException&nbsp;<br><img id=Codehighlighter1_527_730_Open_Image onclick="this.style.display='none'; Codehighlighter1_527_730_Open_Text.style.display='none'; Codehighlighter1_527_730_Closed_Image.style.display='inline'; Codehighlighter1_527_730_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_527_730_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_527_730_Closed_Text.style.display='none'; Codehighlighter1_527_730_Open_Image.style.display='inline'; Codehighlighter1_527_730_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_527_730_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_527_730_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(request.getCharacterEncoding()&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)&nbsp;<br><img id=Codehighlighter1_574_692_Open_Image onclick="this.style.display='none'; Codehighlighter1_574_692_Open_Text.style.display='none'; Codehighlighter1_574_692_Closed_Image.style.display='inline'; Codehighlighter1_574_692_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_574_692_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_574_692_Closed_Text.style.display='none'; Codehighlighter1_574_692_Open_Image.style.display='inline'; Codehighlighter1_574_692_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_574_692_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_574_692_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>String&nbsp;encode&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;getEncoding();&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(encode&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)&nbsp;<br><img id=Codehighlighter1_629_689_Open_Image onclick="this.style.display='none'; Codehighlighter1_629_689_Open_Text.style.display='none'; Codehighlighter1_629_689_Closed_Image.style.display='inline'; Codehighlighter1_629_689_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_629_689_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_629_689_Closed_Text.style.display='none'; Codehighlighter1_629_689_Open_Image.style.display='inline'; Codehighlighter1_629_689_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_629_689_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_629_689_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置request的编码方式&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">request.setCharacterEncoding(encode);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>chain.doFilter(request,response);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;String&nbsp;getEncoding()&nbsp;<br><img id=Codehighlighter1_762_783_Open_Image onclick="this.style.display='none'; Codehighlighter1_762_783_Open_Text.style.display='none'; Codehighlighter1_762_783_Closed_Image.style.display='inline'; Codehighlighter1_762_783_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_762_783_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_762_783_Closed_Text.style.display='none'; Codehighlighter1_762_783_Open_Image.style.display='inline'; Codehighlighter1_762_783_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_762_783_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_762_783_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;encoding;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;destroy()&nbsp;<br><img id=Codehighlighter1_809_813_Open_Image onclick="this.style.display='none'; Codehighlighter1_809_813_Open_Text.style.display='none'; Codehighlighter1_809_813_Closed_Image.style.display='inline'; Codehighlighter1_809_813_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_809_813_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_809_813_Closed_Text.style.display='none'; Codehighlighter1_809_813_Open_Image.style.display='inline'; Codehighlighter1_809_813_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_809_813_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_809_813_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<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></div>
<br><br><span style="COLOR: red"><strong>二．用户是否登陆过滤器<br></strong><font color=#000000><span style="COLOR: #000000">首先</span>在web.xml文件中添加如下配置信息：</font><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"><strong><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">—用户是否登陆过滤器配置&nbsp;注意只过虑jsp页面，不过虑.do&nbsp;--</span><span style="COLOR: #0000ff">&gt;</span></strong><strong><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter</span><span style="COLOR: #0000ff">&gt;</span></strong><strong><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">userLoginedFilter</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span></strong><strong><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">bluemoon.crm.systemmanage.struts.Filter.UserLoginedFilter</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-class</span><span style="COLOR: #0000ff">&gt;</span></strong><strong><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter</span><span style="COLOR: #0000ff">&gt;</span></strong><strong><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-mapping</span><span style="COLOR: #0000ff">&gt;</span></strong><strong><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">userLoginedFilter</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span></strong><strong><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">*.jsp</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span></strong><strong><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-mapping</span><span style="COLOR: #0000ff">&gt;</span></strong><strong><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">—用户是否登陆过滤器配置结束&nbsp;--</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;</span></strong></div>
<br><span style="COLOR: #000000">增加一个Action、ActionForm &amp; JSP: <br>login.jsp中为一个登陆表单： <br>UserActionForm.java为一个Struts的ActionForm。 <br>UserAction.java将用户登陆信息添加到session中。<br><br>&nbsp;开发UserLoginedFilter.java：<br>&nbsp;
<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">&nbsp;bluemoon.crm.systemmanage.struts.Filter;<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">&nbsp;java.io.IOException;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.Filter;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.FilterChain;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.FilterConfig;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.RequestDispatcher;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.ServletException;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.ServletRequest;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.ServletResponse;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.http.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;bluemoon.crm.systemmanage.struts.forms.UserActionForm;<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">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;UserLoginedFilter&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;HttpServlet&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;Filter&nbsp;<br><img id=Codehighlighter1_501_1324_Open_Image onclick="this.style.display='none'; Codehighlighter1_501_1324_Open_Text.style.display='none'; Codehighlighter1_501_1324_Closed_Image.style.display='inline'; Codehighlighter1_501_1324_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_501_1324_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_501_1324_Closed_Text.style.display='none'; Codehighlighter1_501_1324_Open_Image.style.display='inline'; Codehighlighter1_501_1324_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_501_1324_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_501_1324_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;FilterConfig&nbsp;config;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;init(FilterConfig&nbsp;filterConfig)&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;ServletException&nbsp;<br><img id=Codehighlighter1_606_638_Open_Image onclick="this.style.display='none'; Codehighlighter1_606_638_Open_Text.style.display='none'; Codehighlighter1_606_638_Closed_Image.style.display='inline'; Codehighlighter1_606_638_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_606_638_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_606_638_Closed_Text.style.display='none'; Codehighlighter1_606_638_Open_Image.style.display='inline'; Codehighlighter1_606_638_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_606_638_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_606_638_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.config&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;filterConfig;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;doFilter(ServletRequest&nbsp;request,&nbsp;ServletResponse&nbsp;response,&nbsp;FilterChain&nbsp;chain)&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;IOException,&nbsp;ServletException&nbsp;<br><img id=Codehighlighter1_769_1291_Open_Image onclick="this.style.display='none'; Codehighlighter1_769_1291_Open_Text.style.display='none'; Codehighlighter1_769_1291_Closed_Image.style.display='inline'; Codehighlighter1_769_1291_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_769_1291_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_769_1291_Closed_Text.style.display='none'; Codehighlighter1_769_1291_Open_Image.style.display='inline'; Codehighlighter1_769_1291_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_769_1291_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_769_1291_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>RequestDispatcher&nbsp;dispatcher&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;request.getRequestDispatcher(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userLogin.jsp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>HttpServletRequest&nbsp;userRequest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(HttpServletRequest)request;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>UserActionForm&nbsp;userActionForm&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(UserActionForm)userRequest.getSession().getAttribute(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userActionForm</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(userActionForm&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;userActionForm.getUser_name()&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;userActionForm.getUser_name().trim().length()</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;<br><img id=Codehighlighter1_1140_1222_Open_Image onclick="this.style.display='none'; Codehighlighter1_1140_1222_Open_Text.style.display='none'; Codehighlighter1_1140_1222_Closed_Image.style.display='inline'; Codehighlighter1_1140_1222_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1140_1222_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1140_1222_Closed_Text.style.display='none'; Codehighlighter1_1140_1222_Open_Image.style.display='inline'; Codehighlighter1_1140_1222_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_1140_1222_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_1140_1222_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">用户未登录!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>dispatcher.forward(request,response);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">用户已登录!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>chain.doFilter(request,response);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;destroy()&nbsp;<br><img id=Codehighlighter1_1317_1321_Open_Image onclick="this.style.display='none'; Codehighlighter1_1317_1321_Open_Text.style.display='none'; Codehighlighter1_1317_1321_Closed_Image.style.display='inline'; Codehighlighter1_1317_1321_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1317_1321_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1317_1321_Closed_Text.style.display='none'; Codehighlighter1_1317_1321_Open_Image.style.display='inline'; Codehighlighter1_1317_1321_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_1317_1321_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_1317_1321_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<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></div>
<br><span style="COLOR: red"><strong>三.用户是否登陆过滤器在多模块中的应用</strong></span>： <br>1.修改上面的过滤器代码： <br>package bluemoon.crm.systemmanage.filter;
<p>import java.io.IOException;</p>
<p>import javax.servlet.Filter; <br>import javax.servlet.FilterChain; <br>import javax.servlet.FilterConfig; <br>import javax.servlet.RequestDispatcher; <br>import javax.servlet.ServletException; <br>import javax.servlet.ServletRequest; <br>import javax.servlet.ServletResponse; <br>import javax.servlet.http.*;</p>
<p>import bluemoon.crm.systemmanage.struts.forms.UserForm;</p>
<p>//用户未登陆过滤器 <br>public class UserNoLoginedFilter extends HttpServlet implements Filter <br>{</p>
<p>protected FilterConfig config; <br><br>public void init(FilterConfig filterConfig) throws ServletException <br>{ <br>this.config = filterConfig; <br>} <br>public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException <br>{ <br>//首先预定义到要转向的页面，由此带来的问题就是userLogin.jsp页面的图片必须要使用绝对路径，方法见userLogin.jsp页面 <br>RequestDispatcher dispatcher = request.getRequestDispatcher("/toLogin.do?prefix=&amp;page=/userLogin.jsp"); <br>//注意在struts-config.xml中增加一个Action，如下： <br>/* <br>*&lt;action <br>* attribute="userForm" <br>* name="userForm" <br>* path="/toLogin" <br>* scope="request" <br>* type="org.apache.struts.actions.SwitchAction" /&gt; <br>*/ <br>// 从session中获取用户form <br>HttpServletRequest userRequest = (HttpServletRequest)request; <br>UserForm userForm = (UserForm)userRequest.getSession().getAttribute("userForm"); <br><br>//如果未登陆则没有userFrom信息 <br>if(userForm == null || userForm.getUser_name() == null || userForm.getUser_name().trim().length()&lt;1) <br>{ <br>System.out.println("用户未登录!"); <br><br>//分发到登陆页面 <br>dispatcher.forward(request,response); <br>//((HttpServletResponse)response).sendRedirect("toModule.do?prefix=&amp;page=/userLogin.jsp"); <br>return; <br>} <br><br><br>System.out.println("用户"+userForm.getUser_name()+"已登录!"); <br>chain.doFilter(request,response); <br>} <br>public void destroy() <br>{ <br><br>} <br>}</p>
<p><strong><span style="COLOR: red">四.关闭Session过滤器</span></strong> <br>1.相关的HibernateUtil.java源码： <br>package com.worklog.util;</p>
<p>import org.hibernate.*; <br>import org.hibernate.cfg.*;</p>
<p>public class HibernateUtil { <br><br>private static SessionFactory sessionFactory; <br>static <br>{ <br>try <br>{ <br>sessionFactory = new Configuration().configure().buildSessionFactory(); <br>} <br>catch(Exception e) <br>{ <br>e.printStackTrace(); <br>} <br>} <br><br>public static final ThreadLocal&lt;Session&gt; threadLocalSession = new ThreadLocal&lt;Session&gt;(); <br>public static final ThreadLocal&lt;Transaction&gt; threadLocalTransaction = new ThreadLocal&lt;Transaction&gt;(); <br>public static Session currentSession() <br>{ <br>Session session = threadLocalSession.get(); <br>try <br>{ <br>if(session == null || !session.isOpen()) <br>{ <br>session = openSession(); <br>threadLocalSession.set(session); <br>} <br>} <br>catch(Exception e) <br>{ <br>e.printStackTrace(); <br>System.out.println("获取Session失败"); <br>} <br>return session; <br>} <br>public static Session openSession() throws Exception <br>{ <br>return getSessionFactory().openSession(); <br>} <br>public static SessionFactory getSessionFactory() throws Exception <br>{ <br>return sessionFactory; <br>} <br>public static void closeSession() <br>{ <br>Session session = (Session)threadLocalSession.get(); <br>threadLocalSession.set(null); <br>try <br>{ <br>if(session != null &amp;&amp; session.isOpen()) <br>{ <br>//System.out.println("HibernateUtil.java--line59,关闭Session！"); <br>session.close(); <br>} <br>} <br>catch(Exception e) <br>{ <br>e.printStackTrace(); <br>System.out.println("关闭Session失败"); <br>} <br>} <br>public static void beginTransaction() <br>{ <br>Transaction tx = (Transaction)threadLocalTransaction.get(); <br>try <br>{ <br>if(tx == null) <br>{ <br>tx = currentSession().beginTransaction(); <br>threadLocalTransaction.set(tx); <br>} <br>} <br>catch(Exception e) <br>{ <br>e.printStackTrace(); <br>System.out.println("开始事务失败"); <br>} <br>} <br>public static void commitTransaction() <br>{ <br>Transaction tx = (Transaction)threadLocalTransaction.get(); <br>try <br>{ <br>if(tx !=null &amp;&amp; !tx.wasCommitted() &amp;&amp; !tx.wasRolledBack()) <br>{ <br>tx.commit(); <br>} <br>threadLocalTransaction.set(null); <br>} <br>catch(Exception e) <br>{ <br>e.printStackTrace(); <br>System.out.println("提交失败"); <br>} <br>} <br>public static void rollbackTransaction() <br>{ <br>Transaction tx = (Transaction)threadLocalTransaction.get(); <br>try <br>{ <br>threadLocalTransaction.set(null); <br>if(tx != null &amp;&amp; !tx.wasCommitted() &amp;&amp; !tx.wasRolledBack()) <br>tx.rollback(); <br>} <br>catch(Exception e) <br>{ <br>e.printStackTrace(); <br>System.out.println("回滚失败"); <br>} <br>} <br>} <br>2.CloseSessionFilter.java源码： <br>package com.worklog.filter;</p>
<p>import java.io.IOException;</p>
<p>import javax.servlet.Filter; <br>import javax.servlet.FilterChain; <br>import javax.servlet.FilterConfig; <br>import javax.servlet.ServletException; <br>import javax.servlet.ServletRequest; <br>import javax.servlet.ServletResponse; <br>import javax.servlet.http.HttpServletRequest; <br>import javax.servlet.http.HttpServletResponse;</p>
<p>import org.apache.commons.logging.Log; <br>import org.apache.commons.logging.LogFactory;</p>
<p>import com.worklog.util.HibernateUtil;</p>
<p>public class CloseSessionFilter implements Filter{ <br>Log log = LogFactory.getLog(this.getClass()); <br>protected FilterConfig config; <br><br>public void init(FilterConfig config) throws ServletException <br>{ <br>this.config = config; <br>} <br><br>public void doFilter( <br>ServletRequest request, <br>ServletResponse response, <br>FilterChain chain) <br>throws IOException,ServletException <br>{ <br>try <br>{ <br>//让后面的Filter链处理请求，这个Filter仅仅拦截响应处理Hibernate操作 <br>chain.doFilter((HttpServletRequest)request, (HttpServletResponse)response); <br>} <br>finally <br>{ <br>try <br>{ <br>//一直没有合适的关闭session的方法 <br>HibernateUtil.closeSession(); <br>//System.out.println("close session success"); <br>log.debug("close session success"); <br>} <br>catch(Exception e) <br>{ <br>HibernateUtil.rollbackTransaction(); <br>System.out.println("can not close session!\nerrors:"+e.getMessage()); <br>log.debug("can not close session!\nerrors:"+e.getMessage()); <br>} <br>finally <br>{ <br>HibernateUtil.closeSession(); <br>} <br>} <br>} <br><br>public void destroy() <br>{ <br><br>} <br>} <br>3.web.xml配置 <br>&lt;?xml version="1.0" encoding="GB2312"?&gt; <br>&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt; <br>&lt;!-- 关闭Session过滤器 --&gt; <br>&lt;filter&gt; <br>&lt;filter-name&gt;closeSessionFilter&lt;/filter-name&gt; <br>&lt;filter-class&gt;com.worklog.filter.CloseSessionFilter&lt;/filter-class&gt; <br>&lt;/filter&gt; <br>&lt;filter-mapping&gt; <br>&lt;filter-name&gt;closeSessionFilter&lt;/filter-name&gt; <br>&lt;servlet-name&gt;action&lt;/servlet-name&gt; <br>&lt;/filter-mapping&gt; <br>&lt;!-- 关闭Session过滤器结束 --&gt; <br><br>&lt;servlet&gt; <br>&lt;servlet-name&gt;action&lt;/servlet-name&gt; <br>&lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt; <br>&lt;init-param&gt; <br>&lt;param-name&gt;config&lt;/param-name&gt; <br>&lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt; <br>&lt;/init-param&gt; <br>&lt;init-param&gt; <br>&lt;param-name&gt;debug&lt;/param-name&gt; <br>&lt;param-value&gt;3&lt;/param-value&gt; <br>&lt;/init-param&gt; <br>&lt;init-param&gt; <br>&lt;param-name&gt;detail&lt;/param-name&gt; <br>&lt;param-value&gt;3&lt;/param-value&gt; <br>&lt;/init-param&gt; <br>&lt;load-on-startup&gt;0&lt;/load-on-startup&gt; <br>&lt;/servlet&gt; <br>&lt;servlet-mapping&gt; <br>&lt;servlet-name&gt;action&lt;/servlet-name&gt; <br>&lt;url-pattern&gt;*.do&lt;/url-pattern&gt; <br>&lt;/servlet-mapping&gt; <br>&lt;/web-app&gt;</p>
</span></span>
<img src ="http://www.blogjava.net/baoyaer/aggbug/120028.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-05-25 16:37 <a href="http://www.blogjava.net/baoyaer/articles/120028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts 的log4j配置</title><link>http://www.blogjava.net/baoyaer/articles/119550.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 24 May 2007 01:04:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/119550.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/119550.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/119550.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/119550.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/119550.html</trackback:ping><description><![CDATA[<p><span style="COLOR: darkred">1、将log4j.properties文件直接放到classs目录下；</span> <br># Set root category priority to INFO and its only appender to CONSOLE. <br>#log4j.rootCategory=ERROR, LOGFILE <br>log4j.rootCategory=INFO, CONSOLE, LOGFILE <br>log4j.debug=true</p>
<p># Set the enterprise logger category to FATAL and its only appender to CONSOLE. <br>log4j.logger.org.apache.axis.enterprise=INFO, CONSOLE</p>
<p># CONSOLE is set to be a ConsoleAppender using a PatternLayout. <br>log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender <br>log4j.appender.CONSOLE.Threshold=INFO <br>log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout <br>log4j.appender.CONSOLE.layout.ConversionPattern=- %m%n</p>
<p># LOGFILE is set to be a File appender using a PatternLayout. <br>log4j.appender.LOGFILE=org.apache.log4j.RollingFileAppender <br>log4j.appender.LOGFILE.File=webapps/ColorTone/logs/<span style="COLOR: blue">test.log</span></p>
<p><span style="COLOR: red"># 在windows平台可以不加后缀日志也能生成， <br># 但在linix平台下需要加后缀。</span></p>
<p>log4j.appender.LOGFILE.Append=true <br>log4j.appender.LOGFILE.Threshold=ERROR <br>log4j.appender.LOGFILE.MaxFileSize=10000KB <br>log4j.appender.LOGFILE.MaxBackupIndex=1000 <br>log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout <br>log4j.appender.LOGFILE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n</p>
<p><span style="COLOR: olive">该配置文件说明：</span> <br>同时输出到控制台和test.log文件中，log文件最大为10m，最大为1000个； <br>当一个日志文件达到最大尺寸时，Log4J会自动把test.log重命名为test.log.1，然后重建一个新的test.log文件，依次轮转； <br>在控制台输出的级别为info； <br>在日志文件输出为error级；</p>
<p>如果需要改为每天一个日志文件，则为： <br></p>
<div class=code_title>代码</div>
<div class=code_div>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-j>
    <li class=alt><span><span>#&nbsp;LOGFILE&nbsp;is&nbsp;set&nbsp;to&nbsp;be&nbsp;a&nbsp;File&nbsp;appender&nbsp;using&nbsp;a&nbsp;PatternLayout. &nbsp;&nbsp;</span></span>
    <li class=""><span>log4j.appender.LOGFILE=org.apache.log4j.DailyRollingFileAppender &nbsp;&nbsp;</span>
    <li class=alt><span>log4j.appender.LOGFILE.File=webapps/ColorTone/logs/log &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.LOGFILE.DatePattern&nbsp;=yyyy-MM-dd'.txt' &nbsp;&nbsp;</span>
    <li class=alt><span>log4j.appender.LOGFILE.Append=</span><span class=keyword>true</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.LOGFILE.Threshold=ERROR &nbsp;&nbsp;</span>
    <li class=alt><span>log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout &nbsp;&nbsp;</span>
    <li class=""><span>log4j.appender.LOGFILE.layout.ConversionPattern=%-d{yyyy-MM-dd&nbsp;HH:mm:ss}&nbsp;[%c]-[%p]&nbsp;%m%n &nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<script type=text/javascript>render_code();</script>
<br>以上配置是每天产生一个备份文件。其中备份文件的名字叫log。 <br>具体的效果是这样：<span style="COLOR: brown">当天的日志信息记录在log文件中</span>，前一天的记录在名称为 logyyyy-mm-dd.txt 的文件中。 <br>类似的，如果需要每月产生一个文件可以修改上面的配置： <br>将 <br>log4j.appender.R.DatePattern = '.'yyyy-MM-dd <br>改为 <br>log4j.appender.R.DatePattern = '.'yyyy-MM
<p>&nbsp;</p>
<p><span style="COLOR: darkred">2、在ColorTone目录下建立logs目录</span></p>
<p><span style="COLOR: darkred">3、在action中增加</span> <br>static Logger _log = Logger.getLogger(LoginAction.class.getName()); //log4j（1） <br>然后就可以在需要的地方进行日志记载 <br>_log.debug("做下测试.debug"); <br>_log.info("做下测试.info"); <br>_log.warn("做下测试.warn"); <br>_log.error("做下测试.error"); <br>_log.fatal("做下测试.fatal"); <br><span style="COLOR: red">注：日志文件最有有后缀，如logs.log，否则在linix版本下不能生成日志文件</span></p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/119550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-05-24 09:04 <a href="http://www.blogjava.net/baoyaer/articles/119550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简化struts开发</title><link>http://www.blogjava.net/baoyaer/articles/117312.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 14 May 2007 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/117312.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/117312.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/117312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/117312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/117312.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp; Struts 1.2 其实已经大不同，只要大家有简约的态度，即使我们日常的Struts，同样可以写得非常精简，不一定要如传统观念认为的那么繁重，从而节省每天编码的时间。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;Struts与Spring结合的基本知识请阅读<a title=Struts href="http://wiki.springside.org.cn/display/springside/Struts"><u><font color=#0000ff>Struts使用要点</font></u></a>。</p>
<h2><a name=PragmaticStruts-1.DispatchAction></a>1.DispatchAction</h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 以一个Controller响应一组动作绝对是Controller界的真理，Struts的DispatchAction同样可以做到这点。</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">action&nbsp;</span><span style="COLOR: #ff0000">path</span><span style="COLOR: #0000ff">="/admin/user"</span><span style="COLOR: #ff0000">&nbsp;name</span><span style="COLOR: #0000ff">="userForm"</span><span style="COLOR: #ff0000">&nbsp;scope</span><span style="COLOR: #0000ff">="request"</span><span style="COLOR: #ff0000">&nbsp;parameter</span><span style="COLOR: #0000ff">="method"</span><span style="COLOR: #ff0000">&nbsp;validate</span><span style="COLOR: #0000ff">="false"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">forward&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="list"</span><span style="COLOR: #ff0000">&nbsp;path</span><span style="COLOR: #0000ff">="/admin/userList.jsp"</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>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;其中parameter="method" 设置了用来指定响应方法名的url参数名为method，即/admin/user.do?method=list 将调用UserAction的public ActionForward list(....)&nbsp;函数。&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp; &nbsp;public ActionForward unspecified(....) 函数可以指定不带method方法时的默认方法。</p>
<h2><a name=PragmaticStruts-2.strutsconfig.xml%E4%BD%BF%E7%94%A8%E9%80%9A%E9%85%8D%E7%AC%A6></a>2. struts-config.xml使用通配符</h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 对一些CRUD的Action，可以使用通配符，如果这批action里某个action某个方法还存在特殊路径，可以在代码里直接new ActionForward("/foo.jsp");</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">action&nbsp;</span><span style="COLOR: #ff0000">path</span><span style="COLOR: #0000ff">="/admin/*"</span><span style="COLOR: #ff0000">&nbsp;name</span><span style="COLOR: #0000ff">="{1}Form"</span><span style="COLOR: #ff0000">&nbsp;parameter</span><span style="COLOR: #0000ff">="method"</span><span style="COLOR: #ff0000">&nbsp;scope</span><span style="COLOR: #0000ff">="request"</span><span style="COLOR: #ff0000">&nbsp;validate</span><span style="COLOR: #0000ff">="false"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">forward&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="list"</span><span style="COLOR: #ff0000">&nbsp;path</span><span style="COLOR: #0000ff">="/WEB-INF/pages/admin/{1}List.jsp"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">forward&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="edit"</span><span style="COLOR: #ff0000">&nbsp;path</span><span style="COLOR: #0000ff">="/WEB-INF/pages/admin/{1}Form.jsp"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">forward&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="success"</span><span style="COLOR: #ff0000">&nbsp;path</span><span style="COLOR: #0000ff">="/admin/{1}.do?method=list"</span><span style="COLOR: #ff0000">&nbsp;redirect</span><span style="COLOR: #0000ff">="true"</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>
</div>
<h2><a name=PragmaticStruts-3.NoFormBean></a>3.No FormBean</h2>
<p>&nbsp;&nbsp;&nbsp; Struts 1.2.7 之后一共有三种方法，不需要定义FormBean Java类也不需要在struts-config.xml里详细定义formBean的每个属性。</p>
<p>&nbsp;&nbsp;&nbsp; 第一种是appfuse里使用的，定义<strong>DynaValidatorForm</strong>里，内嵌一个pojo属性.</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">form-bean&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="userForm"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="org.apache.struts.validator.DynaValidatorForm"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">form-property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="user"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="org.appfuse.model.User"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">form-bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span></div>
</div>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><span style="COLOR: #008000">//</span><span style="COLOR: #008000">取得form&nbsp;DynaActionForm&nbsp;userForm&nbsp;=&nbsp;(DynaActionForm)&nbsp;form;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">User&nbsp;user&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(User)&nbsp;userForm.get(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">user</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置form</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">userForm.set(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">user</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,user);<br></span></div>
</div>
<p>&nbsp;&nbsp;&nbsp; 第二种是用<strong>BeanValidatorForm</strong>，直接把Pojo作FormBean，无需继承于FormBean接口。</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">form-bean&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="userForm"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="org.springside.helloworld.domain.User"</span><span style="COLOR: #0000ff">/&gt;</span></div>
</div>
<div class=code>
<div class=codeContent></div>
<div class=codeContent></div>
<div class=codeContent>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><span style="COLOR: #008000">//</span><span style="COLOR: #008000">取得form&nbsp;Bean</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">ValidatorForm&nbsp;userForm&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(BeanValidatorForm)&nbsp;form;User&nbsp;user&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(User)&nbsp;userForm.getInstance();<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置form</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">BeanUtils.copyProperties(userForm,&nbsp;user);</span></div>
</div>
</div>
<div class=codeContent>&nbsp;&nbsp;&nbsp; 第3种是用<strong>LazyValidatorForm</strong> ，特别适合于FormBean中并不包含POJO商业对象<strong>所有属性</strong>的情况，因为通常项目里都属于这种情况，所以springside默认使用lazyValidatorForm.</div>
</div>
<p>&nbsp;&nbsp;&nbsp; 比如User对象 有 id,name,status三个属性，而form表单中只有id和name两个input框，如果使用方法1，2，直接把user 作为 form bean,&nbsp; user对象的status因为没设值，将为null，&nbsp; copy 到作为商业对象的user时，就会以null覆盖原值。而lazyBean就没有这个问题，如果form中没有status属性，它不会将它copy给商业对象。</p>
<p>&nbsp;&nbsp;&nbsp; 另外，apache commons-beantuils 1.7.0的lazybean仍有小bug,需要使用<strong>commons-1.7.1 snapshot版</strong>，而且它直接提供下载的snapshot版缺少了几个class，应使用springside提供的版本。</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">form-bean&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="bookForm"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="org.apache.struts.validator.LazyValidatorForm"</span><span style="COLOR: #0000ff">/&gt;</span></div>
</div>
<div class=code>
<div class=codeContent>&nbsp;</div>
<div class=codeContent>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><span style="COLOR: #000000">BeanUtils.copyProperties(user,&nbsp;form);</span></div>
</div>
</div>
<div class=codeContent>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
<div class=codeContent>&nbsp;注意User对象被自动绑定，默认Integer id 在空值时会被赋值为0，需要增加converter，让其默认为null，虽然也可以在web.xml里进行相关配置，但还是在基类里配置了比较安全。</div>
<div class=codeContent>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;{<br>ConvertUtils.register(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;IntegerConverter(</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">),&nbsp;Integer.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br>}</span></div>
</div>
</div>
</div>
<h2><a name=PragmaticStruts-%26nbsp%3B4.%E4%B8%80%E4%BA%9B%E4%B8%8D%E5%BF%85%E5%8F%97%E5%9B%B0%E4%BA%8EStruts%E6%9C%BA%E5%88%B6%E7%9A%84%E7%AE%80%E5%8C%96%E5%86%99%E6%B3%95></a>&nbsp; 4. 一些不必受困于Struts机制的简化写法</h2>
<p>&nbsp;&nbsp;&nbsp; 一些简便直接的方法，大家可不必太受困于Struts的机制：</p>
<h3><a name=PragmaticStruts-%26nbsp%3B%26nbsp%3B4.1%E4%B8%8D%E5%9C%A8strutsconfig.xml%E9%85%8D%E7%BD%AEjsp%E8%B7%AF%E5%BE%84%EF%BC%8C%E7%9B%B4%E6%8E%A5%E5%9C%A8%E4%BB%A3%E7%A0%81%E9%87%8C%E8%B7%B3%E8%BD%AC></a>&nbsp;&nbsp;4.1 不在struts-config.xml配置jsp路径，直接在代码里跳转</h3>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ActionForward(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/foo/bar.jsp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>or<br></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ActionForward(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/foo/bar.jsp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);</span></div>
</div>
<p>&nbsp;</p>
<h3><a name=PragmaticStruts-%26nbsp%3B%26nbsp%3B4.2%E4%B8%8D%E8%B5%B0jsp%EF%BC%8C%E7%9B%B4%E6%8E%A5%E8%BE%93%E5%87%BA%E5%AD%97%E7%AC%A6%E4%B8%B2></a>&nbsp;&nbsp; 4.2 不走jsp，直接输出字符串</h3>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><span style="COLOR: #000000">ActionForward&nbsp;execute(....){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/html;charset=UTF-8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().write(text);<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(IOException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(e);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br>}</span></div>
</div>
<p>&nbsp;</p>
<h3><a name=PragmaticStruts-%26nbsp%3B4.3.%E4%B8%8D%E4%BE%9D%E8%B5%96StrutsTaglib%EF%BC%8CEL%E7%9B%B4%E6%8E%A5%E8%BE%93%E5%87%BAFormBean%E5%B1%9E%E6%80%A7></a>&nbsp;4.3. 不依赖Struts Taglib，EL直接输出FormBean 属性</h3>
<p>普通FormBean：${bookForm.image}</p>
<p>LazyValidatorForm：${bookForm.map.image}&nbsp;</p>
<p>其中bookForm 是formBean名。另一种输出属性的方式是使用jodd-form, 设&lt;jodd:form bean="bookForm"&gt;</p>
<h3><a name=PragmaticStruts-4.4%E4%B8%8D%E7%94%A8i18N%E8%80%8C%E4%BD%BF%E7%94%A8Message%E4%B8%8EError></a>4.4 不用i18N地使用Message与Error</h3>
<p>&nbsp;&nbsp; Struts的ActionMessages很常用，但只接收i18N的key作为输入参数，老定义i18n很麻烦，偏方之一就是设一个message= {0}，然后直接new ActionMessage("message", message);</p>
<h2><a name=PragmaticStruts-5.%E7%BB%88%E6%9E%81%E5%8C%96%E7%AE%80StrutsEntityAction></a>5. 终极化简--StrutsEntityAction</h2>
<p>&nbsp;SpringSide封装的EnttiyCRUDAction，，每个包含了CRUD操作的Action仅需如下代码，详细请阅读<a title=SpringSideStruts href="http://wiki.springside.org.cn/display/springside/SpringSideStruts"><u><font color=#0000ff>SpringSide的Struts封装</font></u></a></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;UserAction&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;StrutsEntityAction</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">User,UserManager</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;UserManager&nbsp;userManager;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setUserManager(UserManager&nbsp;userManager)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.userManager&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;userManager;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}</span></div>
</div>
&nbsp;<br>
<img src ="http://www.blogjava.net/baoyaer/aggbug/117312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-05-14 13:14 <a href="http://www.blogjava.net/baoyaer/articles/117312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat web.xml配置</title><link>http://www.blogjava.net/baoyaer/articles/107428.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 30 Mar 2007 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/107428.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/107428.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/107428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/107428.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/107428.html</trackback:ping><description><![CDATA[
		<p class="entryTitle">web.xml元素介绍</p>
		<p class="entryContent">我将自己知道的web.xml的元素整理了一下： <br /><br />web.xml首先是肯定要包含它的schema. <br /><br />&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee"<br />    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"<br />    version="2.4"&gt;<br /><br />&lt;/web-app&gt;<br /><br />其它的元素都放在&lt;web-app&gt;&lt;/web-app&gt;之中。<br /><br />&lt;discription&gt;&lt;/discription&gt; 是对站台的描述<br />&lt;display-name&gt;&lt;/display-name&gt; 定义站台的名称<br />&lt;distributable/&gt; 是指定该站台是否可分布式处理<br /><br /><br />&lt;context-param&gt;&lt;/context-param&gt; 用来设定web站台的环境参数，它包含两个子元素：<br />    &lt;param-name&gt;&lt;/param-name&gt; 用来指定参数的名称<br />    &lt;param-value&gt;&lt;/param-value&gt; 用来设定参数值<br /><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">比如：</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;context-param&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">    &lt;param-name&gt;my_param&lt;/param-name&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">    &lt;param-value&gt;hello&lt;/param-value&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;/context-param&gt;<br /><br />在此设定的参数，可以在servlet中用 getServletContext().getInitParameter("my_param") 来取得<br /></span><br /><br />&lt;filter&gt;&lt;/filter&gt; 是用来声明filter的相关设定，它包含以下子元素：<br />    &lt;filter-name&gt;&lt;/filter-name&gt; 这当然就是指定filter的名字<br />    &lt;filter-class&gt;&lt;/filter-class&gt; 这是用来定义filter的类的名称<br />    &lt;init-param&gt;&lt;/init-param&gt; 用来定义参数，它有两个子元素：<br />        &lt;param-name&gt;&lt;/param-name&gt; 用来指定参数的名称<br />        &lt;param-value&gt;&lt;/param-value&gt; 用来设定参数值<br /><br /><span style="COLOR: rgb(0,102,0)">比如：</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;filter&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">        &lt;filter-name&gt;setCharacterEncoding&lt;/filter-name&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">        &lt;filter-class&gt;com.myTest.setCharacterEncodingFilter&lt;/filter-class&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">        &lt;init-param&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">            &lt;param-name&gt;encoding&lt;/param-name&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">            &lt;param-value&gt;GB2312&lt;/param-value&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">        &lt;/init-param&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;/filter&gt;<br /><br /><span style="COLOR: rgb(0,0,0)">与</span></span>&lt;filter&gt;&lt;/filter&gt;同时使用的是&lt;filter-mapping&gt;&lt;/filter-mapping&gt; 用来定义filter所对应的URL，它有两个子元素：<br />    &lt;filter-name&gt;&lt;/filter-name&gt; 指定filter的名字<br />    &lt;url-pattern&gt;&lt;/url-pattern&gt; 指定filter所对应的URL<br /><br /><span style="COLOR: rgb(0,102,0)">比如：</span><br /><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)"></span>&lt;filter-mapping&gt;<br />        &lt;filter-name&gt;setCharacterEncoding&lt;/filter-name&gt;<br />        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;<br /><br /><br /><span style="COLOR: rgb(0,0,0)">&lt;listener&gt;&lt;/listener&gt; 用来设定Listener接口，它的主要子元素为<br />    &lt;listener-class&gt;&lt;/listener-class&gt; 定义Listener的类名称<br /><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">比如：</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;listener&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">    </span></span>&lt;listener-class&gt;com.myTest.ContextListener&lt;/listener-class&gt; </span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,102,0)">&lt;/listener&gt;<br /><br /><span style="COLOR: rgb(0,0,0)"><br />&lt;servlet&gt;&lt;/servlet&gt; 用来声明一个servlet的数据，主要有以下子元素：<br />    &lt;servlet-name&gt;</span></span></span></span><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)">&lt;/servlet-name&gt;</span></span></span></span> 指定servlet的名称<br />    <span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)">&lt;servlet-class&gt;</span></span></span></span><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)">&lt;/servlet-class&gt;</span></span></span></span> 指定servlet的类名称<br />    &lt;jsp-file&gt;&lt;/jsp-file&gt; 指定web站台中的某个JSP网页的完整路径<br />    &lt;init-param&gt;&lt;/init-param&gt; 用来定义参数，和前面的&lt;init-param&gt;差不多<br /><br />同样，与<span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)">&lt;servlet&gt;&lt;/servlet&gt;一起使用的是&lt;servlet-mapping&gt;&lt;/servlet-mapping&gt; 用来定义servlet所对应的URL，包含两个子元素：<br />    </span></span></span></span><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)">&lt;servlet-name&gt;</span></span></span></span><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)">&lt;/servlet-name&gt;</span></span></span></span> 指定servlet的名称<br />    &lt;url-pattern&gt;&lt;/url-pattern&gt; 指定servlet所对应的URL<br /><br /><span style="COLOR: rgb(0,102,0)">比如：</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;servlet&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">        &lt;servlet-name&gt;ShoppingServlet&lt;/servlet-name&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">        &lt;servlet-class&gt;com.myTest.ShoppingServlet&lt;/servlet-class&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;/servlet&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">    </span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;servlet-mapping&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">        &lt;servlet-name&gt;ShoppingServlet&lt;/servlet-name&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">        &lt;url-pattern&gt;/shop/ShoppingServlet&lt;/url-pattern&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;/servlet-mapping&gt;<br /><br /><br /><span style="COLOR: rgb(0,0,0)">&lt;session-config&gt;&lt;/session-config&gt; 用来定义web站台中的session参数，包含一个子元素：</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    &lt;session-timeout&gt;&lt;/session-timeout&gt; 用来定义这个web站台所有session的有效期限，单位为                                                              分钟</span><br style="COLOR: rgb(0,0,0)" /><br style="COLOR: rgb(0,0,0)" /><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">&lt;mime-mapping&gt;&lt;/mime-mapping&gt; 定义某一个扩展名和某一个MIME Type做对映，包含两个                                                        子元素：</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    &lt;extension&gt;&lt;/extension&gt; 扩展名的名称</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    &lt;mime-type&gt;&lt;/mime-type&gt; MIME格式</span><br /><br />比如：<br />&lt;mime-mapping&gt;<br />    &lt;extension&gt;doc&lt;/extension&gt;<br />    &lt;mime-type&gt;application/vnd.ms-word&lt;/mime-type&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;/mime-mapping&gt; <br />&lt;mime-mapping&gt;<br />    &lt;extension&gt;xls&lt;/extension&gt;<br />    &lt;mime-type&gt;application/vnd.ms-excel&lt;/mime-type&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;/mime-mapping&gt; <br /><br /><br /><span style="COLOR: rgb(0,0,0)">&lt;welcome-file-list&gt;&lt;/welcom-file-list&gt; 用来定义首页的列单，包含一个子元素：</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    &lt;welcome-file&gt;&lt;/welcome-file&gt; 指定首页的文件名称</span><br /><br />比如：<br />&lt;welcome-file-list&gt;<br />    &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />    &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;/welcom-file-list&gt;<br /><br /><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">&lt;error-page&gt;&lt;/error-page&gt; 用来处理错误代码或异常的页面，有三个子元素：</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    &lt;error-code&gt;&lt;/error-code&gt; 指定错误代码</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    &lt;exception-type&gt;&lt;/exception-type&gt; 指定一个JAVA异常类型</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    &lt;location&gt;&lt;/location&gt; 指定在web站台内的相关资源路径</span><br style="COLOR: rgb(0,0,0)" /><br />比如：<br />&lt;error-page&gt;<br />    &lt;error-code&gt;404&lt;/error-code&gt;<br />    &lt;location&gt;/error404.jsp&lt;/location&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;/error-page&gt;<br />&lt;error-page&gt;<br />    &lt;exception-type&gt;java.lang.Exception&lt;/exception-type&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">    &lt;location&gt;/exception.jsp&lt;/location&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;/error-page&gt;<br /><br /><br /><span style="COLOR: rgb(0,0,0)">&lt;taglib&gt;&lt;/taglib&gt; 用来设定JSP网页所用到的Tag Library路径，有两个子元素：<br />    &lt;taglib-uri&gt;&lt;/taglib-uri&gt; 定义TLD文件的URI，在JSP网页中用taglib指令便可取得该URI的                                              TLD文件<br />    &lt;taglib-location&gt;&lt;/taglib-location&gt; 指定TLD文件相对于web站台的存放位置<br /><br /><span style="COLOR: rgb(0,102,0)">比如：</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;taglib&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">      &lt;taglib-uri&gt;myTaglib&lt;/taglib-uri&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">      &lt;taglib-location&gt;/WEB-INF/tlds/MyTaglib.tld&lt;/taglib-location&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;/taglib&gt;<br /><br /><br /><span style="COLOR: rgb(0,0,0)">&lt;resource-ref&gt;&lt;/resource-ref&gt; 定义利用JNDI取得站台可利用的资源，有五个子元素：<br />    &lt;description&gt;&lt;/description&gt; 资源说明<br />    &lt;rec-ref-name&gt;&lt;/rec-ref-name&gt; 资源名称<br />    &lt;res-type&gt;&lt;/res-type&gt; 资源种类<br />    &lt;res-auth&gt;&lt;/res-auth&gt; 资源经由Application或Container来许可<br />    &lt;res-sharing-scope&gt;&lt;/res-sharing-scope&gt; 资源是否可以共享，有Shareable和Unshareable两个                                                                     值，默认为</span></span></span></span><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,102,0)"><span style="COLOR: rgb(0,0,0)">Shareable<br /><br /><span style="COLOR: rgb(0,102,0)">比如，配置数据库连接池就可在此配置：</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;resource-ref&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">        &lt;description&gt;JNDI JDBC DataSource of shop&lt;/description&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">        &lt;res-ref-name&gt;jdbc/sample_db&lt;/res-ref-name&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">        &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">        &lt;res-auth&gt;Container&lt;/res-auth&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;/resource-ref&gt;<br /><br /><br /></span></span></span></span></span></p>
		<div class="postcontent">
				<font color="#000000">&lt;jsp-config&gt; 包括&lt;taglib&gt; 和&lt;jsp-property-group&gt; 两个子元素。<br />    <br />    其中&lt;taglib&gt;元素在JSP 1.2时就已经存在；而&lt;jsp-property-group&gt;是JSP 2.0 新增的元素。<br />    &lt;jsp-property-group&gt;元素主要有八个子元素，它们分别为：<br />    <br />    1.&lt;description&gt;：设定的说明；<br />    2.&lt;display-name&gt;：设定名称；<br />    3.&lt;url-pattern&gt;：设定值所影响的范围，如：/CH2 或 /*.jsp；<br />    4.&lt;el-ignored&gt;：若为true，表示不支持EL 语法；<br />    5.&lt;scripting-invalid&gt;：若为true，表示不支持&lt;% scripting %&gt;语法；<br />    6.&lt;page-encoding&gt;：设定JSP 网页的编码；<br />    7.&lt;include-prelude&gt;：设置JSP 网页的抬头，扩展名为.jspf；<br />    8.&lt;include-coda&gt;：设置JSP 网页的结尾，扩展名为.jspf。<br /><br /><br />一个简单的&lt;jsp-config&gt;元素完整配置：<br /><br /></font>
				<font color="#008000">&lt;jsp-config&gt;<br />    &lt;taglib&gt;<br />        &lt;taglib-uri&gt;Taglib&lt;/taglib-uri&gt;<br />        &lt;taglib-location&gt;/WEB-INF/tlds/MyTaglib.tld&lt;/taglib-location&gt;<br />    &lt;/taglib&gt;<br />    &lt;jsp-property-group&gt;<br />        &lt;description&gt;Special property group for JSP Configuration JSP example.&lt;/description&gt;<br />        &lt;display-name&gt;JSPConfiguration&lt;/display-name&gt;<br />        &lt;url-pattern&gt;/jsp/* &lt;/url-pattern&gt;<br />        &lt;el-ignored&gt;true&lt;/el-ignored&gt;<br />        &lt;page-encoding&gt;GB2312&lt;/page-encoding&gt;<br />        &lt;scripting-invalid&gt;true&lt;/scripting-invalid&gt;<br />        &lt;include-prelude&gt;/include/prelude.jspf&lt;/include-prelude&gt;<br />        &lt;include-coda&gt;/include/coda.jspf&lt;/include-coda&gt;<br />    &lt;/jsp-property-group&gt;<br />&lt;/jsp-config&gt;
<script><![CDATA[ 
function toBreakWord(intLen){
var obj=document.getElementById("ff");
var strContent=obj.innerHTML;  
var strTemp="";
while(strContent.length>intLen){
strTemp+=strContent.substr(0,intLen)+"<br>";  
strContent=strContent.substr(intLen,strContent.length);  
}
strTemp+="<br>"+strContent;
obj.innerHTML=strTemp;
}
if(document.getElementById  &&  !document.all)  toBreakWord(37)
]]&gt;</script></font>
		</div>
		<p class="entryContent">
				<br />
				<br />
		</p>
		<p class="entryTitle">配置web.xml来限制对某些servlet的请求</p>
		<p class="entryContent">有时我们只希望通过认证的用户才能请求某些servlet的话，就可以在web.xml中来进行相应的配置，来达到此目的。<br /><br />这就要用到&lt;security-constraint&gt;&lt;/security-constraint&gt;元素。<br />对于tomcat，中web.xml使用security-constraint元素需要在位于&lt;Tomcat-installation-directory&gt;/conf/tomcat-users.xml的XML文件中创建用户名和密码。比如下面的这个tomcat-users.xml文件：<br /><br /><span style="COLOR: rgb(0,102,0)">&lt;?xml version='1.0' encoding='utf-8'?&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;tomcat-users&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">  &lt;role rolename="tomcat"/&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">  &lt;role rolename="manager"/&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">  &lt;role rolename="admin"/&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">  &lt;user username="tomcat" password="tomcat" roles="tomcat"/&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">  &lt;user username="both" password="tomcat" roles="tomcat,manager"/&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">  &lt;user username="admin" password="admin" roles="admin"/&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">&lt;/tomcat-users&gt;</span><br /><br />此XML片段包括一个tomcat-users根元素，它包含一个或多个role和user元素。<br /><br /><br />然后在Web应用程序的web.xml中创建security-constraint、login-config和security-role元素。<br /><br /><span style="COLOR: rgb(0,102,0)">&lt;security-constraint&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">      &lt;web-resource-collection&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">          &lt;web-resource-name&gt;HelloServlet&lt;/web-resource-name&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">          &lt;url-pattern&gt;/HelloServlet&lt;/url-pattern&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">          &lt;http-method&gt;GET&lt;/http-method&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">          &lt;http-method&gt;POST&lt;/http-method&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">      &lt;/web-resource-collection&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">      &lt;auth-constraint&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">          &lt;description&gt;This applies only to the "tomcat" security role&lt;/description&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">          &lt;role-name&gt;admin&lt;/role-name&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">      &lt;/auth-constraint&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">      &lt;user-data-constraint&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">          &lt;transport-guarantee&gt;NONE&lt;/transport-guarantee&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">      &lt;/user-data-constraint&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">  &lt;/security-constraint&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">  </span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">  &lt;login-config&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">      &lt;auth-method&gt;BASIC&lt;/auth-method&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">  &lt;/login-config&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">  &lt;security-role&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">      &lt;role-name&gt;admin&lt;/role-name&gt;</span><br style="COLOR: rgb(0,102,0)" /><span style="COLOR: rgb(0,102,0)">  &lt;/security-role&gt;</span><br /><br /><span style="COLOR: rgb(0,0,0)">其中security-constraint元素包含一个或多个web-resource-collection元素，它是描述Web应用程序中的哪些web资源受到指定安全限制的保护。http-method元素指定安全限制覆盖的HTTP方法。上面的例子中，当我们对/HelloServlet的GET或POST请求时将触发配置的安全机制。<br />auth-constraint元素用于描述允许访问Web组件的安全角色。此例中安全角色的例子有tomcat、manager、admin。而只有当作为admin角色的用户才可以访问HelloServlet。<br /><br />Web应用程序通过login-config元素来认证用户，并确认该用户是否为正确的角色。<br />longin-config包含的transport-guarantee子元素用来指定认证方法，BASIC是一种常见的Web认证方式，浏览器给用户提示一个对话框，要求输入用户名和密码，随后Tomcat将给出的用户名和密码与tomcat-users.xml中的用户名和密码进行比较，然后使用前面的security-constraint</span><span style="COLOR: rgb(0,0,0)">配置来确定用户是否可访问受保护的servlet。<br /><br />（除BASIC外，还可以是FORM、CLIENT-CERT、DIGEST等）<br /><br />其实这种认证方法实际上有两个步骤：<br />1、检查提供的用户名和密码是否正确。<br />2、判断用户是否映射到特定的安全角色。例如，用户可能提供了正确的用户名和密码，但没有映射到特定的安全角色，也将被禁止访问特定的Web资源。<br /></span><br /><br /><br /><font color="#000000"><span style="COLOR: rgb(0,0,0)">通过此次整理，对web.xml中元素有了更清楚的了解，以后继续努力...</span><br /></font><web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4" xsi:schemalocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></web-app></p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/107428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-03-30 10:52 <a href="http://www.blogjava.net/baoyaer/articles/107428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servletContext和servletConfig</title><link>http://www.blogjava.net/baoyaer/articles/107387.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 30 Mar 2007 00:55:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/107387.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/107387.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/107387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/107387.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/107387.html</trackback:ping><description><![CDATA[对于web容器来说，ServletContext接口定义了一个servlet环境对象，这个对象定义了一个在servlet引擎上的servlet的视图。通过使用这个对象，servlet可以记录事件，得到资源并得到来自servlet的引擎类。<br />servlet容器在启动时会加载web应用，并为每个web应用创建唯一的servlet context对象，可以把ServletContext看成是一个Web应用的服务器端组件的共享内存，在ServletContext中可以存放共享数据，他提供了4个读取和设置共享数据的方法。具体见api帮助文档。<br />另外，ServletContext对象只在web应用被关闭的时候才被销毁，不同的web应用，ServletContext各自独立存在。<br />一个web应用由jsp,servlet，javabean等web组件的集合构成，每一个web应用，容器都会有一个背景对象，而javax.servlet.ServletContext接口就提供了访问这个背景对象的途径。你可以通过一个servlet实例的getServletContext()方法得到该servlet运行其中的这个背景对象，从这个背景对象中你可以访问如下信息资源：<br />1.初始化参数<br />2.存储在背景中的对象<br />3.与背景关联的资源<br />4.日志<br />最后针对ServletContext我自己的总结是：<br />ServletContext即servlet容器，其内提供的方法可以在同一web应用下的所有servlet中被使用<br /><br />而对于config对象来说，他与context相比，就有了很大的局限性。<br />当ServletConfig对象在servlet中被实例化后，对任何客户端在任何时候访问有效。但是一个servlet的ServletConfig对象不能被另一个servlet访问，也就是说，在本servlet声明后的ServletConfig只能在本servlet内被访问，属于内部持久有效的变量。<br /><br />下有一例，可供深刻理解：<br /><br />一般来说，对整个应用的配置，为了不使用“硬编码”，应该配置为ServletContext参数，比如字<br />符集设定。<br />&lt;web-app&gt;<br />.................<br />&lt;init-param&gt;<br />&lt;param-name&gt;charset&lt;/param-name&gt; <br />&lt;param-value&gt;GB2312&lt;/param-value&gt; <br />&lt;/init-param&gt;<br />.................<br />&lt;/web-app&gt;<br />注意以上格式只是2。0以后的标准格式，旧容器（引擎）采用服务商自己的格式配置。注意它的<br />父元素应该是&lt;web-app&gt;也就是说它是对一个应用作用的。<br /><br />而如果只有一个特定的servlet要设定的参数，其它servlet不能共享，应该配置为ServletConfig<br />参数，如一个读取附件的servlet要用到绝对目录，而别的servlet不会用到：<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;GetAtt&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;mail.GetAttServlet&lt;/servlet-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;absPath&lt;/param-name&gt; <br />&lt;param-value&gt;/usr/mail/ax/axman/Maildir/&lt;/param-value&gt; <br />&lt;/init-param&gt;<br />&lt;/servlet&gt;<br />不用说，因为在&lt;servlet&gt;标签中已经指定了name和class,也就是说只有mail.GetAttServlet这个\r<br />servlet中才能取到path,而别的Servlet是不能取到的。<br /><br />前面我们讲了对这连个属性的认识，下面让我们来共同学习一下，如何获取这两个对象的参数：<br /><br />访问ServletConfig参数：<br />首先要取得ServletConfig对象，然后调用它的getInitParameter();方法。要访问<br />ServletConfig对象，jsp中直接使用config内置对象，但因为你的JSP编译后的servlet一般不会被<br />加到web.xml中的，所以一般不会通过jsp来取对本JSP编译后的servlet的配置参数，那么在servlet<br />中要得到ServletConfig对象有两种方法：<br /><br />在inii()方法中取到：通过init的重载方法传递<br /><br />.....<br />public class Test extends HttpServlet <br />{<br />ServletConfig config;<br />public void init(ServletConfig config) throws ServletException {<br />this.config = config;<br />}<br />..................<br />}<br />然后在下面的方法中就可以访问config对象。但要注意，为了确保能从构造方法中到当前servlet的<br />config对象，应该调用父类的构造方法：<br />.....<br />public class Test extends HttpServlet <br />{<br />ServletConfig config;<br />public void init(ServletConfig config) throws ServletException {<br />super.init(config);<br />this.config = config;<br />}<br />..................<br />}<br /><br />通过getServletConfig()方法直接到时，这样做的好处是不必调手工传递属性，想在任何时候都可<br />以得到。<br /><br />还有第三种方法，要自己实现一些接口，这里作为一般讨论就不介绍了。<br />要访问ServletContext对象，只要从现有的ServletConfig对象getServletContext（）就可以了，然后\r调用它的getInitParameter()方法就可以获取它的参数。<br /><br />按说：ServletContext对象的作用域比ServletConfig作用域大，为什么要从ServletConfig中到得<br />ServletContext对象呢？我个人认为：容器保存了很多个ServletContext对象，请求时容器到底取哪一个\r给你呢？那就取其中包含ServletConfig信息的那个给你，就是说取ServletConfig对象的父级对象。就好象HttpSession要从requset中取得一样，就是取那个包含当前request对象的session对象给你，这只是我的个人想法，还没有来得及看具体实现。反正就这么用吧。 <br /><br /><img src ="http://www.blogjava.net/baoyaer/aggbug/107387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-03-30 08:55 <a href="http://www.blogjava.net/baoyaer/articles/107387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSTL的用法</title><link>http://www.blogjava.net/baoyaer/articles/100687.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 26 Feb 2007 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/100687.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/100687.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/100687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/100687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/100687.html</trackback:ping><description><![CDATA[<p>JSP 标准标记库（Standard Tag Library，JSTL)是一组以标准化格式实现许多通用的Web站点功能的定制标记。<span style="COLOR: red">&nbsp;JSTL的目标是为了简化JSP 页面的设计。&nbsp;</span></p>
<p><strong><span><span>一．</span></span><span>配置</span><span>JSTL</span></strong></p>
<p><span>包括两个</span><span>JAR</span><span>文件，</span><span>jstl.jar </span><span>和</span><span>standard.jar</span><span>。是什么没有必要管</span>&nbsp;</p>
<p><span>原文引入：</span></p>
<p><span></span></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">&lt;</span><span style="COLOR: #800000">%@&nbsp;taglib&nbsp;</span><span style="COLOR: #ff0000">prefix</span><span style="COLOR: #0000ff">="c"</span><span style="COLOR: #ff0000">&nbsp;uri</span><span style="COLOR: #0000ff">="http://java.sun.com/jsp/jstl/core"</span><span style="COLOR: #ff0000">&nbsp;%</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">%@&nbsp;taglib&nbsp;</span><span style="COLOR: #ff0000">prefix</span><span style="COLOR: #0000ff">="sql"</span><span style="COLOR: #ff0000">&nbsp;uri</span><span style="COLOR: #0000ff">="http://java.sun.com/jsp/jstl/sql"</span><span style="COLOR: #ff0000">&nbsp;%</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">%@&nbsp;taglib&nbsp;</span><span style="COLOR: #ff0000">prefix</span><span style="COLOR: #0000ff">="fmt"</span><span style="COLOR: #ff0000">&nbsp;uri</span><span style="COLOR: #0000ff">="http://java.sun.com/jsp/jstl/fmt"</span><span style="COLOR: #ff0000">&nbsp;%</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><span><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><strong><span><span>二．</span></span><span>Core</span><span>标签库</span></strong></p>
<p>&nbsp;</p>
<p><span>Core</span><span>标签库主要包括了一般用途的标签、条件标签、迭代标签和</span><span>URL</span><span>相关的标签。在</span><span>JSP</span><span>页面使用</span><span>Core</span><span>标签，要使用</span><span>taglig</span><span>指令，指定引用的标签库，如下：</span><span></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">&lt;</span><span style="COLOR: #800000">%@&nbsp;taglib&nbsp;</span><span style="COLOR: #ff0000">uri</span><span style="COLOR: #0000ff">=&#8221;http://java.sun.com/jsp/jstl/core&#8221;&nbsp;</span><span style="COLOR: #ff0000">prefix</span><span style="COLOR: #0000ff">=&#8221;c&#8221;&nbsp;</span><span style="COLOR: #ff0000">%</span><span style="COLOR: #0000ff">&gt;</span></div>
<p></span>&nbsp;</p>
<p><strong><span>一般用途的标签有</span></strong><strong><span>&lt;c:out&gt;</span></strong><strong><span>、</span></strong><strong><span>&lt;c:set&gt;</span></strong><strong><span>、</span></strong><strong><span>&lt;c:remove&gt;</span></strong><strong><span>、</span></strong><strong><span>&lt;c:cath&gt;</span></strong></p>
<p><strong><span>1.&lt;c:out&gt;</span></strong></p>
<p><span>用于计算一个表达式并将结果输出。类似于</span><span>JSP </span><span>中</span><span>&lt;%=%&gt;</span><span>表达式，或者是</span><span>EL</span><span>中</span><span>$ ${el-expression}</span><span>。</span></p>
<p><strong><span>2.&lt;c:set&gt;</span></strong></p>
<p><span>用于设置范围变量的值或者</span><span>javabean</span><span>对象的属性。</span></p>
<p><span>看个实际例子：</span><span></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">&lt;</span><span style="COLOR: #800000">c:set&nbsp;</span><span style="COLOR: #ff0000">var</span><span style="COLOR: #0000ff">=&#8221;username&#8221;&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">=&#8221;lisi&#8221;&nbsp;</span><span style="COLOR: #ff0000">scope</span><span style="COLOR: #0000ff">=&#8221;session&#8221;/&gt;</span></div>
<p></span><span>这样就相当于设置了</span><span>session</span><span>。</span></p>
<p>&nbsp;<strong><span>3.&lt;c:remove&gt;</span></strong></p>
<p><span>相对</span><span>&lt;c:set&gt;</span><span>其作用是移除范围变量。比如</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">&lt;</span><span style="COLOR: #800000">c:remove&nbsp;</span><span style="COLOR: #ff0000">var</span><span style="COLOR: #0000ff">=&#8221;nusername&#8221;&nbsp;</span><span style="COLOR: #ff0000">scope</span><span style="COLOR: #0000ff">=&#8221;session&#8221;/&gt;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p></span><strong><span>4.&lt;c:catch&gt;</span></strong></p>
<p><strong>&nbsp;</strong><span>用于捕获在其中嵌套的操作所抛出的异常对象，并将异常信息保存到变量中。</span></p>
<p><span>我们将有可能抛出异常的代码放置到开始标签</span><span>:&lt;c:catch&gt;</span><span>和结束标签</span><span>:&lt;/c:catch&gt;</span><span>之间。如果其中代码出现异常，异常对象将被捕获，保存在</span><span>var</span><span>声明的变量中，该变量总是有</span><span>page</span><span>范围。如果没有发生异常，而</span><span>var</span><span>所标识的范围变量将被移除。</span></p>
<p><span>如果没有指定</span><span>var</span><span>属性，异常只是简单的被捕获，异常信息并不会被保存。</span></p>
<p><span>Eg</span><span>：</span></p>
<p><span></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">&lt;</span><span style="COLOR: #800000">c:catch&nbsp;</span><span style="COLOR: #ff0000">var</span><span style="COLOR: #0000ff">=&#8221;exception&#8221;&gt;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #ff0000">&lt;%<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i&nbsp;</span><span style="COLOR: #0000ff">=&nbsp;5;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #ff0000">int&nbsp;j&nbsp;</span><span style="COLOR: #0000ff">=&nbsp;0;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #ff0000">int&nbsp;k</span><span style="COLOR: #0000ff">=i/j;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #ff0000">%</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">c:catch</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">c:out&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">=&#8221;${exception}&#8221;&nbsp;</span><span style="COLOR: #0000ff">/&gt;&lt;</span><span style="COLOR: #800000">br</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">c:out&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">=&#8221;${exception.massage}&#8221;/&gt;<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></div>
<p>后一句相当于：</span><span>exception.getMessage()</span></p>
<p>&nbsp;</p>
<p><strong><span>条件标签包括</span></strong><strong><span>&lt;c:if&gt;&lt;c:choose&gt;&lt;c:when&gt;&lt;c:otherwise&gt;</span></strong></p>
<p><strong><span>1.&lt;c:if&gt; <br></span></strong><span>用于实现</span><span>java</span><span>中的</span><span>if</span><span>语句功能。</span></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">&lt;</span><span style="COLOR: #800000">c:if&nbsp;</span><span style="COLOR: #ff0000">test</span><span style="COLOR: #0000ff">=&#8221;${user.visitCount==1}&#8221;&gt;<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #ff0000">This&nbsp;is&nbsp;your&nbsp;first&nbsp;visit&nbsp;.<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>&lt;/c:if</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><span>若为</span><span>true</span><span>，会打印中间部分。也可以声明</span><span>var</span><span>，方便下一步判断。</span></p>
<p><span>&nbsp;</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">&lt;</span><span style="COLOR: #800000">c:if&nbsp;</span><span style="COLOR: #ff0000">test</span><span style="COLOR: #0000ff">=&#8221;${param.name==&#8217;admin&#8217;}&#8221;&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">=&#8221;result&#8221;/&gt;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #ff0000">&lt;c:out&nbsp;value</span><span style="COLOR: #0000ff">=&#8221;${result}&#8221;&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p></span><strong><span>2.&lt;c:choose&gt;<br></span></strong><span>&lt;c:choose&gt;</span><span>和</span><span>&lt;c:when&gt;</span><span>、</span><span>&lt;c:otherwise&gt;</span><span>一起实现互斥条件执行，类似于</span><span>java</span><span>中的</span><span>if else.<br></span><span>&lt;c:choose&gt;</span><span>一般作为</span><span>&lt;c:when&gt;</span><span>、</span><span>&lt;c:otherwise&gt;</span><span>的父标签。</span></p>
<p><span>eg</span><span>：</span><span></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">&lt;</span><span style="COLOR: #800000">c:choose</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">c:when&nbsp;</span><span style="COLOR: #ff0000">test</span><span style="COLOR: #0000ff">="${row.v_money&lt;10000}"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;初学下海<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">c:when</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">c:when&nbsp;</span><span style="COLOR: #ff0000">test</span><span style="COLOR: #0000ff">="${row.v_money&gt;=10000&amp;&amp;row.v_money&lt;20000}"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;身手小试<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">c:when</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">c:otherwise</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;商业能手<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">c:otherwise</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">c:choose</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p></span>&nbsp;</p>
<p><strong><span>迭代标签</span></strong><strong><span> </span></strong><strong><span>迭代标签有</span></strong><strong><span>&lt;c:forEach&gt;</span></strong><strong><span>和</span></strong><strong><span>&lt;/c:forEach&gt;<br>/</span></strong><span>/</span><span>遍历记录集</span><span></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">&lt;</span><span style="COLOR: #800000">c:forEach&nbsp;</span><span style="COLOR: #ff0000">items</span><span style="COLOR: #0000ff">="${finalResult.rows}"</span><span style="COLOR: #ff0000">&nbsp;var</span><span style="COLOR: #0000ff">="row"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">tr&nbsp;</span><span style="COLOR: #ff0000">class</span><span style="COLOR: #0000ff">="&lt;%=tdClass[(rank+1)%2]%&gt;"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">td&nbsp;</span><span style="COLOR: #ff0000">align</span><span style="COLOR: #0000ff">="center"</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">span</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">%=rank</span><span style="COLOR: #ff0000">%</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">span</span><span style="COLOR: #0000ff">&gt;&lt;/</span><span style="COLOR: #800000">td</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">td&nbsp;</span><span style="COLOR: #ff0000">align</span><span style="COLOR: #0000ff">="center"</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">span&nbsp;</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">c:out&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="${row.player_name}"</span><span style="COLOR: #0000ff">/&gt;&lt;/</span><span style="COLOR: #800000">span</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">td</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">td&nbsp;</span><span style="COLOR: #ff0000">align</span><span style="COLOR: #0000ff">="center"</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">span&nbsp;</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">￥</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">c:out&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="${row.money}"</span><span style="COLOR: #0000ff">/&gt;&lt;/</span><span style="COLOR: #800000">span</span><span style="COLOR: #0000ff">&gt;&lt;/</span><span style="COLOR: #800000">td</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">tr</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">%rank</span><span style="COLOR: #ff0000">++;%</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">c:forEach</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p></span>&nbsp;</p>
<p><span>也可以设定固定次数。</span></p>
<p><span>&nbsp;</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">&lt;</span><span style="COLOR: #800000">c:forEach&nbsp;</span><span style="COLOR: #ff0000">var&nbsp;</span><span style="COLOR: #0000ff">=&#8221;i&#8221;&nbsp;</span><span style="COLOR: #ff0000">begin</span><span style="COLOR: #0000ff">=&#8221;100&nbsp;</span><span style="COLOR: #ff0000">&#8220;&nbsp;end</span><span style="COLOR: #0000ff">=&nbsp;&#8220;110&#8221;&gt;<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #ff0000">${i}<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>&lt;/c:forEach</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p></span>&nbsp;</p>
<p><span>如果再加个</span><span>step=</span><span>&#8220;</span><span>2</span><span>&#8221;那么每次增长为</span><span>2</span><span>。</span></p>
<p>&nbsp;</p>
<p><span><span>三．</span></span><span>sql</span><span>标签</span></p>
<p><strong>&nbsp;</strong></p>
<p><span>//设置数据源：</span><span></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">&lt;</span><span style="COLOR: #800000">sql:setDataSource&nbsp;</span><span style="COLOR: #ff0000">dataSource</span><span style="COLOR: #0000ff">="proxool.breadTycoon"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span></div>
<p></span><span>//</span><span>将数据库某查询的结果声明为一个变量</span><span><span></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">&lt;</span><span style="COLOR: #800000">sql:query&nbsp;</span><span style="COLOR: #ff0000">var</span><span style="COLOR: #0000ff">="finalResult"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;player_name,money&nbsp;from&nbsp;tb_player&nbsp;order&nbsp;by&nbsp;money&nbsp;DESC&nbsp;LIMIT&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">sql:query</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>然后可以：</span><span></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">&lt;</span><span style="COLOR: #800000">c:forEach&nbsp;</span><span style="COLOR: #ff0000">items</span><span style="COLOR: #0000ff">="${&nbsp;finalResult.rows}"</span><span style="COLOR: #ff0000">&nbsp;var</span><span style="COLOR: #0000ff">="row"</span><span style="COLOR: #ff0000">&nbsp;varStatus</span><span style="COLOR: #0000ff">="s"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;advCosts[${s.index}]=${row.adv_cost};<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>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">c:forEach</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p></span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>数据更新标签：</span><span></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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">sql:update</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;proc_set_role_salespro(?,?,?,?,?);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">sql:param&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="30"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">sql:param&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="39"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">sql:param&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="&lt;%=spID%&gt;"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">sql:param&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="&lt;%=productID%&gt;"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">sql:param&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="1"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">sql:update</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p></span>&nbsp;</p>
<p><span><span>四．</span></span><span>格式化标签</span><span></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">&lt;</span><span style="COLOR: #800000">fmt:&nbsp;</span><span style="COLOR: #ff0000">formatNumber&nbsp;value&nbsp;</span><span style="COLOR: #0000ff">=&#8221;12.3&#8221;&nbsp;</span><span style="COLOR: #ff0000">pattern</span><span style="COLOR: #0000ff">=&#8221;.000&#8221;/&gt;</span></div>
<p></span><span>将输出</span><span>12.300.</span><span>应用样式</span><span>&#8221;<st1:chmetcnv TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="0" UnitName="&#8221;" w:st="on">.000&#8221;</st1:chmetcnv>,</span><span>将使格式化后的小数部分有</span><span>3</span><span>位。不足</span><span>3</span><span>位将以</span><span>0</span><span>补齐</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: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">fmt:formatDate&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">=&#8221;&lt;%=new&nbsp;</span><span style="COLOR: #ff0000">java.util.Date()&nbsp;%</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&#8221;&nbsp;type=&#8221;date&#8221;&nbsp;/&gt;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p></span><span><span>&nbsp;</span></span><span>格式化的结果是：</span><st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="27" Month="5" Year="2007"><span>2007-5-27</span></st1:chsdate><span>.</span><span></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">&lt;</span><span style="COLOR: #800000">fmt:formatDate&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">=&#8221;&lt;%=new&nbsp;</span><span style="COLOR: #ff0000">java.util.Date()&nbsp;%</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&#8221;&nbsp;type=&#8221;time&#8221;&nbsp;/&gt;</span></div>
<p></span><span>格式化的结果是：</span><span>9:25:11</span></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">&lt;</span><span style="COLOR: #800000">fmt:formatDate&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">=&#8221;&lt;%=new&nbsp;</span><span style="COLOR: #ff0000">java.util.Date()&nbsp;%</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&#8221;&nbsp;type=&#8221;both&#8221;&nbsp;/&gt;</span></div>
<p>&#160;</p>
<p><span>格式化的结果是：</span><span> <st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="27" Month="5" Year="2007">2007-5-27</st1:chsdate> 9:25:11</span></p>
<p><br>fn函数<br>JSTL1.1标签库还包含了许多其它经常使用的函数：</p>
<p>fn:contains(string, substring)<br>&nbsp;如果参数string中包含参数substring，返回true<br>&nbsp;<br>fn:containsIgnoreCase(string, substring)<br>&nbsp;如果参数string中包含参数substring（忽略大小写），返回true<br>&nbsp;<br>fn:endsWith(string, suffix)<br>&nbsp;如果参数 string 以参数suffix结尾，返回true<br>&nbsp;<br>fn:escapeXml(string)<br>&nbsp;将有特殊意义的XML (和HTML)转换为对应的XML character entity code，并返回<br>&nbsp;<br>fn:indexOf(string, substring)<br>&nbsp;返回参数substring在参数string中第一次出现的位置<br>&nbsp;<br>fn:join(array, separator)<br>&nbsp;将一个给定的数组array用给定的间隔符separator串在一起，组成一个新的字符串并返回。<br>&nbsp;<br>fn:length(item)<br>&nbsp;返回参数item中包含元素的数量。参数Item类型是数组、collection或者String。如果是String类型,返回值是String中的字符数。<br>&nbsp;<br>fn:replace(string, before, after)<br>&nbsp;返回一个String对象。用参数after字符串替换参数string中所有出现参数before字符串的地方，并返回替换后的结果<br>&nbsp;<br>fn:split(string, separator)<br>&nbsp;返回一个数组，以参数separator 为分割符分割参数string，分割后的每一部分就是数组的一个元素<br>&nbsp;<br>fn:startsWith(string, prefix)<br>&nbsp;如果参数string以参数prefix开头，返回true<br>&nbsp;<br>fn:substring(string, begin, end)<br>&nbsp;返回参数string部分字符串, 从参数begin开始到参数end位置，包括end位置的字符<br>&nbsp;<br>fn:substringAfter(string, substring)<br>&nbsp;返回参数substring在参数string中后面的那一部分字符串<br>&nbsp;<br>fn:substringBefore(string, substring)<br>&nbsp;返回参数substring在参数string中前面的那一部分字符串<br>&nbsp;<br>fn:toLowerCase(string)<br>&nbsp;将参数string所有的字符变为小写，并将其返回<br>&nbsp;<br>fn:toUpperCase(string)<br>&nbsp;将参数string所有的字符变为大写，并将其返回<br>&nbsp;<br>fn:trim(string)<br>&nbsp;去除参数string 首尾的空格，并将其返回</p>
<p>&nbsp;主要是替换<br>&lt;sql:setDataSource var="dataSrc"<br>&nbsp;&nbsp;&nbsp; url="jdbc:jtds:sqlserver://localhost/LOG_DB" driver="net.sourceforge.jtds.jdbc.Driver"<br>&nbsp;&nbsp;&nbsp; user="sa" password="admin"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;%-- Set number of rows to process --%&gt;<br>&nbsp;&nbsp;&nbsp; &lt;c:set var="noOfRows" value="100" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;c:set var="msg" value="select top 100 * from L_ips_tb where id&gt; (select max (id) from <br>(select top ard id from L_ips_tb order by id) as T<br>)&nbsp;&nbsp;&nbsp;&nbsp; order by id"/&gt;<br>&nbsp;&lt;c:set var="test" value="${fn:replace(msg,'ard',100)}" /&gt; </p>
<p>&nbsp;&lt;c:out value="${test}" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;sql:query var="empList"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql="${test}"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataSource="${dataSrc}"<br>&nbsp;&nbsp;&nbsp; /&gt;<br>&nbsp;&nbsp; &lt;c:out value="${fn:length(empList.rows)}"/&gt; <br>使用反射<br>&lt;c:setvar="arrayvalue"value="ID,SrcIP"/&gt;<br>&lt;c:setvar="delim"value=","/&gt;<br>&lt;c:setvar="array"value="${fn:split(arrayvalue,delim)}"/&gt;<br>&lt;c:setvar="count"value="${fn:length(array)}"/&gt;</p>
<p><br>array是一个String数组，loghistory是一个Map</p>
<p>&lt;c:forEachvar="loghistory"items="${loghistory}"varStatus="statusindex"&gt;</p>
<p>&lt;c:forEachbegin="0"end="${count-1}""varStatus="index"&gt;<br>&lt;c:outvalue="${loghistory[array[index.index]]}"/&gt;<br>&lt;/c:forEach&gt;<br>&lt;c:choose&gt;<br><br>使用二维数组<br>&lt;c:forEach items="${applicationScope[param.answersMapName]}"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var="a"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${a.key}) ${a.value}: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${applicationScope[param.votesMapName][a.key]}&lt;br&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/c:forEach〉</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/100687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-02-26 10:27 <a href="http://www.blogjava.net/baoyaer/articles/100687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>beanutils.Converter使用探索</title><link>http://www.blogjava.net/baoyaer/articles/99016.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 09 Feb 2007 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/99016.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/99016.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/99016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/99016.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/99016.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span lang=EN-US><font size=3><font face="Times New Roman">org.apache.commons.beanutils.ConvertUtils
<p></font></font></span></strong>这是一个接口，其中只包含一个方法 <a href="file:///F:/software/apache/commons/commons-beanutils-1.7.0/docs/api/org/apache/commons/beanutils/Converter.html#convert(java.lang.Class, java.lang.Object)">convert </a>(java.lang.Class&nbsp;type, java.lang.Object&nbsp;value) ，<span style="COLOR: red">其功能是将输入参数 value 转换为指定类型 type 的实例。 </span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=3>范例：</font> </span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我建立了一个</span> <span lang=EN-US><font face="Times New Roman">Rectangle</font> </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，并为这</span> <span lang=EN-US><font face="Times New Roman">rectangle</font> </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象建立了一个</span> <span lang=EN-US><font face="Times New Roman">RectangleConverter</font> </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，随后将</span> <span lang=EN-US><font face="Times New Roman">RectangleConverter</font> </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注册进</span> <span lang=EN-US><font face="Times New Roman">ConvertUtils</font> </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中。形为</span> <span lang=EN-US><font face="Times New Roman">{3,2}</font> </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的字符串可以转变为一个</span> <span lang=EN-US><font face="Times New Roman">rectangle</font> </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里唯一要说明的就是</span> <span lang=EN-US><font face="Times New Roman">RectangleConverter</font> </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中要实现两个</span> <span lang=EN-US><font face="Times New Roman">converter</font> </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，也就是要对接口</span> <span lang=EN-US><font face="Times New Roman">Converter</font> </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中定义的方法进行</span> <span lang=EN-US><font face="Times New Roman">overload</font> </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，从而可以实现字符串和</span> <span lang=EN-US><font face="Times New Roman">Rectangle</font> </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之间的互相转换了。<br><br><span lang=EN-US><font size=3><font face="Times New Roman"><span class=Code>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman">package beanutil; <br></font></font></span><span lang=EN-US><font size=3><font face="Times New Roman">import java.util.StringTokenizer; <br></font></font></span><span lang=EN-US><font size=3><font face="Times New Roman">import org.apache.commons.beanutils.ConvertUtils; <br></font></font></span><span lang=EN-US><font size=3><font face="Times New Roman">import org.apache.commons.beanutils.Converter; </p>
</font></font></span>
<p><span lang=EN-US><font size=3><font face="Times New Roman">public class RectangleConverter implements Converter { </p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>public Object convert(Class arg0, Object arg1) {&nbsp;<br></font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (arg1 instanceof String)&nbsp;<br>&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span>return convert(arg0, arg1.toString());&nbsp;<br></font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return convert(arg0, (Rectangle) arg1);
<p></font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp; </span>} </p>
<p></font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>public Rectangle convert(Class rectangleType, String para) {&nbsp;<br>&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>StringTokenizer token = new StringTokenizer(para, ",");&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;</span>Double temp1, temp2 = null;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp; </span>temp1 = (Double) ConvertUtils.convert(token.nextToken(), Double.class);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;</span>temp2 = (Double) ConvertUtils.convert(token.nextToken(), Double.class);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp; </span>Rectangle rect = new Rectangle(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman">rect.setLength(Math.max(temp1.doubleValue(), temp2.doubleValue()));&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;</span>rect.setWidth(Math.min(temp1.doubleValue(), temp2.doubleValue()));&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;</span>return rect; </font></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}
<p>&#160;</p>
</font></font></span>
<p><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;</span>public String convert(Class string, Rectangle rect) { </p>
<p></font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; </span>StringBuffer buffer = new StringBuffer("(");&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;</span>buffer.append(rect.getLength()).append(",");&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;</span>buffer.append(rect.getWidth());&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp; </span>return buffer.toString(); </font></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman"><font size=3><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} </p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman" size=3>}</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>
<p></span></span></font></font></span><span lang=EN-US><font face="Times New Roman" size=3></font>&nbsp;</p>
</span>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将</span><span lang=EN-US><font face="Times New Roman">RectangleConverter</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注册到</span><span lang=EN-US><font face="Times New Roman">ConvertUtils</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，我们就可以把形为</span><span lang=EN-US><font face="Times New Roman">{4,5}</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的字符串转换为</span><span lang=EN-US><font face="Times New Roman">Rectangle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实例，同样可以将</span><span lang=EN-US><font face="Times New Roman">Rectangle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实例转换为形为</span><span lang=EN-US><font face="Times New Roman">{4,5}</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的字符串。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US></span><font face="Times New Roman" size=3></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另附</span><span lang=EN-US><font face="Times New Roman">Rectangle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的代码：</span></font><span lang=EN-US><font size=3><font face="Times New Roman"><span class=Code></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman">package beanutil; </font></font></span>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman">public class Rectangle { </p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>double length = 0.0d;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp; </span>double width = 0.0d;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;</span>public double getLength() {&nbsp;<br>&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return length; </font></font></span>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}
<p>&#160;</p>
</font></font></span>
<p><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span>public void setLength(double length) {&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp; </span>this.length = length; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman">} </p>
<p></font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>public double getWidth() { </p>
<p></font></font></span><span lang=EN-US><font size=3><font face="Times New Roman">&nbsp;&nbsp;&nbsp; return width; </p>
<p></font></font></span><span lang=EN-US><font size=3><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p></font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; &nbsp;</span>public void setWidth(double width) { </p>
<p></font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span>this.width = width;&nbsp;<br>&nbsp;&nbsp; </font></font></span><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;</span>} </p>
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public double computeArea(){
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return length*width;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public String toString(){
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>StringBuffer buffer = new StringBuffer("(");
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>buffer.append(getLength()).append(",");
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>buffer.append(getWidth()).append(")");
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return buffer.toString();
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font size=3><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman" size=3>}</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></span></font></font></span><span lang=EN-US><font face="Times New Roman" size=3>}</font></span><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>1）创建如下类：<br>package com.forever.util;<br><br>import java.util.*;<br>import org.apache.commons.beanutils.*;<br>import java.text.SimpleDateFormat;<br><br>public class DateConvert implements Converter {<br>static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// HH:mm:ss<br><br>public DateConvert() { <br>} <br><br>public Object convert(Class type, Object value) { <br>if(value==null)return null; <br>if(((String)value).trim().length()==0)<br>return null; <br>if(value instanceof String) { <br>try { <br>//解析接收到字符串 <br>return df.parse((String)value); <br>} catch (Exception ex) {<br>//发生解析异常<br>throw new ConversionException("输入的日期类型不合乎yyyy-MM-dd HH:mm:ss" + value.getClass()); <br>} <br>} else { <br>//其他异常 <br>throw new ConversionException("输入的不是字符类型" + value.getClass()); <br>} <br>}<br>}<br><br>2）然后在你的系统某处使用如下（如web的init方法）<br>ConvertUtils.register(new DateConvert(),java.util.Date.class);<br>参数用于表示DateConvert类负责处理java.util.Date类型的转化。如：<br>package com.forever.util;<br><br>import org.apache.struts.action.ActionServlet;<br>import javax.servlet.ServletException;<br>import org.apache.commons.beanutils.ConvertUtils;<br><br>public class ActiveServlet extends ActionServlet {<br><br>/**<br>* 重载init()方法<br>* 为struts解析重新注册一些改造过的表单元素数据解析方法<br>*/<br>public void init() throws ServletException {<br>super.init();<br>ConvertUtils.register(new DateConvert(), java.util.Date.class);<br>}<br>}<br>3）在web.xml文件中加入或修改成如下内容：<br><br>&lt; servlet &gt;<br>&lt; servlet-name &gt;action&lt; /servlet-name &gt;<br>&lt; servlet-class &gt;com.forever.util.ActiveServlet&lt; /servlet-class &gt; <br>&lt; init-param &gt;<br>&lt; param-name &gt;config&lt; /param-name &gt;<br>&lt; param-value &gt;/WEB-INF/struts-config.xml&lt; /param-value &gt;<br>&lt; /init-param &gt;<br>...........<br>&lt; /servlet &gt;<br><br>当用到BeanUtils.getProperty()时，碰到Date这种类型就发生转换<br></span></font></p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/99016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-02-09 15:02 <a href="http://www.blogjava.net/baoyaer/articles/99016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts处理表单中值为空的日期类型字段 </title><link>http://www.blogjava.net/baoyaer/articles/98937.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 09 Feb 2007 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/98937.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/98937.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/98937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/98937.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/98937.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>在示范中心项目中，我们把ActionForm中日期类型的字段指定为String类型，而在对应的JavaBean中指定为java.sql.Date类型。当用户提交表单的时候，在Action里使用BeanUtils.copyProperties()方法从ActionForm构造JavaBean对象（详见<a href="http://www.cnblogs.com/bjzhanghao/archive/2004/07/30/28607.aspx"><font color="#000080">利用BeanUtils在对象间复制属性</font></a>）。这个方法在大部分时候都很好，但有一个问题，就是当用户没有填写日期类型字段时（而该字段并非必填），validator不会提出警告，而在copyProperties()时会报类型转换异常，原因是这时ActionForm中的该字段的值是空字符串（""），负责字符串向Date转换的SqlDateConverter类调用Date.valueOf("")方法，显然""是无法转换为日期的，所以会抛出异常。</p>
				<p>通过查看代码和资料，我发现这个问题的解决方法其实非常简单。只要把带缺省值参数的SqlDateConverter重新注册一下，覆盖原有的注册信息就可以了，这个注册语句一般是写在系统初试化的地方，对于Struts应用程序，当然做在PlugIn里最方便。代码如下：</p>
				<p>
				</p>
				<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
						<div>
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
								<span style="COLOR: #000000">package etc;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />import javax.servlet.ServletException;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />import org.apache.commons.beanutils.ConvertUtils;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />import org.apache.commons.beanutils.converters.SqlDateConverter;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />import org.apache.struts.action.ActionServlet;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />import org.apache.struts.action.PlugIn;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />import org.apache.struts.config.ModuleConfig;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />public class ConverterPlugIn implements PlugIn{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    public </span>
								<span style="COLOR: #0000ff">void</span>
								<span style="COLOR: #000000"> init(ActionServlet servlet, ModuleConfig config) throws ServletException {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        ConvertUtils.register(</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> SqlDateConverter(</span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">),java.sql.Date.class);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    public </span>
								<span style="COLOR: #0000ff">void</span>
								<span style="COLOR: #000000"> destroy() {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        ConvertUtils.deregister();<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						</div>
				</div>
				<p>注意SqlDateConverter的构造方法是带有参数null的，这表示遇到不能解析的字符串就返回空值。而deregister()方法的作用是恢复ConvertUtils的缺省注册表。为了使这个PlugIn起作用，要在struts-config.xml里增加一句话：</p>
				<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
						<div>
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000">plug</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #0000ff">in</span>
								<span style="COLOR: #000000"> className</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">etc.ConverterPlugIn</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">/&gt;</span>
						</div>
				</div>
				<p>日期字段往往会给我们的开发带来麻烦，其实在Struts应用程序里，只要把这些转换类搞熟了，总可以找到很方便的办法。常见的问题还有如何指定日期输入格式，怎样处理java.util.Date的转换，等等，在<a href="http://www.javaresearch.org/article/showarticle.jsp?column=23&amp;thread=10956"><font color="#000080">这个链接</font></a>里有解决这些问题的方法，道理都是一样的。</p>
		</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/98937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-02-09 10:41 <a href="http://www.blogjava.net/baoyaer/articles/98937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java获取url路径的方法</title><link>http://www.blogjava.net/baoyaer/articles/98163.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 06 Feb 2007 01:06:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/98163.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/98163.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/98163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/98163.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/98163.html</trackback:ping><description><![CDATA[
		<div>在写java程序时不可避免要获取文件的路径...总结一下,遗漏的随时补上</div>
		<div> </div>
		<div>1.可以在servlet的init方法里</div>
		<div>String path = getServletContext().getRealPath("/");</div>
		<div>这将获取web项目的全路径</div>
		<div>例如 :E:\eclipseM9\workspace\tree\</div>
		<div>tree是我web项目的根目录</div>
		<div> </div>
		<div>2.你也可以随时在任意的class里调用</div>
		<div>this.getClass().getClassLoader().getResource("/").getPath();</div>
		<div>这将获取 到classes目录的全路径</div>
		<div>例如 : E:\eclipseM9/workspace/tree/WEB-INF/classes/</div>
		<div> </div>
		<div>这个方法也可以不在web环境里确定路径,比较好用</div>
		<div> </div>
		<div>3.request.getContextPath();</div>
		<div>获得web根的上下文环境</div>
		<div>如 /tree</div>
		<div>tree是我的web项目的root context</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/98163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-02-06 09:06 <a href="http://www.blogjava.net/baoyaer/articles/98163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpClient入门[zt]</title><link>http://www.blogjava.net/baoyaer/articles/95854.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 25 Jan 2007 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/95854.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/95854.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/95854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/95854.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/95854.html</trackback:ping><description><![CDATA[
		<div class="tit"> </div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<div style="CLEAR: right">
														<blockquote>
																<p>作者：金发华 陈樟洪  文章来源：IBM developerWorks</p>
																<p>HttpClient 是 Apache Jakarta Common 下的子项目，可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包，并且它支持 HTTP 协议最新的版本和建议。本文首先介绍 HTTPClient，然后根据作者实际工作经验给出了一些常见问题的解决方法。</p>
														</blockquote>
														<p>
																<a name="IDADCG0">
																		<span class="atitle">
																				<font face="Arial" color="#000000" size="4">HttpClient简介</font>
																		</span>
																</a>
														</p>
														<p>HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了，越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能，但是对于大部分应用程序来说，JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目，用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包，并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中，比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient，更多使用 HttpClient 的应用可以参见<a href="http://wiki.apache.org/jakarta-httpclient/HttpClientPowered"><font color="#5c81a7">http://wiki.apache.org/jakarta-httpclient/HttpClientPowered</font></a>。HttpClient 项目非常活跃，使用的人还是非常多的。目前 HttpClient 版本是在 2005.10.11 发布的 3.0 RC4 。</p>
														<br />
														<table cellspacing="0" cellpadding="0" width="100%" border="0">
																<tbody>
																		<tr>
																				<td>
																						<img height="1" src="http://www.crackj2ee.com/Article/UploadFiles/200511/20051125151629941.gif" width="100%" />
																				</td>
																		</tr>
																</tbody>
														</table>
														<table class="no-print" cellspacing="0" cellpadding="0" align="right">
																<tbody>
																		<tr align="right">
																				<td>
																						<table cellspacing="0" cellpadding="0" border="0">
																								<tbody>
																										<tr>
																												<td valign="center">
																														<br />
																												</td>
																												<td valign="top" align="right">
																														<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/#main">
																																<strong>
																																		<font color="#996699">
																																		</font>
																																</strong>
																														</a>
																												</td>
																										</tr>
																								</tbody>
																						</table>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
														<br />
														<p>
																<a name="IDAOCG0">
																		<span class="atitle">
																				<font face="Arial" color="#000000" size="4">HttpClient 功能介绍</font>
																		</span>
																</a>
														</p>
														<p>以下列出的是 HttpClient 提供的主要的功能，要知道更多详细的功能可以参见 HttpClient 的主页。</p>
														<ul>
																<li>实现了所有 HTTP 的方法（GET,POST,PUT,HEAD 等） 
</li>
																<li>支持自动转向 
</li>
																<li>支持 HTTPS 协议 
</li>
																<li>支持代理服务器等 </li>
														</ul>
														<p>下面将逐一介绍怎样使用这些功能。首先，我们必须安装好 HttpClient。</p>
														<ul>
																<li>HttpClient 可以在<a href="http://jakarta.apache.org/commons/httpclient/downloads.html"><font color="#5c81a7">http://jakarta.apache.org/commons/httpclient/downloads.html</font></a>下载 
</li>
																<li>HttpClient 用到了 Apache Jakarta common 下的子项目 logging，你可以从这个地址<a href="http://jakarta.apache.org/site/downloads/downloads_commons-logging.cgi"><font color="#5c81a7">http://jakarta.apache.org/site/downloads/downloads_commons-logging.cgi</font></a>下载到 common logging，从下载后的压缩包中取出 commons-logging.jar 加到 CLASSPATH 中 
</li>
																<li>HttpClient 用到了 Apache Jakarta common 下的子项目 codec，你可以从这个地址<a href="http://jakarta.apache.org/site/downloads/downloads_commons-codec"><font color="#5c81a7">http://jakarta.apache.org/site/downloads/downloads_commons-codec</font></a>.cgi 下载到最新的 common codec，从下载后的压缩包中取出 commons-codec-1.x.jar 加到 CLASSPATH 中 </li>
														</ul>
														<br />
														<table cellspacing="0" cellpadding="0" width="100%" border="0">
																<tbody>
																		<tr>
																				<td>
																						<img height="1" src="http://www.crackj2ee.com/Article/UploadFiles/200511/20051125151629941.gif" width="100%" />
																				</td>
																		</tr>
																</tbody>
														</table>
														<table class="no-print" cellspacing="0" cellpadding="0" align="right">
																<tbody>
																		<tr align="right">
																				<td>
																						<table cellspacing="0" cellpadding="0" border="0">
																								<tbody>
																										<tr>
																												<td valign="center">
																														<br />
																												</td>
																												<td valign="top" align="right">
																														<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/#main">
																																<strong>
																																		<font color="#996699">
																																		</font>
																																</strong>
																														</a>
																												</td>
																										</tr>
																								</tbody>
																						</table>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
														<br />
														<p>
																<a name="IDANDG0">
																		<span class="atitle">
																				<font face="Arial" color="#000000" size="4">HttpClient 基本功能的使用</font>
																		</span>
																</a>
														</p>
														<p>
																<a name="IDASDG0">
																		<span class="smalltitle">
																				<strong>
																						<font face="Arial" color="#000000" size="3">GET 方法</font>
																				</strong>
																		</span>
																</a>
														</p>
														<p>使用 HttpClient 需要以下 6 个步骤：</p>
														<p>1. 创建 HttpClient 的实例</p>
														<p>2. 创建某种连接方法的实例，在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址</p>
														<p>3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例</p>
														<p>4. 读 response</p>
														<p>5. 释放连接。无论执行方法是否成功，都必须释放连接</p>
														<p>6. 对得到后的内容进行处理</p>
														<p>根据以上步骤，我们来编写用GET方法来取得某网页内容的代码。</p>
														<ul>
																<li>大部分情况下 HttpClient 默认的构造函数已经足够使用。 
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">HttpClient httpClient = new HttpClient();
</font></code></pre></td></tr></tbody></table><br /></li>
																<li>创建GET方法的实例。在GET方法的构造函数中传入待连接的地址即可。用GetMethod将会自动处理转发过程，如果想要把自动处理转发过程去掉的话，可以调用方法setFollowRedirects(false)。 
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">GetMethod getMethod = new GetMethod("http://www.ibm.com/");
</font></code></pre></td></tr></tbody></table><br /></li>
																<li>调用实例httpClient的executeMethod方法来执行getMethod。由于是执行在网络上的程序，在运行executeMethod方法的时候，需要处理两个异常，分别是HttpException和IOException。引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对，比如不小心将"http"写成"htp"，或者服务器端返回的内容不正常等，并且该异常发生是不可恢复的；第二种异常一般是由于网络原因引起的异常，对于这种异常 （IOException），HttpClient会根据你指定的恢复策略自动试着重新执行executeMethod方法。HttpClient的恢复策略可以自定义（通过实现接口HttpMethodRetryHandler来实现）。通过httpClient的方法setParameter设置你实现的恢复策略，本文中使用的是系统提供的默认恢复策略，该策略在碰到第二类异常的时候将自动重试3次。executeMethod返回值是一个整数，表示了执行该方法后服务器返回的状态码，该状态码能表示出该方法执行是否成功、需要认证或者页面发生了跳转（默认状态下GetMethod的实例是自动处理跳转的）等。 
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">//设置成了默认的恢复策略，在发生异常时候将自动重试3次，在这里你也可以设置成自定义的恢复策略
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
      new DefaultHttpMethodRetryHandler()); 
//执行getMethod
int statusCode = client.executeMethod(getMethod);
if (statusCode != HttpStatus.SC_OK) {
  System.err.println("Method failed: " + getMethod.getStatusLine());
}
</font></code></pre></td></tr></tbody></table><br /></li>
																<li>在返回的状态码正确后，即可取得内容。取得目标地址的内容有三种方法：第一种，getResponseBody，该方法返回的是目标的二进制的byte流；第二种，getResponseBodyAsString，这个方法返回的是String类型，值得注意的是该方法返回的String的编码是根据系统默认的编码方式，所以返回的String值可能编码类型有误，在本文的"字符编码"部分中将对此做详细介绍；第三种，getResponseBodyAsStream，这个方法对于目标地址中有大量数据需要传输是最佳的。在这里我们使用了最简单的getResponseBody方法。 
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">byte[] responseBody = method.getResponseBody();
</font></code></pre></td></tr></tbody></table><br /></li>
																<li>释放连接。无论执行方法是否成功，都必须释放连接。 
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">method.releaseConnection();
</font></code></pre></td></tr></tbody></table><br /></li>
																<li>处理内容。在这一步中根据你的需要处理内容，在例子中只是简单的将内容打印到控制台。 
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">System.out.println(new String(responseBody));
</font></code></pre></td></tr></tbody></table><br /></li>
														</ul>
														<p>下面是程序的完整代码，这些代码也可在附件中的test.GetSample中找到。</p>
														<br />
														<a name="IDA5EG0">
																<strong>
																</strong>
														</a>
														<br />
														<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
																<tbody>
																		<tr>
																				<td>
																						<pre>
																								<code class="section">
																										<font face="Lucida Console">package test;
import java.io.IOException;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;

public class GetSample{
  public static void main(String[] args) {
  //构造HttpClient的实例
  HttpClient httpClient = new HttpClient();
  //创建GET方法的实例
  GetMethod getMethod = new GetMethod("http://www.ibm.com");
  //使用系统提供的默认的恢复策略
  getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
    new DefaultHttpMethodRetryHandler());
  try {
   //执行getMethod
   int statusCode = httpClient.executeMethod(getMethod);
   if (statusCode != HttpStatus.SC_OK) {
    System.err.println("Method failed: "
      + getMethod.getStatusLine());
   }
   //读取内容 
   byte[] responseBody = getMethod.getResponseBody();
   //处理内容
   System.out.println(new String(responseBody));
  } catch (HttpException e) {
   //发生致命的异常，可能是协议不对或者返回的内容有问题
   System.out.println("Please check your provided http address!");
   e.printStackTrace();
  } catch (IOException e) {
   //发生网络异常
   e.printStackTrace();
  } finally {
   //释放连接
   getMethod.releaseConnection();
  }
 }
}
</font>
																								</code>
																						</pre>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
														<p>
																<a name="IDAGFG0">
																		<span class="smalltitle">
																				<strong>
																						<font face="Arial" color="#000000" size="3">POST方法</font>
																				</strong>
																		</span>
																</a>
														</p>
														<p>根据RFC2616，对POST的解释如下：POST方法用来向目的服务器发出请求，要求它接受被附在请求后的实体，并把它当作请求队列（Request-Line）中请求URI所指定资源的附加新子项。POST被设计成用统一的方法实现下列功能：</p>
														<ul>
																<li>对现有资源的注释（Annotation of existing resources） 
</li>
																<li>向电子公告栏、新闻组，邮件列表或类似讨论组发送消息 
</li>
																<li>提交数据块，如将表单的结果提交给数据处理过程 
</li>
																<li>通过附加操作来扩展数据库 </li>
														</ul>
														<p>调用HttpClient中的PostMethod与GetMethod类似，除了设置PostMethod的实例与GetMethod有些不同之外，剩下的步骤都差不多。在下面的例子中，省去了与GetMethod相同的步骤，只说明与上面不同的地方，并以登录清华大学BBS为例子进行说明。</p>
														<ul>
																<li>构造PostMethod之前的步骤都相同，与GetMethod一样，构造PostMethod也需要一个URI参数，在本例中，登录的地址是http://www.newsmth.net/bbslogin2.php。在创建了PostMethod的实例之后，需要给method实例填充表单的值，在BBS的登录表单中需要有两个域，第一个是用户名（域名叫id），第二个是密码（域名叫passwd）。表单中的域用类NameValuePair来表示，该类的构造函数第一个参数是域名，第二参数是该域的值；将表单所有的值设置到PostMethod中用方法setRequestBody。另外由于BBS登录成功后会转向另外一个页面，但是HttpClient对于要求接受后继服务的请求，比如POST和PUT，不支持自动转发，因此需要自己对页面转向做处理。具体的页面转向处理请参见下面的"自动转向"部分。代码如下： 
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">String url = "http://www.newsmth.net/bbslogin2.php";
PostMethod postMethod = new PostMethod(url);
// 填入各个表单域的值
NameValuePair[] data = { new NameValuePair("id", "youUserName"),    
new NameValuePair("passwd", "yourPwd") };
// 将表单的值放入postMethod中
postMethod.setRequestBody(data);
// 执行postMethod
int statusCode = httpClient.executeMethod(postMethod);
// HttpClient对于要求接受后继服务的请求，象POST和PUT等不能自动处理转发
// 301或者302
if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY || 
statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
    // 从头中取出转向的地址
    Header locationHeader = postMethod.getResponseHeader("location");
    String location = null;
    if (locationHeader != null) {
     location = locationHeader.getValue();
     System.out.println("The page was redirected to:" + location);
    } else {
     System.err.println("Location field value is null.");
    }
    return;
}
</font></code></pre></td></tr></tbody></table><br /></li>
														</ul>
														<p>完整的程序代码请参见附件中的test.PostSample</p>
														<br />
														<table cellspacing="0" cellpadding="0" width="100%" border="0">
																<tbody>
																		<tr>
																				<td>
																						<img height="1" src="http://www.crackj2ee.com/Article/UploadFiles/200511/20051125151629941.gif" width="100%" />
																				</td>
																		</tr>
																</tbody>
														</table>
														<table class="no-print" cellspacing="0" cellpadding="0" align="right">
																<tbody>
																		<tr align="right">
																				<td>
																						<table cellspacing="0" cellpadding="0" border="0">
																								<tbody>
																										<tr>
																												<td valign="center">
																														<br />
																												</td>
																												<td valign="top" align="right">
																														<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/#main">
																																<strong>
																																		<font color="#996699">
																																		</font>
																																</strong>
																														</a>
																												</td>
																										</tr>
																								</tbody>
																						</table>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
														<br />
														<p>
																<a name="IDAZFG0">
																		<span class="atitle">
																				<font face="Arial" color="#000000" size="4">使用HttpClient过程中常见的一些问题</font>
																		</span>
																</a>
														</p>
														<p>下面介绍在使用HttpClient过程中常见的一些问题。</p>
														<p>
																<a name="IDA5FG0">
																		<span class="smalltitle">
																				<strong>
																						<font face="Arial" color="#000000" size="3">字符编码</font>
																				</strong>
																		</span>
																</a>
														</p>
														<p>某目标页的编码可能出现在两个地方，第一个地方是服务器返回的http头中，另外一个地方是得到的html/xml页面中。</p>
														<ul>
																<li>在http头的Content-Type字段可能会包含字符编码信息。例如可能返回的头会包含这样子的信息：Content-Type: text/html; charset=UTF-8。这个头信息表明该页的编码是UTF-8，但是服务器返回的头信息未必与内容能匹配上。比如对于一些双字节语言国家，可能服务器返回的编码类型是UTF-8，但真正的内容却不是UTF-8编码的，因此需要在另外的地方去得到页面的编码信息；但是如果服务器返回的编码不是UTF-8，而是具体的一些编码，比如gb2312等，那服务器返回的可能是正确的编码信息。通过method对象的getResponseCharSet()方法就可以得到http头中的编码信息。 
</li>
																<li>对于象xml或者html这样的文件，允许作者在页面中直接指定编码类型。比如在html中会有&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"/&gt;这样的标签；或者在xml中会有&lt;?xml version="1.0" encoding="gb2312"?&gt;这样的标签，在这些情况下，可能与http头中返回的编码信息冲突，需要用户自己判断到底那种编码类型应该是真正的编码。 </li>
														</ul>
														<p>
																<a name="IDAIGG0">
																		<span class="smalltitle">
																				<strong>
																						<font face="Arial" color="#000000" size="3">自动转向</font>
																				</strong>
																		</span>
																</a>
														</p>
														<p>根据RFC2616中对自动转向的定义，主要有两种：301和302。301表示永久的移走（Moved Permanently），当返回的是301，则表示请求的资源已经被移到一个固定的新地方，任何向该地址发起请求都会被转到新的地址上。302表示暂时的转向，比如在服务器端的servlet程序调用了sendRedirect方法，则在客户端就会得到一个302的代码，这时服务器返回的头信息中location的值就是sendRedirect转向的目标地址。</p>
														<p>HttpClient支持自动转向处理，但是象POST和PUT方式这种要求接受后继服务的请求方式，暂时不支持自动转向，因此如果碰到POST方式提交后返回的是301或者302的话需要自己处理。就像刚才在POSTMethod中举的例子：如果想进入登录BBS后的页面，必须重新发起登录的请求，请求的地址可以在头字段location中得到。不过需要注意的是，有时候location返回的可能是相对路径，因此需要对location返回的值做一些处理才可以发起向新地址的请求。</p>
														<p>另外除了在头中包含的信息可能使页面发生重定向外，在页面中也有可能会发生页面的重定向。引起页面自动转发的标签是：&lt;meta http-equiv="refresh" content="5; url=http://www.ibm.com/us"&gt;。如果你想在程序中也处理这种情况的话得自己分析页面来实现转向。需要注意的是，在上面那个标签中url的值也可以是一个相对地址，如果是这样的话，需要对它做一些处理后才可以转发。</p>
														<p>
																<a name="IDAQGG0">
																		<span class="smalltitle">
																				<strong>
																						<font face="Arial" color="#000000" size="3">处理HTTPS协议</font>
																				</strong>
																		</span>
																</a>
														</p>
														<p>HttpClient提供了对SSL的支持，在使用SSL之前必须安装JSSE。在Sun提供的1.4以后的版本中，JSSE已经集成到JDK中，如果你使用的是JDK1.4以前的版本则必须安装JSSE。JSSE不同的厂家有不同的实现。下面介绍怎么使用HttpClient来打开Https连接。这里有两种方法可以打开https连接，第一种就是得到服务器颁发的证书，然后导入到本地的keystore中；另外一种办法就是通过扩展HttpClient的类来实现自动接受证书。</p>
														<p>方法1，取得证书，并导入本地的keystore：</p>
														<ul>
																<li>安装JSSE （如果你使用的JDK版本是1.4或者1.4以上就可以跳过这一步）。本文以IBM的JSSE为例子说明。先到IBM网站上下载JSSE的安装包。然后解压开之后将ibmjsse.jar包拷贝到&lt;java-home&gt;\lib\ext\目录下。 
</li>
																<li>取得并且导入证书。证书可以通过IE来获得： 
<p>1． 用IE打开需要连接的https网址，会弹出如下对话框：</p><br /><a name="IDA3GG0"><strong></strong></a><br /><img height="301" src="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/images/image001.png" width="384" border="0" /><br /><p>2． 单击"View Certificate"，在弹出的对话框中选择"Details"，然后再单击"Copy to File"，根据提供的向导生成待访问网页的证书文件</p><br /><a name="IDALHG0"><strong></strong></a><br /><img height="476" src="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/images/image003.png" width="409" border="0" /><br /><p>3． 向导第一步，欢迎界面，直接单击"Next"，</p><br /><a name="IDAZHG0"><strong></strong></a><br /><img height="386" src="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/images/image005.png" width="503" border="0" /><br /><p>4． 向导第二步，选择导出的文件格式，默认，单击"Next"，</p><br /><a name="IDAKAO0"><strong></strong></a><br /><img height="386" src="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/images/image007.png" width="503" border="0" /><br /><p>5． 向导第三步，输入导出的文件名，输入后，单击"Next"，</p><br /><a name="IDAYAO0"><strong></strong></a><br /><img height="454" src="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/images/image009.png" width="506" border="0" /><br /><p>6． 向导第四步，单击"Finish"，完成向导</p><br /><a name="IDAGBO0"><strong></strong></a><br /><img height="386" src="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/images/image011.png" width="503" border="0" /><br /><p>7． 最后弹出一个对话框，显示导出成功</p><br /><a name="IDAUBO0"><strong></strong></a><br /><img height="100" src="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/images/image013.png" width="183" border="0" /><br /></li>
																<li>
																		<p>用keytool工具把刚才导出的证书倒入本地keystore。Keytool命令在&lt;java-home&gt;\bin\下，打开命令行窗口，并到&lt;java-home&gt;\lib\security\目录下，运行下面的命令：</p>
																		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
																				<tbody>
																						<tr>
																								<td>
																										<pre>
																												<code class="section">
																														<font face="Lucida Console">keytool -import -noprompt -keystore cacerts -storepass changeit -alias yourEntry1 -file your.cer
</font>
																												</code>
																										</pre>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<br />
																		<p>其中参数alias后跟的值是当前证书在keystore中的唯一标识符，但是大小写不区分；参数file后跟的是刚才通过IE导出的证书所在的路径和文件名；如果你想删除刚才导入到keystore的证书，可以用命令：</p>
																		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
																				<tbody>
																						<tr>
																								<td>
																										<pre>
																												<code class="section">
																														<font face="Lucida Console">keytool -delete -keystore cacerts -storepass changeit -alias yourEntry1
</font>
																												</code>
																										</pre>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<br />
																</li>
																<li>写程序访问https地址。如果想测试是否能连上https，只需要稍改一下GetSample例子，把请求的目标变成一个https地址。 
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">GetMethod getMethod = new GetMethod("https://www.yourdomain.com");
</font></code></pre></td></tr></tbody></table><br /><p>运行该程序可能出现的问题：</p><p>1. 抛出异常java.net.SocketException: Algorithm SSL not available。出现这个异常可能是因为没有加JSSEProvider，如果用的是IBM的JSSE Provider，在程序中加入这样的一行：</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console"> if(Security.getProvider("com.ibm.jsse.IBMJSSEProvider") == null)
 Security.addProvider(new IBMJSSEProvider());
 </font></code></pre></td></tr></tbody></table><br /><p>或者也可以打开&lt;java-home&gt;\lib\security\java.security，在行</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">security.provider.1=sun.security.provider.Sun
security.provider.2=com.ibm.crypto.provider.IBMJCE
</font></code></pre></td></tr></tbody></table><br /><p>后面加入security.provider.3=com.ibm.jsse.IBMJSSEProvider</p><p>2. 抛出异常java.net.SocketException: SSL implementation not available。出现这个异常可能是你没有把ibmjsse.jar拷贝到&lt;java-home&gt;\lib\ext\目录下。</p><p>3. 抛出异常javax.net.ssl.SSLHandshakeException: unknown certificate。出现这个异常表明你的JSSE应该已经安装正确，但是可能因为你没有把证书导入到当前运行JRE的keystore中，请按照前面介绍的步骤来导入你的证书。</p></li>
														</ul>
														<p>方法２，扩展HttpClient类实现自动接受证书</p>
														<p>因为这种方法自动接收所有证书，因此存在一定的安全问题，所以在使用这种方法前请仔细考虑您的系统的安全需求。具体的步骤如下：</p>
														<ul>
																<li>提供一个自定义的socket factory（test.MySecureProtocolSocketFactory）。这个自定义的类必须实现接口org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory，在实现接口的类中调用自定义的X509TrustManager(test.MyX509TrustManager)，这两个类可以在随本文带的附件中得到 
</li>
																<li>创建一个org.apache.commons.httpclient.protocol.Protocol的实例，指定协议名称和默认的端口号 
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory (), 443);
</font></code></pre></td></tr></tbody></table><br /></li>
																<li>注册刚才创建的https协议对象 
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">Protocol.registerProtocol("https ", myhttps);
</font></code></pre></td></tr></tbody></table><br /></li>
																<li>然后按照普通编程方式打开https的目标地址，代码请参见test.NoCertificationHttpsGetSample </li>
														</ul>
														<p>
																<a name="IDAJDO0">
																		<span class="smalltitle">
																				<strong>
																						<font face="Arial" color="#000000" size="3">处理代理服务器</font>
																				</strong>
																		</span>
																</a>
														</p>
														<p>HttpClient中使用代理服务器非常简单，调用HttpClient中setProxy方法就可以，方法的第一个参数是代理服务器地址，第二个参数是端口号。另外HttpClient也支持SOCKS代理。</p>
														<br />
														<a name="IDAPDO0">
																<strong>
																</strong>
														</a>
														<br />
														<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
																<tbody>
																		<tr>
																				<td>
																						<pre>
																								<code class="section">
																										<font face="Lucida Console">httpClient.getHostConfiguration().setProxy(hostName,port);
</font>
																								</code>
																						</pre>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
														<br />
														<table cellspacing="0" cellpadding="0" width="100%" border="0">
																<tbody>
																		<tr>
																				<td>
																						<font face="Lucida Console">
																								<img height="1" src="http://www.crackj2ee.com/Article/UploadFiles/200511/20051125151629941.gif" width="100%" />
																						</font>
																				</td>
																		</tr>
																</tbody>
														</table>
														<table class="no-print" cellspacing="0" cellpadding="0" align="right">
																<tbody>
																		<tr align="right">
																				<td>
																						<table cellspacing="0" cellpadding="0" border="0">
																								<tbody>
																										<tr>
																												<td valign="center">
																														<font face="Lucida Console">
																																<br />
																														</font>
																												</td>
																												<td valign="top" align="right">
																														<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/#main">
																																<strong>
																																		<font color="#996699">
																																		</font>
																																</strong>
																														</a>
																												</td>
																										</tr>
																								</tbody>
																						</table>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
														<br />
														<p>
																<a name="IDAWDO0">
																		<span class="atitle">
																				<font face="Arial" color="#000000" size="4">结论</font>
																		</span>
																</a>
														</p>
														<p>从上面的介绍中，可以知道HttpClient对http协议支持非常好，使用起来很简单，版本更新快，功能也很强大，具有足够的灵活性和扩展性。对于想在Java应用中直接访问http资源的编程人员来说，HttpClient是一个不可多得的好工具。</p>
														<br />
														<table cellspacing="0" cellpadding="0" width="100%" border="0">
																<tbody>
																		<tr>
																				<td>
																						<img height="1" src="http://www.crackj2ee.com/Article/UploadFiles/200511/20051125151629941.gif" width="100%" />
																				</td>
																		</tr>
																</tbody>
														</table>
														<table class="no-print" cellspacing="0" cellpadding="0" align="right">
																<tbody>
																		<tr align="right">
																				<td>
																						<table cellspacing="0" cellpadding="0" border="0">
																								<tbody>
																										<tr>
																												<td valign="center">
																														<br />
																												</td>
																												<td valign="top" align="right">
																														<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/#main">
																																<strong>
																																		<font color="#996699">
																																		</font>
																																</strong>
																														</a>
																												</td>
																										</tr>
																								</tbody>
																						</table>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
														<br />
														<p>
																<a name="resources">
																		<span class="atitle">
																				<font face="Arial" color="#000000" size="4">参考资料 </font>
																		</span>
																</a>
														</p>
														<ul>
																<li>本文样码下载：<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/src.zip"><font color="#5c81a7">src.zip</font></a></li>
																<li>Commons logging包含了各种各样的日志API的实现，读者可以通过站点http://jakarta.apache.org/commons/logging/得到详细的内容<br /><br /></li>
																<li>Commons codec包含了一些一般的解码/编码算法。包含了语音编码、十六进制、Base64和URL编码等，通过http://jakarta.apache.org/commons/codec/可以得到详细的内容<br /><br /></li>
																<li>rfc2616是关于HTTP/1.1的文档，可以在http://www.faqs.org/rfcs/rfc2616.html上得到详细的内容，另外rfc1945是关于HTTP/1.0的文档，通过http://www.faqs.org/rfcs/rfc1945.html可以得到详细内容<br /><br /></li>
																<li>SSL――SSL 是由 Netscape Communications Corporation 于 1994 年开发的，而 TLS V1.0 是由 Internet Engineering Task Force（IETF）定义的标准，它基于 SSL V3.0，并且在使用的加密算法上与其有些许的不同。例如，SSL 使用 Message Authentication Code（MAC）算法来生成完整性校验值，而 TLS 应用密钥的 Hashing for Message Authentication Code（HMAC）算法。<br /><br /></li>
																<li>IBM JSSE提供了SSL（Secure Sockets Layer）和TLS（Transport Layer Security）的java实现，在http://www-03.ibm.com/servers/eserver/zseries/software/java/jsse.html中可以得到详细的信息<br /><br /></li>
																<li>Keytool是一个管理密钥和证书的工具。关于它详细的使用信息可以在http://www.doc.ic.ac.uk/csg/java/1.3.1docs/tooldocs/solaris/keytool.html上得到<br /><br /></li>
																<li>HTTPClient的主页是http://jakarta.apache.org/commons/httpclient/，你可以在这里得到关于HttpClient更加详细的信息<br /></li>
														</ul>
												</div>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/baoyaer/aggbug/95854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-01-25 10:07 <a href="http://www.blogjava.net/baoyaer/articles/95854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpClient入门－基本功能的使用（POST方法） </title><link>http://www.blogjava.net/baoyaer/articles/88729.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 19 Dec 2006 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/88729.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/88729.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/88729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/88729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/88729.html</trackback:ping><description><![CDATA[
		<div align="right">
		</div>
		<br />
		<span class="tpc_content">POST方法 <br /><br />根据RFC2616，对POST的解释如下：POST方法用来向目的服务器发出请求，要求它接受被附在请求后的实体，并把它当作请求队列（Request-Line）中请求URI所指定资源的附加新子项。POST被设计成用统一的方法实现下列功能： <br /><br />对现有资源的注释（Annotation  of  existing  resources）   <br />向电子公告栏、新闻组，邮件列表或类似讨论组发送消息   <br />提交数据块，如将表单的结果提交给数据处理过程   <br />通过附加操作来扩展数据库 <br />调用HttpClient中的PostMethod与GetMethod类似，除了设置PostMethod的实例与GetMethod有些不同之外，剩下的步骤都差不多。在下面的例子中，省去了与GetMethod相同的步骤，只说明与上面不同的地方，并以登录清华大学BBS为例子进行说明。 <br /><br />构造PostMethod之前的步骤都相同，与GetMethod一样，构造PostMethod也需要一个URI参数，在本例中，登录的地址是<a href="http://www.newsmth.net/bbslogin2.php。在创建了PostMethod的实例之后，需要给method实例填充表单的值，在BBS的登录表单中需要有两个域，第一个是用户名（域名叫id），第二个是密码（域名叫passwd）。表单中的域用类NameValuePair来表示，该类的构造函数第一个参数是域名，第二参数是该域的值；将表单所有的值设置到PostMethod中用方法setRequestBody。另外由于BBS登录成功后会转向另外一个页面，但是HttpClient对于要求接受后继服务的请求，比如POST和PUT，不支持自动转发，因此需要自己对页面转向做处理。具体的页面转向处理请参见下面的" target="_blank">http://www.newsmth.net/bbslogin2.php。在创建了PostMethod的实例之后，需要给method实例填充表单的值，在BBS的登录表单中需要有两个域，第一个是用户名（域名叫id），第二个是密码（域名叫passwd）。表单中的域用类NameValuePair来表示，该类的构造函数第一个参数是域名，第二参数是该域的值；将表单所有的值设置到PostMethod中用方法setRequestBody。另外由于BBS登录成功后会转向另外一个页面，但是HttpClient对于要求接受后继服务的请求，比如POST和PUT，不支持自动转发，因此需要自己对页面转向做处理。具体的页面转向处理请参见下面的</a>"自动转向"部分。代码如下：   <br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">String  url  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.newsmth.net/bbslogin2.php</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />PostMethod  postMethod  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">  PostMethod(url); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">  填入各个表单域的值 </span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_148_236_Open_Image" onclick="this.style.display='none'; Codehighlighter1_148_236_Open_Text.style.display='none'; Codehighlighter1_148_236_Closed_Image.style.display='inline'; Codehighlighter1_148_236_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_148_236_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_148_236_Closed_Text.style.display='none'; Codehighlighter1_148_236_Open_Image.style.display='inline'; Codehighlighter1_148_236_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #000000">NameValuePair[]  data  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  </span><span id="Codehighlighter1_148_236_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_148_236_Open_Text"><span style="COLOR: #000000">{  </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">  NameValuePair(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">youUserName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">), <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">  NameValuePair(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">passwd</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">yourPwd</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)  }</span></span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">  将表单的值放入postMethod中 </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">postMethod.setRequestBody(data); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">  执行postMethod </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  statusCode  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  httpClient.executeMethod(postMethod); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">  HttpClient对于要求接受后继服务的请求，象POST和PUT等不能自动处理转发 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">  301或者302 </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">  (statusCode  </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">  HttpStatus.SC_MOVED_PERMANENTLY  </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">   <br /><img id="Codehighlighter1_547_977_Open_Image" onclick="this.style.display='none'; Codehighlighter1_547_977_Open_Text.style.display='none'; Codehighlighter1_547_977_Closed_Image.style.display='inline'; Codehighlighter1_547_977_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_547_977_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_547_977_Closed_Text.style.display='none'; Codehighlighter1_547_977_Open_Image.style.display='inline'; Codehighlighter1_547_977_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />statusCode  </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">  HttpStatus.SC_MOVED_TEMPORARILY)  </span><span id="Codehighlighter1_547_977_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_547_977_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">  从头中取出转向的地址 </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        Header  locationHeader  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  postMethod.getResponseHeader(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">location</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String  location  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">; <br /><img id="Codehighlighter1_728_869_Open_Image" onclick="this.style.display='none'; Codehighlighter1_728_869_Open_Text.style.display='none'; Codehighlighter1_728_869_Closed_Image.style.display='inline'; Codehighlighter1_728_869_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_728_869_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_728_869_Closed_Text.style.display='none'; Codehighlighter1_728_869_Open_Image.style.display='inline'; Codehighlighter1_728_869_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">  (locationHeader  </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)  </span><span id="Codehighlighter1_728_869_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_728_869_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          location  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  locationHeader.getValue(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">The  page  was  redirected  to:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">  location); <br /><img id="Codehighlighter1_878_957_Open_Image" onclick="this.style.display='none'; Codehighlighter1_878_957_Open_Text.style.display='none'; Codehighlighter1_878_957_Closed_Image.style.display='inline'; Codehighlighter1_878_957_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_878_957_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_878_957_Closed_Text.style.display='none'; Codehighlighter1_878_957_Open_Image.style.display='inline'; Codehighlighter1_878_957_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span></span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">  </span><span id="Codehighlighter1_878_957_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_878_957_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          System.err.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Location  field  value  is  null.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div></span>
<img src ="http://www.blogjava.net/baoyaer/aggbug/88729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-12-19 11:30 <a href="http://www.blogjava.net/baoyaer/articles/88729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts表单验证开发指南 </title><link>http://www.blogjava.net/baoyaer/articles/87642.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 14 Dec 2006 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/87642.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/87642.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/87642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/87642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/87642.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 要在				Struts				项目中使用										Validator								功能				,				首先需要配置				Struts				项目				,				使其支持										Validator								框架				.Struts				通过一个插件				(Plugin)				...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/87642.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/87642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-12-14 10:37 <a href="http://www.blogjava.net/baoyaer/articles/87642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet 中的 Listener 的应用 </title><link>http://www.blogjava.net/baoyaer/articles/87641.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 14 Dec 2006 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/87641.html</guid><description><![CDATA[
		<p>
				<br />Listener是Servlet的监听器，它可以监听客户端的请求、服务端的操作等。通过监听器，可以自动激发一些操作，比如监听在线的用户的数量。当增加一个HttpSession时，就激发sessionCreated(HttpSessionEvent se)方法，这样就可以给在线人数加1。常用的监听接口有以下几个：</p>
		<p>ServletContextAttributeListener监听对ServletContext属性的操作，比如增加、删除、修改属性。</p>
		<p>ServletContextListener监听ServletContext。当创建ServletContext时，激发contextInitialized(ServletContextEvent sce)方法；当销毁ServletContext时，激发contextDestroyed(ServletContextEvent sce)方法。</p>
		<p>HttpSessionListener监听HttpSession的操作。当创建一个Session时，激发session Created(HttpSessionEvent se)方法；当销毁一个Session时，激发sessionDestroyed (HttpSessionEvent se)方法。</p>
		<p>HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时，激发attributeAdded(HttpSessionBindingEvent se) 方法；当在Session删除一个属性时，激发attributeRemoved(HttpSessionBindingEvent se)方法；当在Session属性被重新设置时，激发attributeReplaced(HttpSessionBindingEvent se) 方法。 </p>
		<p>下面我们开发一个具体的例子，这个监听器能够统计在线的人数。在ServletContext初始化和销毁时，在服务器控制台打印对应的信息。当ServletContext里的属性增加、改变、删除时，在服务器控制台打印对应的信息。 </p>
		<p>要获得以上的功能，监听器必须实现以下3个接口：</p>
		<p>HttpSessionListener</p>
		<p>ServletContextListener</p>
		<p>ServletContextAttributeListener </p>
		<p>我们看具体的代码，见示例14-9。 </p>
		<p>【程序源代码】 </p>
		<p>1 // ==================== Program Discription =====================<br />2 // 程序名称：示例14-9 : EncodingFilter .java<br />3 // 程序目的：学习使用监听器<br />4 // ==============================================================<br />5 import javax.servlet.http.*;<br />6 import javax.servlet.*;<br />7<br />8 public class OnLineCountListener implements HttpSessionListener,<br />ServletContextListener,ServletContextAttributeListener<br />9 {<br />10  private int count;<br />11  private ServletContext context = null;<br />12  <br />13  public OnLineCountListener()<br />14  {<br />15   count=0;<br />16   //setContext();<br />17  }<br />18  //创建一个session时激发<br />19  public void sessionCreated(HttpSessionEvent se) <br />20  {<br />21   count++;<br />22   setContext(se);<br />23   <br />24  }<br />25  //当一个session失效时激发<br />26  public void sessionDestroyed(HttpSessionEvent se) <br />27  {<br />28   count--;<br />29   setContext(se);<br />30  }<br />31  //设置context的属性，它将激发attributeReplaced或attributeAdded方法<br />32  public void setContext(HttpSessionEvent se)<br />33  {<br />34   se.getSession().getServletContext().<br />setAttribute("onLine",new Integer(count));<br />35  }<br />36   //增加一个新的属性时激发<br />37  public void attributeAdded(ServletContextAttributeEvent event) {<br />38 <br />39  log("attributeAdded('" + event.getName() + "', '" +<br />40      event.getValue() + "')");<br />41 <br />42     }<br />43     <br />44    //删除一个新的属性时激发<br />45     public void attributeRemoved(ServletContextAttributeEvent event) {<br />46<br />47  log("attributeRemoved('" + event.getName() + "', '" +<br />48      event.getValue() + "')");<br />49 <br />50     }<br />51<br />52  //属性被替代时激发<br />53     public void attributeReplaced(ServletContextAttributeEvent event) {<br />54 <br />55   log("attributeReplaced('" + event.getName() + "', '" +<br />56       event.getValue() + "')");<br />57     }<br />58     //context删除时激发<br />59      public void contextDestroyed(ServletContextEvent event) {<br />60 <br />61   log("contextDestroyed()");<br />62   this.context = null;<br />63 <br />64     }<br />65 <br />66     //context初始化时激发<br />67     public void contextInitialized(ServletContextEvent event) {<br />68 <br />69   this.context = event.getServletContext();<br />70   log("contextInitialized()");<br />71 <br />72     }<br />73     private void log(String message) {<br />74 <br />75      System.out.println("ContextListener: " + message);<br />76     }   <br />77 }<br /> </p>
		<p>
				<br />【程序注解】<br />在OnLineCountListener里，用count代表当前在线的人数，OnLineCountListener将在Web服务器启动时自动执行。当OnLineCountListener构造好后，把count设置为0。每增加一个Session，OnLineCountListener会自动调用sessionCreated(HttpSessionEvent se)方法；每销毁一个Session，OnLineCountListener会自动调用sessionDestroyed(HttpSessionEvent se)方法。当调用sessionCreated(HttpSessionEvent se)方法时，说明又有一个客户在请求，此时使在线的人数（count）加1，并且把count写到ServletContext中。ServletContext的信息是所有客户端共享的，这样，每个客户端都可以读取到当前在线的人数。 <br /> </p>
		<p> </p>
		<p>
				<br />从作用域范围来说,Servlet的作用域有ServletContext,HttpSession,ServletRequest.</p>
		<p>Context范围:</p>
		<p>ServletContextListener:<br />对一个应用进行全局监听.随应用启动而启动,随应用消失而消失主要有两个方法:</p>
		<p>contextDestroyed(ServletContextEvent event) </p>
		<p>在应用关闭的时候调用</p>
		<p>contextInitialized(ServletContextEvent event) </p>
		<p>在应用启动的时候调用</p>
		<p>这个监听器主要用于一些随着应用启动而要完成的工作,也就是很多人说的我想在容器<br />启动的时候干..........<br />一般来说对"全局变量"初始化,如</p>
		<p>public void contextInitialized(ServletContextEvent event){<br />ServletContex sc = event.getServletContext();<br />sc.setAttribute(name,value);<br />} </p>
		<p>以后你就可以在任何servlet中getServletContext().getAttribute(name);<br />我最喜欢用它来做守护性工作,就是在contextInitialized(ServletContextEvent event) <br />方法中实现一个Timer,然后就让应用在每次启动的时候让这个Timer工作:<br />程序代码： <br />public void contextInitialized(ServletContextEvent event){<br />timer = new Timer();<br />timer.schedule(new TimerTask(){<br />public void run(){<br />//do any things<br />}<br />},0,时间间隔);<br />} </p>
		<p>
				<br />有人说Timer只能规定从现在开始的多长时间后,每隔多久做一次事或在什么时间做<br />一次事,那我想在每月1号或每天12点做一项工作如何做呢?<br />你只要设一个间隔,然后每次判断一下当时是不是那个时间段就行了啊,比如每月一号做,那你<br />时间间隔设为天,即24小时一个循环,然后在run方法中判断当时日期new Date().getDate()==1<br />就行了啊.如果是每天的12点,那你时间间隔设为小时,然后在run中判断new Date().getHour()<br />==12,再做某事就行了.</p>
		<p>ServletContextAttributeListener:</p>
		<p>这个监听器主要监听ServletContex对象在setAttribute()和removeAttribute()的事件,注意<br />也就是一个"全局变量"在被Add(第一次set),replace(对已有的变量重新赋值)和remove的时候.<br />分别调用下面三个方法:<br />public void attributeAdded(ServletContextAttributeEvent scab)这个方法不仅可以知道<br />哪些全局变量被加进来,而且可获取容器在启动时自动设置了哪些context变量:<br />程序代码： <br />public void attributeAdded(ServletContextAttributeEvent scab){<br />System.out.println(scab.getName());<br />}<br />public void attributeRemoved(ServletContextAttributeEvent scab) </p>
		<p>public void attributeReplaced(ServletContextAttributeEvent scab) </p>
		<p>
				<br />Session范围:<br />HttpSessionListener:<br />这个监听器主要监听一个Session对象被生成和销毁时发生的事件.对应有两个方法:<br />程序代码： <br />public void sessionCreated(HttpSessionEvent se) </p>
		<p>public void sessionDestroyed(HttpSessionEvent se) </p>
		<p>
				<br />一般来说,一个session对象被create时,可以说明有一个新客端进入.可以用来粗略统计在线人<br />数,注意这不是精确的,因为这个客户端可能立即就关闭了,但sessionDestroyed方法却会按一定<br />的策略很久以后才会发生.</p>
		<p>HttpSessionAttributeListener:<br />和ServletContextAttributeListener一样,它监听一个session对象的Attribut被Add(一个特定<br />名称的Attribute每一次被设置),replace(已有名称的Attribute的值被重设)和remove时的事件.<br />对就的有三个方法.<br />程序代码： <br />public void attributeAdded(HttpSessionBindingEvent se) </p>
		<p>public void attributeRemoved(HttpSessionBindingEvent se) </p>
		<p>public void attributeReplaced(HttpSessionBindingEvent se) </p>
		<p>
				<br />上面的几个监听器的方法,都是在监听应用逻辑中servlet逻辑中发生了什么事,一般的来说.<br />我们只要完成逻辑功能,比如session.setAttribute("aaa","111");我只要把一个名为aaa的变量<br />放在session中以便以后我能获取它,我并不关心当session.setAttribute("aaa","111");发生时<br />我还要干什么.(当然有些时候要利用的),但对于下面这个监听器,你应该好好发解一下:</p>
		<p>HttpSessionBindingListener:<br />上面的监听器都是作为一个独立的Listener在容器中控制事件的.而HttpSessionBindingListener<br />对在一对象中监听该对象的状态,实现了该接口的对象如果被作为value被add到一个session中或从<br />session中remove,它就会知道自己已经作为一个session对象或已经从session删除,这对于一些非<br />纯JAVA对象,生命周期长于session的对象,以及其它需要释放资源或改变状态的对象非常重要.<br />比如:<br />session.setAttribute("abcd","1111");<br />以后session.removeAttribute("abcd");因为abcd是一个字符中,你从session中remove后,它就会<br />自动被垃圾回收器回收,而如果是一个connection:(只是举例,你千万不要加connection往session<br />中加入)<br />程序代码： <br />session.setAttribute("abcd",conn); </p>
		<p>以后session.removeAttribute("abcd");这时这个conn被从session中remove了,你已经无法获取它<br />的句柄,所以你根本没法关闭它.而在没有remove之前你根本不知道什么时候要被remove,你又无法<br />close(),那么这个connection对象就死了.另外还有一些对象可以在被加入一个session时要锁定<br />还要被remove时要解锁,应因你在程序中无法判断什么时候被remove(),add还好操作,我可以先加锁<br />再add,但remove就后你就找不到它的句柄了,根本没法解锁,所以这些操作只能在对象自身中实现.<br />也就是在对象被add时或remove时通知对象自己回调相应的方法:<br />程序代码： <br />MyConn extends Connection implements HttpSessionBindingListener{<br />public void valueBound(HttpSessionBindingEvent se){<br />this.initXXX();<br />}<br />public void valueUnbound(HttpSessionBindingEvent se){</p>
		<p>this.close();<br />}<br />} </p>
		<p>
				<br />session.setAttribute("aaa",new MyConn());<br />这时如果调用session.removeAttribute("aaa"),则触发valueUnbound方法,就会自动关闭自己.<br />而其它的需要改变状态的对象了是一样.</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/87641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-12-14 10:36 <a href="http://www.blogjava.net/baoyaer/articles/87641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用HttpSessionListener实现网站在线人数统计功能 [zt]</title><link>http://www.blogjava.net/baoyaer/articles/86266.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 08 Dec 2006 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/86266.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/86266.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/86266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/86266.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/86266.html</trackback:ping><description><![CDATA[
		<br />在网站中经常需要进行在线人数的统计。过去的一般做法是结合登录和退出功能，即当用户输入用户名密码进行登录的时候计数器加1，然后当用户点击退出按钮退出系统的时候计数器减1。这种处理方式存在一些缺点，例如：用户正常登录后，可能会忘记点击退出按钮，而直接关闭浏览器，导致计数器减1的操作没有及时执行；网站上还经常有一些内容是不需要登录就可以访问的，在这种情况下也无法使用上面的方法进行在线人数统计。<br />　　我们可以利用Servlet规范中定义的事件监听器（Listener）来解决这个问题，实现更准确的在线人数统计功能。对每一个正在访问的用户，J2EE应用服务器会为其建立一个对应的HttpSession对象。当一个浏览器第一次访问网站的时候，J2EE应用服务器会新建一个HttpSession对象，并触发HttpSession创建事件，如果注册了HttpSessionListener事件监听器，则会调用HttpSessionListener事件监听器的sessionCreated方法。相反，当这个浏览器访问结束超时的时候，J2EE应用服务器会销毁相应的HttpSession对象，触发HttpSession销毁事件，同时调用所注册HttpSessionListener事件监听器的sessionDestroyed方法。<br />　　可见，对应于一个用户访问的开始和结束，相应的有sessionCreated方法和sessionDestroyed方法执行。这样，我们只需要在HttpSessionListener实现类的sessionCreated方法中让计数器加1，在sessionDestroyed方法中让计数器减1，就轻松实现了网站在线人数的统计功能。<br />　　下面就是利用HttpSessionListener实现在线人数统计的一个例子，这个例子已经在中创软件的J2EE应用<a href="http://www.myfaq.com.cn/System/Server/index.html" target="_blank">服务器</a>InforWeb中测试通过。<br />　　首先，编写一个简单的计数器，代码如下：<br /><div class="codeStyle"></div><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"><br /><img id="Codehighlighter1_28_264_Open_Image" onclick="this.style.display='none'; Codehighlighter1_28_264_Open_Text.style.display='none'; Codehighlighter1_28_264_Closed_Image.style.display='inline'; Codehighlighter1_28_264_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_28_264_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_28_264_Closed_Text.style.display='none'; Codehighlighter1_28_264_Open_Image.style.display='inline'; Codehighlighter1_28_264_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"> OnlineCounter </span><span id="Codehighlighter1_28_264_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_28_264_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> online </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;     <br /><img id="Codehighlighter1_107_138_Open_Image" onclick="this.style.display='none'; Codehighlighter1_107_138_Open_Text.style.display='none'; Codehighlighter1_107_138_Closed_Image.style.display='inline'; Codehighlighter1_107_138_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_107_138_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_107_138_Closed_Text.style.display='none'; Codehighlighter1_107_138_Open_Image.style.display='inline'; Codehighlighter1_107_138_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> getOnline() </span><span id="Codehighlighter1_107_138_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_107_138_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> online; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000">     <br /><img id="Codehighlighter1_175_201_Open_Image" onclick="this.style.display='none'; Codehighlighter1_175_201_Open_Text.style.display='none'; Codehighlighter1_175_201_Closed_Image.style.display='inline'; Codehighlighter1_175_201_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_175_201_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_175_201_Closed_Text.style.display='none'; Codehighlighter1_175_201_Open_Image.style.display='inline'; Codehighlighter1_175_201_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> raise()</span><span id="Codehighlighter1_175_201_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_175_201_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        online</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000">  <br /><img id="Codehighlighter1_236_261_Open_Image" onclick="this.style.display='none'; Codehighlighter1_236_261_Open_Text.style.display='none'; Codehighlighter1_236_261_Closed_Image.style.display='inline'; Codehighlighter1_236_261_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_236_261_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_236_261_Closed_Text.style.display='none'; Codehighlighter1_236_261_Open_Image.style.display='inline'; Codehighlighter1_236_261_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> reduce()</span><span id="Codehighlighter1_236_261_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_236_261_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        online</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span></span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />　　然后，编写HttpSessionListener实现类，在这个实现类的sessionCreated方法中调用OnlineCounter的raise方法，在sessionDestroyed方法中调用OnlineCounter的reduce方法，代码如下：<br /><div class="codeStyle"></div><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.javax</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">servlet</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">http</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">HttpSessionEvent.java.html</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> target=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">_blank</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;HttpSessionEvent; </span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.javax</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">servlet</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">http</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">HttpSessionListener.java.html</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> target=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">_blank</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;HttpSessionListener; </span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.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"> OnlineCounterListener </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> javax</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">servlet</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">http</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">HttpSessionListener.java.html</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> target=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">_blank</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;HttpSessionListener { </span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> sessionCreated(javax</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">servlet</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">http</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">HttpSessionEvent.java.html</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> target=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">_blank</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;HttpSessionEvent hse) { </span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">        OnlineCounter.raise(); <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">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> sessionDestroyed(javax</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">servlet</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">http</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">HttpSessionEvent.java.html</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> target=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">_blank</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;HttpSessionEvent hse) { </span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">        OnlineCounter.reduce(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    } <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />} <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />　　再然后，把这个HttpSessionListener实现类注册到网站应用中，也就是在网站应用的web.xml中加入如下内容：<br /><div class="codeStyle"></div><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">web</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">app</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    …… <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">listener</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">listener</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            gongfei.cmc.articles.example.OnlineCounterListener <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">listener</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">listener</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    …… <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">web</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">app</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />　　OK，在线人数统计功能已经实现，只要在JSP页面中加入下面这样的脚本就能显示但前在线人数了：<br /><div class="codeStyle"><ol><li>&lt;%@ page language=<font color="#ff33ff">"<a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>"</font> pageEncoding=<font color="#ff33ff">"GB2312"</font> %&gt; 
</li><li>&lt;%@ page <b><font color="#0000ff">import</font></b>=<font color="#ff33ff">"gongfei.cmc.articles.onlinecounter.OnlineCounter"</font> %&gt; 
</li><li>&lt;html&gt; 
</li><li>    &lt;head&gt;&lt;title&gt;On Line Counert&lt;/title&gt;&lt;/head&gt; 
</li><li>    &lt;body bgcolor=<font color="#ff33ff">"#FFFFFF"</font>&gt; 
</li><li>        On line:&lt;%=OnlineCounter.getOnline()%&gt; 
</li><li>    &lt;/body&gt; 
</li><li>&lt;/html&gt; </li></ol></div><img src ="http://www.blogjava.net/baoyaer/aggbug/86266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-12-08 11:17 <a href="http://www.blogjava.net/baoyaer/articles/86266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet &amp;&amp; jsp 学习（一）</title><link>http://www.blogjava.net/baoyaer/articles/84873.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 01 Dec 2006 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/84873.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/84873.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/84873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/84873.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/84873.html</trackback:ping><description><![CDATA[Servlet 是个中间件，负责读取客户端信息（显示信息/隐式信息）,通过操作最后返回结果 
<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 height="16" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" width="11" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> javax.servlet;<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.io.IOException;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Referenced classes of package javax.servlet:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">            ServletException, ServletConfig, ServletRequest, ServletResponse</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000"> Servlet                   <font color="#008000">//单列模式，即服务器之创建一个servlet实例 <br /></font><img id="Codehighlighter1_206_583_Open_Image" onclick="this.style.display='none'; Codehighlighter1_206_583_Open_Text.style.display='none'; Codehighlighter1_206_583_Closed_Image.style.display='inline'; Codehighlighter1_206_583_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_206_583_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_206_583_Closed_Text.style.display='none'; Codehighlighter1_206_583_Open_Image.style.display='inline'; Codehighlighter1_206_583_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_206_583_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_206_583_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> init(ServletConfig servletconfig)   </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> ServletException;          <font color="#008000">//初始化，首次创建servlet时调用，<br /></font><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000"> ServletConfig getServletConfig();           <font color="#008000">  //获取持久属性<br /></font><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> service(ServletRequest servletrequest, ServletResponse servletresponse)      </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> ServletException, IOException;  <font color="#008000">//允许多个线程并发访问，服务器接收到Http请求时，就会调用该方法，由该方法负责调用dopost/doget/.......等方法。<br /></font>        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000"> String getServletInfo();                               <img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> destroy();              <font color="#008000">//服务器移除servlet时，servlet释放他所创建的系统资源（数据库连接/后台运行的线程/写cookie） <br /></font><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br /><br />表单数据：<br />        浏览器向服务器端发送的数据。对表单输入的数据，浏览器不做任何改动，当java的unioncode不能识别时，就出现了所谓的乱码，所以我们就得采用某种方式对表单数据进行编码，当传回数据时在经历一次解码。最后所有的表单数据都封装在request对象里，通过request提供的方法获得表单数据<img src ="http://www.blogjava.net/baoyaer/aggbug/84873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-12-01 15:59 <a href="http://www.blogjava.net/baoyaer/articles/84873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简说Log4J</title><link>http://www.blogjava.net/baoyaer/articles/83050.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 23 Nov 2006 07:15:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/83050.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/83050.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/83050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/83050.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/83050.html</trackback:ping><description><![CDATA[
		<p style="BACKGROUND: white; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial"> Log4j </span>
						<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">
								<font face="宋体">框架是用</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">Java </span>
						<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">
								<font face="宋体">语言编写的标准日志记录框架。作为</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">Jakarta </span>
						<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">
								<font face="宋体">项目的一部分，</font>
						</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">
								<font face="宋体">以速度和灵活性为中心概念：</font>
						</span>
						<font color="#000000">
								<span style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: Arial">
								</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: verdana ,arial ,sans-serif">
										<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
										<o:p>
										</o:p>
								</span>
						</font>
				</span>
		</p>
		<p style="BACKGROUND: white">
				<font color="#000000">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">        Log4j</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">
								<font face="宋体">由三个重要的部件构成：记录器（</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">Loggers</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">
								<font face="宋体">）、输出源（</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">Appenders</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">
								<font face="宋体">）和布局（</font>
						</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">Layouts</span>
				</font>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">
						<font face="宋体">
								<font color="#000000">）。<br /></font>
						</font>
				</span>
		</p>
		<p style="BACKGROUND: white">
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">    记录器按照布局中指定的格式把日志信息写入一个或多个输出源。输出源可以是控制台、文本文件、</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">XML</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">文件或</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">Socket</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">，甚至还可以把信息写入到</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">Windows</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">事件日志或通过电子邮件发送。我们可以通过配置文件来部署这些组件。<br /><br />    Log4j提供两种配置方法： 代码配置和文件配置<br /><br /></span>
		</p>
		<p style="BACKGROUND: white; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">    Log4j</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">允许程序员定义多个记录器，每个记录器有自己的名字。但有一个记录器叫根记录器，它永远存在，且不能通过名字检索或引用，在配置文件中，可以如下定义根记录器<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial"></span></span>
		</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: #000000">log4j.rootLogger </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> [ level ] , appenderName, appenderName, … </span>
		</div>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">
				<o:p>
				</o:p>
		</span>
		<p style="BACKGROUND: white">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">             Level</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">是记录器的级别，它是日志记录的优先级，分为</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">OFF</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">FATAL</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">ERROR</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">WARN</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">INFO</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">DEBUG</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">ALL</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">或者您定义的级别。</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">Log4j</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">建议只使用四个级别：</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">ERROR</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">WARN</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">INFO</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">、</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">DEBUG</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">：    <br /><span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">右边的级别比左边的高。如果一条</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">log</span><span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">信息的级别，大于等于记录器的级别值，那么记录器就会记录它。例如</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">level</span><span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">被设置为</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">INFO</span><span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">级别，那么应用程序中所有的</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">DEBUG</span><span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">的日志信息将不被打印出来。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。<br /><br /><br /><br /><br /></span></span>
		</p>
		<p style="BACKGROUND: white">
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">     日志信息输出源</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">Appender<br />           log4j </span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">还允许日志记录请求打印到多个输出目的地，按</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">log4j </span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">的叫法是输出源。一个记录器可以有多个输出源。一条</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">log</span>
				<span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">信息如果可被这个记录器处理，则该记录器会把这条信息送往每个它所拥有的输出源，以及层次结构中更高级的输出源。例如，根记录器以控制台作为输出源，则所有可被纪录的日志都将至少打印到控制台。</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: verdana ,arial ,sans-serif">
						<o:p>
						</o:p>
				</span>
		</p>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: Arial">
				<o:p>
				</o:p>
		</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: #222222; FONT-FAMILY: verdana ,arial ,sans-serif">
				<o:p>
				</o:p>
		</span>
		<p style="BACKGROUND: white">
				<br />
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000"># For JBoss: Avoid to setup Log4J outside $JBOSS_HOME</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">server</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #0000ff">default</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">deploy</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">log4j.xml</span>
				<span style="COLOR: #000000">!</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># log4j.rootLogger</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">INFO, stdout, logfile          <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.rootLogger</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">INFO, stdout                 <font color="#008000">//配置根记录器<br /><br /><p style="BACKGROUND: white"><span style="FONT-SIZE: 10.5pt; COLOR: #222222; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">配置日志信息输出源，其语法为:</span></p></font><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.stdout</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">org.apache.log4j.ConsoleAppender                <font color="#008000">       //控制台<br /></font><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.stdout.layout</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">org.apache.log4j.PatternLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.stdout.layout.ConversionPattern</span>
				<span style="COLOR: #000000">=%</span>
				<span style="COLOR: #000000">d </span>
				<span style="COLOR: #000000">%</span>
				<span style="COLOR: #000000">p [</span>
				<span style="COLOR: #000000">%</span>
				<span style="COLOR: #000000">c] </span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">%</span>
				<span style="COLOR: #000000">m</span>
				<span style="COLOR: #000000">%</span>
				<span style="COLOR: #000000">n<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" />log4j.appender.logfile</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">org.apache.log4j.RollingFileAppender                <font color="#008000">//文件大小到一定就会产生一个新的文件</font><font size="3"><span lang="EN-US" style="FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">  </span></font><span lang="EN-US" style="FONT-FAMILY: verdana ,arial ,sans-serif; mso-bidi-font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><o:p></o:p></span><br /><img id="Codehighlighter1_515_525_Open_Image" onclick="this.style.display='none'; Codehighlighter1_515_525_Open_Text.style.display='none'; Codehighlighter1_515_525_Closed_Image.style.display='inline'; Codehighlighter1_515_525_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_515_525_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_515_525_Closed_Text.style.display='none'; Codehighlighter1_515_525_Open_Image.style.display='inline'; Codehighlighter1_515_525_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />log4j.appender.logfile.File</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">$</span>
				<span id="Codehighlighter1_515_525_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_515_525_Open_Text">
						<span style="COLOR: #000000">{espc.root}</span>
				</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">WEB</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">INF</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">espc.log              <font color="#008000"> //指定记录文件的位置   <br /></font><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.logfile.MaxFileSize</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">512KB                                  <font color="#008000"> //文件最大限制<br /></font><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># Keep three backup files. <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.logfile.MaxBackupIndex</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># Pattern to output: date priority [category] </span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000"> message<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.logfile.layout</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">org.apache.log4j.PatternLayout                 <font color="#008000">//文件的布局<br /></font><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.logfile.layout.ConversionPattern</span>
				<span style="COLOR: #000000">=%</span>
				<span style="COLOR: #000000">d </span>
				<span style="COLOR: #000000">%</span>
				<span style="COLOR: #000000">p [</span>
				<span style="COLOR: #000000">%</span>
				<span style="COLOR: #000000">c] </span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">%</span>
				<span style="COLOR: #000000">m</span>
				<span style="COLOR: #000000">%</span>
				<span style="COLOR: #000000">n        <font color="#008000">  # %d{}:日志信息产生时间      # %p:日志信息级别 # %c:日志信息所在地（类名）<br />                                                                                                                                                       # %m:产生的日志具体信息# %n:输出日志信息换 行      <br /></font>                                                                                                                                                                                                              </span>
		</div>
		<p style="BACKGROUND: white"> </p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/83050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-11-23 15:15 <a href="http://www.blogjava.net/baoyaer/articles/83050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VO(DTO)与PO(DAO)之间的转换 </title><link>http://www.blogjava.net/baoyaer/articles/82780.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 22 Nov 2006 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/82780.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: PO即 Persistence ObjectVO即 Value Object		VO和PO的主要区别在于：　　VO是独立的Java Object。　　PO是由Hibernate纳入其实体容器（Entity Map）的对象，它代表了与数据库中某条记录对应的Hibernate实体，PO的变化在事务提交时  将 反应到实际数据库中。		　实际上，这个VO被用作Data Transfer Obje...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/82780.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/82780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-11-22 15:22 <a href="http://www.blogjava.net/baoyaer/articles/82780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jakarta Commons(转) </title><link>http://www.blogjava.net/baoyaer/articles/82714.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 22 Nov 2006 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/82714.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在http://www.dingl.com/转来的Jakarta Commons是Jakarta的子项目，它创建和维护着许多独立软件包，这些包一般与其他框架或产品无关，其中收集了大量小型、实用的组件，大部分面向服务器端编程。 　　Commons的包分成两部分：Sandbox，Commons代码库。Sandbox是一个测试平台，用来检验各种设想、计划。本文介绍的组件属于Commons代码库，文章将展...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/82714.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/82714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-11-22 11:23 <a href="http://www.blogjava.net/baoyaer/articles/82714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>