﻿<?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-鸟不生蛋蛋的地方-随笔分类-自制土器</title><link>http://www.blogjava.net/zqc/category/10817.html</link><description>写写一些自己对于java的体会</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 20:21:23 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 20:21:23 GMT</pubDate><ttl>60</ttl><item><title>关于getParameterNames()</title><link>http://www.blogjava.net/zqc/archive/2006/06/18/53546.html</link><dc:creator>鸟不生蛋蛋的地方</dc:creator><author>鸟不生蛋蛋的地方</author><pubDate>Sat, 17 Jun 2006 20:51:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2006/06/18/53546.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/53546.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2006/06/18/53546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/53546.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/53546.html</trackback:ping><description><![CDATA[前2天写代码时候发现,HttpServletRequest的getParameterNames() 方法返回的Enumeration相对于页面参数的物理顺序刚好是相反的,所以实现@ToList标签时候需要先用一个Stack来对所有参数进行反转.不知tomcat在这个api方法上是怎么实现的,为什么就倒过来。c语言函数可以根据不同的call类型来指定不同的压栈的顺序，莫非这个惯例也被用到servlet里面来了，挺有意思的东西，看来需要留意一下。<img src ="http://www.blogjava.net/zqc/aggbug/53546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">鸟不生蛋蛋的地方</a> 2006-06-18 04:51 <a href="http://www.blogjava.net/zqc/archive/2006/06/18/53546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Waterfall framework 开发日志</title><link>http://www.blogjava.net/zqc/archive/2006/05/24/47845.html</link><dc:creator>鸟不生蛋蛋的地方</dc:creator><author>鸟不生蛋蛋的地方</author><pubDate>Wed, 24 May 2006 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2006/05/24/47845.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/47845.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2006/05/24/47845.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/47845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/47845.html</trackback:ping><description><![CDATA[
		<p>TODO:<br />继续测试和改进,不满意的地方:@ToSession标签<br /><br />更新日志:<br /><br />2006-06-18 增加和改进 @ToList 标签,用来修饰一个参数为java.util.List&lt;T&gt;的setter方法 <br />2006-05-23 增加 VelocityView接口,方便velocity视图调用.<br />2006-05-23 增加 WebParam接口,封装掉request和response以及ServletContext</p>
		<p>2006-05-22 增加 5.1 初始化 velocity <br />2006-05-21 增加 4.1 - 4.2 HttpSession操作<br /><br /><br />更新note:<br />1.HttpServletRequest的<a href="file:///D:/jakarta-tomcat-4.1.30/servlet%20api/javax/servlet/ServletRequest.html#getParameterNames()"><strong><font face="Courier New">getParameterNames</font></strong></a><font face="Courier New">()</font> 方法返回的Enumeration相对于页面参数的物理顺序刚好是相反的,所以实现@ToList标签时候需要先用一个Stack来对所有参数进行反转.不知tomcat在这个api方法上是怎么实现的,为什么就倒过来。c语言函数可以根据不同的call类型来指定不同的压栈的顺序，莫非这个惯例也被用到servlet里面来了，挺有意思的东西，看来需要留意一下。<br /></p>
		<p>问题和解决方式:<br /><br />1.关于@ToSession标签.如果是登陆的话,那么就有个判断条件决定某个login token是否应该被加到session中,这时候可以在@ToSession标记的getter方法中加入逻辑判断,来决定返回一个token实体或者null(这样做有点古怪..).<br /><br />2.路径的问题.比如一个<a href="http://host/logic/bbs/admin/ListUsers.wff">http://host/logic/bbs/admin/ListUsers.wff</a> 摸版的相关资源目录(比如,图片,css,js等)就必须存在webproject/bbs/admin响应的目录下,有点像struts的多模块.<br /><br />开始:<br /><br />Ruby on Rails有个设计思想是用编码规定代替繁琐的配置文件。jvm平台已经有一些类似ror的实现，比如<br />grails(<a href="http://docs.codehaus.org/display/GRAILS/2006/03/29/Groovy+on+Rails+(Grails)+0.1+Released">http://docs.codehaus.org/display/GRAILS/2006/03/29/Groovy+on+Rails+(Grails)+0.1+Released</a>)</p>
		<p>虽然由于java自身的局限，它很难做出像ruby或者groovy那样动态语言那样随心所欲的动作，但是利用它的运行时反射、动态代理等特性来尽可能实现“用编码规定代替繁琐的配置文件”这一思想。<br />下面转入正题。</p>
		<p>ServletAPI对HTTP协议进行了封装,通过配置Web.xml来把不同的请求转发给不同的servlet来处理。Web框架则用一个ActionServlet，根据自己的对Action的定义来转发请求。<br />抛开那些繁琐的配置文件，设想一下这样一种方法:</p>
		<p>1.Web动作的处理和响应</p>
		<p>假设这样一个POST请求:</p>
		<p>  &lt;form action="logic/group/NewTopic.wff" method="post"&gt;</p>
		<p>Web动作实现Bean:<br />   org.qqsns.web.logic.group.NewTopic   <br />注意后面的logic/group/NewTopic和logic.group.NewTopic, 动作类和Web动作是通过请求路径和包名相互关联。<br />这样，对Web动作的响应就依赖于编译期的代码的组织结构而不是执行期的配置文件。这样的好处是避免了维护繁琐的配置文件,特别是在没有IDE支持的情况下。</p>
		<p>org.qqsns.web.logic.group.NewTopic类是一个实现net.wff.servlet.WebAction接口的POJO，下面是NewTopic中execute的方法片段:   <br /> <br /> //Only method must be implemented for interface net.wff.servlet.WebAction<br /> public String execute(WebParam param, VelocityView view)<br /> throws ServletException, IOException{<br />  ...<br />  //return "redirect /success.html";  //请求重定向<br />  return "/success.jsp";              //请求转发<br />}<br />execute方法的返回值手动指定了一个转发或重定向的路径。</p>
		<p>2.输入验证</p>
		<p>普通的Web框架都带数据输入验证功能,一般复杂程度和功能强大与否成正比。<br />这里简单地要求从setter方法里抛出一个包含验证信息的异常，以此来实现输入异常处理。<br />       <br />普通setter方法<br />public void setName(String name){ <br />  this.name = name;<br />}</p>
		<p>添加输入验证后的setter方法</p>
		<p>public void setName(String name) throws InputException{    <br /> if(name.length()&lt;3)<br />    throw new InputException("Topic name must has a length greater than 3"); <br />  this.name = name;<br />}</p>
		<p>在WaterFallServlet如何中处理验证信息:</p>
		<p>    WebAction wa = <br />    (WebAction)Class.forName(classPath).newInstance();<br />          //procces forwarding<br />          try {<br />    ActionHelper.setProperties(request,wa);<br />   } catch (InputException e) {<br />    //return to input view<br />    //header:referer<br />    String rtn = request.getHeader("referer");<br />    //clear old errors<br />    if(rtn.indexOf("?")!=1){<br />     rtn = rtn.substring(0,rtn.indexOf("?"));<br />    }<br />    rtn=rtn+"?error="+URLEncoder.encode(e.getMessage(),"UTF-8");<br />    response.sendRedirect(rtn);<br />    return;<br />   }</p>
		<p>这样验证信息通过请求参数传回到输入页面.</p>
		<p>3.数据绑定</p>
		<p>假设有这样的html输入:</p>
		<p>    &lt;input type="text" name="name"/&gt;<br />    &lt;input type="text" name="number"/&gt;<br />    &lt;input type="text" name="price"/&gt;<br />    <br /> 下面是NewTopic中execute的方法全部:   <br /> <br /> public String execute(WebParam param, VelocityView view)<br /> throws ServletException, IOException{<br />  System.out.println(getName());<br />  System.out.println(getNumber());<br />  System.out.println(getPrice());<br />  System.out.println(getLength());<br />  return "/success.html";<br />}<br />    <br />自动从request注入parameter,这也是Struts DynamicActionForm的好处之一。<br />不过这里实现更类似多了类型转换的&lt;jsp:setProperty name="bean" property="*"/&gt;<br />因为Name的类型是String,Number的类型是Integer,Price的类型是float,length的类型是double.至于其他复杂的类型,也许jsf的转换器是个更好的主意。<br />这样就初步解决了数据的输入绑定和验证。余下的就是业务逻辑的问题。</p>
		<p>4.如何操作Session中的信息<br /> <br /> 获取session中的信息:</p>
		<p>  @FromSession(<br />     sessionKey=User.key<br />     )<br /> public void setCurrentUser(String currentUser) {<br />  this.currentUser = currentUser;<br /> }</p>
		<p> 信息保存到session中: </p>
		<p>  @ToSession(<br />      sessionKey = User.key  <br />    )<br /> public String getName() {<br />  if(login())return name;<br />  else return null;<br /> }</p>
		<p> 这2个方法定义在WebAction的实现类中。<br /> 框架在execute()之前执行@FromSession动作，在execute()之后执行@ToSession动作。<br /> 这里使用了annotation,所以要求必须是jdk5.0以上版本.<br /> <br /> 5.1 Velocity<br />  waterfall启动时候自动在WEB-INF目录下寻找并初始化Velocity.properties文件<br /> 操作:<br /> public String execute(WebParam param, VelocityView view)<br /> throws ServletException, IOException{<br />  view.addElement("msg","Hello");<br />  view.go("index.vm");<br />  return null;<br />}<br /><br /></p>
<img src ="http://www.blogjava.net/zqc/aggbug/47845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">鸟不生蛋蛋的地方</a> 2006-05-24 16:58 <a href="http://www.blogjava.net/zqc/archive/2006/05/24/47845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个WEB框架功能的分析:用编码规定代替配置文件</title><link>http://www.blogjava.net/zqc/archive/2006/05/17/waterfallframeworkintro.html</link><dc:creator>鸟不生蛋蛋的地方</dc:creator><author>鸟不生蛋蛋的地方</author><pubDate>Wed, 17 May 2006 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2006/05/17/waterfallframeworkintro.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/46608.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2006/05/17/waterfallframeworkintro.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/46608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/46608.html</trackback:ping><description><![CDATA[
		<p>
				<strong>R</strong>uby on Rails有个设计思想是:<strong>用编码规定代替繁琐的配置文件</strong>。jvm平台已经有一些类似ror的实现，比如<br />grails:<a href="http://docs.codehaus.org/display/GRAILS/2006/03/29/Groovy+on+Rails+(Grails)+0.1+Released">http://docs.codehaus.org/display/GRAILS/2006/03/29/Groovy+on+Rails+(Grails)+0.1+Released</a><br /><br />虽然由于java自身的局限，它很难做出像ruby或者groovy那样动态语言那样随心所欲的动作，但是利用它的运行时反射、动态代理等特性来尽可能体现“用编码规定代替繁琐的配置文件”这一思想。下面就转入正题。</p>
		<p>ServletAPI对HTTP协议进行了封装,通过配置Web.xml来把不同的请求转发给不同的servlet来处理。Web框架则用一个ActionServlet，根据自己的对Action的定义来转发请求。<br />抛开那些繁琐的配置文件，设想一下这样一种方法:</p>
		<p>
				<strong>1.Web动作的处理和响应</strong>
		</p>
		<p>假设这样一个POST请求:</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 </span>
				<span style="COLOR: #ff0000">action</span>
				<span style="COLOR: #0000ff">="logic/group/NewTopic"</span>
				<span style="COLOR: #ff0000"> method</span>
				<span style="COLOR: #0000ff">="post"</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p>Web动作实现Bean:</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">org.qqsns.web.logic.group.NewTopic</span>
		</div>
		<p>注意后面的<em>logic/group/NewTopic</em>和<em>logic.group.NewTopic</em>, 动作类和Web动作是通过请求路径和包名相互关联。<br />这样，对Web动作的响应就依赖于<strong>编译期的代码的组织结构</strong>而不是<strong>执行期的配置文件</strong>。这样的好处是避免了维护繁琐的配置文件,特别是在没有IDE支持的情况下。</p>
		<p>org.qqsns.web.logic.group.NewTopic类是一个实现net.wff.servlet.WebAction接口的POJO，下面是NewTopic中execute的方法片段:   </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">//</span>
				<span style="COLOR: #008000">Only method must be implemented for interface net.wff.servlet.WebAction</span>
				<span style="COLOR: #008000">
						<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"> String execute(HttpServletRequest request, HttpServletResponse response)<br /><img id="Codehighlighter1_192_291_Open_Image" onclick="this.style.display='none'; Codehighlighter1_192_291_Open_Text.style.display='none'; Codehighlighter1_192_291_Closed_Image.style.display='inline'; Codehighlighter1_192_291_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_192_291_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_192_291_Closed_Text.style.display='none'; Codehighlighter1_192_291_Open_Image.style.display='inline'; Codehighlighter1_192_291_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">throws</span>
				<span style="COLOR: #000000"> ServletException, IOException</span>
				<span id="Codehighlighter1_192_291_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_192_291_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <img src="http://www.blogjava.net/images/dot.gif" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">return "redirect /success.html";  </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">  </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">/success.jsp</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;              </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">请求转发</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />
						</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>
		</div>
		<p> execute方法的返回值手动指定了一个转发或重定向的路径。</p>
		<p>
				<strong>2.输入验证</strong>
		</p>
		<p>普通的Web框架都带数据输入验证功能,一般复杂程度和功能强大与否成正比。<br />这里简单地要求从setter方法里抛出一个包含验证信息的异常，以此来实现输入异常处理。<br />       <br />普通setter方法</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_32_55_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_55_Open_Text.style.display='none'; Codehighlighter1_32_55_Closed_Image.style.display='inline'; Codehighlighter1_32_55_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_32_55_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_55_Closed_Text.style.display='none'; Codehighlighter1_32_55_Open_Image.style.display='inline'; Codehighlighter1_32_55_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"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> setName(String name)</span>
				<span id="Codehighlighter1_32_55_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_32_55_Open_Text">
						<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">this</span>
						<span style="COLOR: #000000">.name </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> name;<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>
		<p>添加输入验证后的setter方法</p>
		<p>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_54_179_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_179_Open_Text.style.display='none'; Codehighlighter1_54_179_Closed_Image.style.display='inline'; Codehighlighter1_54_179_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_54_179_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_54_179_Closed_Text.style.display='none'; Codehighlighter1_54_179_Open_Image.style.display='inline'; Codehighlighter1_54_179_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"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> setName(String name) </span>
				<span style="COLOR: #0000ff">throws</span>
				<span style="COLOR: #000000"> InputException</span>
				<span id="Codehighlighter1_54_179_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_54_179_Open_Text">
						<span style="COLOR: #000000">{    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(name.length()</span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">3</span>
						<span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">throw</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> InputException(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Topic name must has a length greater than 3</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">this</span>
						<span style="COLOR: #000000">.name </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> name;<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>WaterFallServlet是如何处理验证信息的:</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">WebAction wa </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    (WebAction)Class.forName(classPath).newInstance();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">procces forwarding</span>
				<span style="COLOR: #008000">
						<br />
						<img id="Codehighlighter1_116_165_Open_Image" onclick="this.style.display='none'; Codehighlighter1_116_165_Open_Text.style.display='none'; Codehighlighter1_116_165_Closed_Image.style.display='inline'; Codehighlighter1_116_165_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_116_165_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_116_165_Closed_Text.style.display='none'; Codehighlighter1_116_165_Open_Image.style.display='inline'; Codehighlighter1_116_165_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #000000">          </span>
				<span style="COLOR: #0000ff">try</span>
				<span style="COLOR: #000000"> </span>
				<span id="Codehighlighter1_116_165_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_116_165_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    ActionHelper.setProperties(request,wa);<br /><img id="Codehighlighter1_192_505_Open_Image" onclick="this.style.display='none'; Codehighlighter1_192_505_Open_Text.style.display='none'; Codehighlighter1_192_505_Closed_Image.style.display='inline'; Codehighlighter1_192_505_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_192_505_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_192_505_Closed_Text.style.display='none'; Codehighlighter1_192_505_Open_Image.style.display='inline'; Codehighlighter1_192_505_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />   }</span>
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">catch</span>
				<span style="COLOR: #000000"> (InputException e) </span>
				<span id="Codehighlighter1_192_505_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_192_505_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">return to input view<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">header:referer</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    String rtn </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> request.getHeader(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">referer</span>
						<span style="COLOR: #000000">"</span>
						<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">clear old errors</span>
						<span style="COLOR: #008000">
								<br />
								<img id="Codehighlighter1_339_391_Open_Image" onclick="this.style.display='none'; Codehighlighter1_339_391_Open_Text.style.display='none'; Codehighlighter1_339_391_Closed_Image.style.display='inline'; Codehighlighter1_339_391_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_339_391_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_339_391_Closed_Text.style.display='none'; Codehighlighter1_339_391_Open_Image.style.display='inline'; Codehighlighter1_339_391_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(rtn.indexOf(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">?</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">)</span>
						<span style="COLOR: #000000">!=</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">)</span>
						<span id="Codehighlighter1_339_391_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_339_391_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     rtn </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> rtn.substring(</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,rtn.indexOf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">?</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" />    rtn</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">rtn</span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">?error=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000">URLEncoder.encode(e.getMessage(),</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">UTF-8</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    response.sendRedirect(rtn);<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" />
				</span>
		</div>
		<p>这样验证信息通过请求参数传回到输入页面.</p>
		<p>
				<strong>3.数据绑定</strong>
		</p>
		<p>假设有这样的html输入: </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">input </span>
				<span style="COLOR: #ff0000">type</span>
				<span style="COLOR: #0000ff">="text"</span>
				<span style="COLOR: #ff0000"> name</span>
				<span style="COLOR: #0000ff">="name"</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">input </span>
				<span style="COLOR: #ff0000">type</span>
				<span style="COLOR: #0000ff">="text"</span>
				<span style="COLOR: #ff0000"> name</span>
				<span style="COLOR: #0000ff">="number"</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">input </span>
				<span style="COLOR: #ff0000">type</span>
				<span style="COLOR: #0000ff">="text"</span>
				<span style="COLOR: #ff0000"> name</span>
				<span style="COLOR: #0000ff">="price"</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> 下面是NewTopic中execute的方法全部:   </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">public</span>
				<span style="COLOR: #000000"> String execute(HttpServletRequest request, HttpServletResponse response)<br /><img id="Codehighlighter1_117_282_Open_Image" onclick="this.style.display='none'; Codehighlighter1_117_282_Open_Text.style.display='none'; Codehighlighter1_117_282_Closed_Image.style.display='inline'; Codehighlighter1_117_282_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_117_282_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_117_282_Closed_Text.style.display='none'; Codehighlighter1_117_282_Open_Image.style.display='inline'; Codehighlighter1_117_282_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">throws</span>
				<span style="COLOR: #000000"> ServletException, IOException</span>
				<span id="Codehighlighter1_117_282_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_117_282_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  System.out.println(getName());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  System.out.println(getNumber());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  System.out.println(getPrice());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  System.out.println(getLength());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">/success.html</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>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>自动从request注入parameter,这也许是很多人喜欢Struts DynamicActionForm的原因之一。<br />不过这里实现更类似多了类型转换的&lt;jsp:setProperty name="bean" property="*"/&gt;<br />因为Name的类型是String,Number的类型是Integer,Price的类型是float,length的类型是double.至于其他复杂的类型,也许jsf的转换器是个更好的主意。<br />这样就初步解决了数据的输入绑定和验证。余下的就是业务逻辑的问题。WaterfallWebFramework源代码:<br /><a href="/Files/zqc/WaterfallWebFramework.rar">http://www.blogjava.net/Files/zqc/WaterfallWebFramework.rar</a> (<strong>只有一个配置文件,其中只有1行配置信息!</strong>)</p>
		<p>以上就是框架的主要功能。<strong>用编码规定代替配置文件</strong>，也许这会是一种更加高效率的开发方式。<br /></p>
<img src ="http://www.blogjava.net/zqc/aggbug/46608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">鸟不生蛋蛋的地方</a> 2006-05-17 13:12 <a href="http://www.blogjava.net/zqc/archive/2006/05/17/waterfallframeworkintro.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天给jails加了件外套,用swt写的.感觉还不错^_^</title><link>http://www.blogjava.net/zqc/archive/2006/05/06/44701.html</link><dc:creator>鸟不生蛋蛋的地方</dc:creator><author>鸟不生蛋蛋的地方</author><pubDate>Fri, 05 May 2006 16:27:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2006/05/06/44701.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/44701.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2006/05/06/44701.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/44701.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/44701.html</trackback:ping><description><![CDATA[今天给jails加了件外套<img height="19" src="http://www.blogjava.net/Emoticons/cake.gif" width="17" border="0" />,用swt写的.感觉还不错^_^<br />下载(附带eclipse的工程文件)  <a href="http://zqc53.512j.com/others/JailsReleaseWithEclipse.rar">http://zqc53.512j.com/others/JailsReleaseWithEclipse.rar</a><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/zqc/7370/r_Snap6.jpg" /><img src ="http://www.blogjava.net/zqc/aggbug/44701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">鸟不生蛋蛋的地方</a> 2006-05-06 00:27 <a href="http://www.blogjava.net/zqc/archive/2006/05/06/44701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jails:一个DAO代码生成工具</title><link>http://www.blogjava.net/zqc/archive/2005/12/20/jails.html</link><dc:creator>鸟不生蛋蛋的地方</dc:creator><author>鸟不生蛋蛋的地方</author><pubDate>Tue, 20 Dec 2005 04:12:00 GMT</pubDate><guid>http://www.blogjava.net/zqc/archive/2005/12/20/jails.html</guid><wfw:comment>http://www.blogjava.net/zqc/comments/24745.html</wfw:comment><comments>http://www.blogjava.net/zqc/archive/2005/12/20/jails.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zqc/comments/commentRss/24745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zqc/services/trackbacks/24745.html</trackback:ping><description><![CDATA[
		<a href="/Files/zqc/jails-1.03.rar ">
				<font color="#000000">http://www.blogjava.net/Files/zqc/jails-1.03.rar</font>
		</a>
		<br />
		<div style="OVERFLOW: hidden; WORD-BREAK: break-all; WORD-WRAP: break-word">做项目时候自己写的,类似ror的ActiveRecord,配置好数据库信息就可以根据表名直接生成数据库访问对象.更新到1.03版,有时间就继续完善:)</div>
		<!-- / message -->
		<!-- attachments -->
<img src ="http://www.blogjava.net/zqc/aggbug/24745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zqc/" target="_blank">鸟不生蛋蛋的地方</a> 2005-12-20 12:12 <a href="http://www.blogjava.net/zqc/archive/2005/12/20/jails.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>