﻿<?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-记忆好很大程度决定能力!-文章分类-struts</title><link>http://www.blogjava.net/microlab4321/category/24781.html</link><description>适时总结是一种很好的彌补方法!</description><language>zh-cn</language><lastBuildDate>Sat, 06 Oct 2007 00:39:14 GMT</lastBuildDate><pubDate>Sat, 06 Oct 2007 00:39:14 GMT</pubDate><ttl>60</ttl><item><title>Struts学习笔记(7)良好的大局观:J2EE设计模式</title><link>http://www.blogjava.net/microlab4321/articles/150350.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Thu, 04 Oct 2007 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/150350.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/150350.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/150350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/150350.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/150350.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>一.概述</p>
&nbsp;&nbsp; 设计模式是对重复出现的问题的一种可以重用的解决方法,其本质其实是解偶.<br />
&nbsp; 1.J2EE应用模型的分层 (1)服务器端业务逻辑<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)服务器端表示层<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)客户端表示层<br />
&nbsp; 2.J2EE的设计模式&nbsp;&nbsp;&nbsp;(1)表示层体系结构模式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)表示层高级体系结构模式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3)表示层伸缩性模式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (4)业务层模式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(5)数据传递模式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (6)数据库模式<br />
<br />
二.详解<br />
&nbsp; 1.表示层体系结构模式<br />
&nbsp;&nbsp; 1.1前端控制模式<br />
&nbsp; &nbsp; 通过创建统一而且集中的组建来执行公共的任务,在J2EE的功能是截取所有的请求,并根据选择利用这个前端控制器将请求转发到一个页面控制器,页面控制器解析用户的请求,选择具体的业务逻辑,并根据结果转到页面视图<br />
&nbsp;&nbsp; 一个Servlet可以作为一个前端控制器,也可以作为一个页面控制器,这个servlet调用请求所应该执行的业务逻辑,并根据业务逻辑的结果返回到具体的显示页面..<br />
<br />
&nbsp; 1.1.1.Struts框架前端模式的实现<br />
&nbsp;&nbsp; Actionservlet是Struts框架的主要Servlet,所有请求都会通过它.在ActionServelt中,它会处理如下工作<br />
&nbsp; 1)ActionServelt调用RequestProcessor的Process方法处理公共任务<br />
&nbsp; 2)RequestProcessor得到请求对应的Action处理请求的具体工作<br />
&nbsp;&nbsp; 在RequestProcessor的process方法中最后会调用ProcessActionPerform方法,这就是一个命名模式的实现,将具体请求的工作分配到Action<br />
<br />
&nbsp; 1.2.1MVC模式<br />
&nbsp;&nbsp;&nbsp; 这个模式是Struts框架所遵循的模式,利用Model2构架来解偶,它在J2EE的工能为根据视图层,控制层和模型层3层的不同功能实现各层任务.<br />
&nbsp;&nbsp;&nbsp; (1) 视图层提供显示页面的功能.<br />
&nbsp;&nbsp;&nbsp; (2)控制器层则接收用户输入,并转到模型层来处理结果<br />
&nbsp;&nbsp;&nbsp;&nbsp;(3)模型层处理业务逻辑在选择视图层的显示页面来完成工作<br />
&nbsp;&nbsp;&nbsp; 常见如下<br />
&nbsp;&nbsp; *Struts框架的实现<br />
&nbsp;&nbsp; *JeanBean或者EJB模型层,JSP或者HTML作为视图层,Servelt作为控制器<br />
&nbsp;<br />
1.2.2装饰模式<br />
&nbsp;&nbsp;&nbsp; 该模式或为客户端提供一个透明的扩充某实例功能的方法.该方法的返回类型就是这个实例,在客户端不断调用这个方法的同时,该实例的内部表象已经随着功能改变完全不同了.<br />
&nbsp;&nbsp;&nbsp; J2EE设计模式中的"装饰模式"<br />
&nbsp;&nbsp; servelt本身就是支持装饰器模式,它的表现是装饰一个request请求,利用装饰器类截获所有发送给目标对象的请求,并执行需要的工作,完成工作之后再把请求转发到下一个装饰器,直到没有了装饰器,最后将请求发送到Servlet<br />
&nbsp;&nbsp; Servlet利用过滤器来拦截请求和响应.在请求到达Servelt前,为这个请求做一些额外处理.过滤器可以被看成一个程序,每个过滤器之间都能互相传递.<br />
&nbsp;&nbsp; 过滤器Filter接口代码:<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 alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Filter<br />
<img id="Codehighlighter1_24_322_Open_Image" onclick="this.style.display='none'; Codehighlighter1_24_322_Open_Text.style.display='none'; Codehighlighter1_24_322_Closed_Image.style.display='inline'; Codehighlighter1_24_322_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_24_322_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_24_322_Closed_Text.style.display='none'; Codehighlighter1_24_322_Open_Image.style.display='inline'; Codehighlighter1_24_322_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_24_322_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_24_322_Open_Text"><span style="color: #000000">{<br />
<img alt="" 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">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init(FilterConfig&nbsp;filterconfig)&nbsp;throwsException<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">do&nbsp;Filter方法的FilterChain参数就是为了实现装饰器模式的必要条件</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;abstrat&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doFilter(ServletRequest&nbsp;serveltrequest,ServeltResponse&nbsp;servletsponse,FilterChain&nbsp;filterchain)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException,servletExcetpion;<br />
<img alt="" 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">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;destroy();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
Filter()对象十分重用,doFilter()方法最后会调用FilterChain对象的doFilter()方法,FilterChain对象的doFilter()方法会激活下一个相关的过滤器 <br />
<br />
&nbsp;一个过滤器<br />
&nbsp;&nbsp; 这个过滤器SetCharacterEncodingFilter被用在当request请求到达Servelt前,为request的参数信息的字符编码进行设定<br />
&nbsp;&nbsp; SetCharcterEncodingFilter.java(省略)<br />
<br />
配置过滤器如下:<br />
<div style="border-right: #cccccc 6px solid; padding-right: 5px; border-top: #cccccc 6px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 6px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 6px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" 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">Set&nbsp;character</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" 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">XXX.XXX.SetcharacterEncodingFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">声明过滤器的java实体名<br />
<img alt="" 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">/*表明了过滤器要传入的初始化方法*/<br />
<img alt="" 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"><br />
<img alt="" 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">UTF-8</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-valie</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" 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"><br />
<img alt="" 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></div>
<br />
&nbsp;&nbsp; 1.3.1表示层高级体系结构模式<br />
&nbsp;&nbsp;&nbsp; 1)复合视图模式(合成模式):提供一个树状的对象结构,树枝类与树叶类都实现同一个接口,以便客户端在调用任何对象时都只需要调用该树状结构的根接口就可以了<br />
&nbsp;&nbsp; 2) 复合视图在服务器端表示层使用,利用的合成模式的思想将视图的布局从视图中抽离出来,形成由一系列通用组件组成的模板<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把视图("岛航","页眉","页脚"和"主体")的集合,每个元素是一个结点,而每个元素也可以是一个容器,包含更多的子元素.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 模板可以被看成是接口,视图则可被看成树枝结点和树叶结点<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 id="Code_Closed_Image_130419" onclick="this.style.display='none'; Code_Closed_Text_130419.style.display='none'; Code_Open_Image_130419.style.display='inline'; Code_Open_Text_130419.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_130419" style="display: none" onclick="this.style.display='none'; Code_Open_Text_130419.style.display='none'; Code_Closed_Image_130419.style.display='inline'; Code_Closed_Text_130419.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Open_Text_130419" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="10"&nbsp;encoding="utf-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">views</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">view&nbsp;</span><span style="color: #ff0000">template</span><span style="color: #0000ff">="Template.jsp"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="page1"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">include&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="导航"</span><span style="color: #ff0000">&nbsp;url</span><span style="color: #0000ff">="navigation.jsp"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">include&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="页眉"</span><span style="color: #ff0000">&nbsp;url</span><span style="color: #0000ff">="header.jsp"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">include&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="主体"</span><span style="color: #ff0000">&nbsp;url</span><span style="color: #0000ff">="body1.jsp"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">include&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="页脚"</span><span style="color: #ff0000">&nbsp;url</span><span style="color: #0000ff">="footer.jsp"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">view</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">view&nbsp;</span><span style="color: #ff0000">template</span><span style="color: #0000ff">="Template2.jsp"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="page2"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">include&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="首页"</span><span style="color: #ff0000">&nbsp;url</span><span style="color: #0000ff">="template.jsp"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">view</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">views</span><span style="color: #0000ff">&gt;</span></span></div>
<br />
1.3.2视图助手模式<br />
&nbsp;&nbsp;&nbsp; 此模式避免视图过于特殊化,功能是使一组视图助手将模型数据转换成一种中间数据模式.视图或视图助手能够将中间数据模型转换成一种合适表达给用户的形式如"html""xml"<br />
&nbsp;&nbsp;&nbsp; (1)标签的工作方式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标签库用来帮助程序员通过简单的代码构造实现页面逻辑.一个标签应该继承javax.servlet.jsp.tagext.tagsupport,并给出doStartTag和doEndTag两个方法来实现<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doStartTag方法:在标签开始时由Jsp容器调用,通常在这个方法中实现业务逻辑<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doEndTag方法:在标签结束时由JSP容器调用,通常在这个方法控制输出.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)标签的实现<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下是Struts框架提供的ConditionalTagBas部分代码<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConditionalTagBas<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_43_226_Open_Image" onclick="this.style.display='none'; Codehighlighter1_43_226_Open_Text.style.display='none'; Codehighlighter1_43_226_Closed_Image.style.display='inline'; Codehighlighter1_43_226_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_43_226_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_43_226_Closed_Text.style.display='none'; Codehighlighter1_43_226_Open_Image.style.display='inline'; Codehighlighter1_43_226_Open_Text.style.display='inline';" alt="" 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">int</span><span style="color: #000000">&nbsp;doStartTag()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;JspException</span><span id="Codehighlighter1_43_226_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_43_226_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">doStartTag()表示标签开始</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(condition())<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">(EVAL_BODY_INCLUDE);<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">EVAL_BODY_INCLUDE告诉JSP容器标签正文的内容,并把这些内容送入输出流</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">(SKIP_BODY);<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">SKIP_BODY告诉JSP容器不要处理标签正文的内容</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_269_331_Open_Image" onclick="this.style.display='none'; Codehighlighter1_269_331_Open_Text.style.display='none'; Codehighlighter1_269_331_Closed_Image.style.display='inline'; Codehighlighter1_269_331_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_269_331_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_269_331_Closed_Text.style.display='none'; Codehighlighter1_269_331_Open_Image.style.display='inline'; Codehighlighter1_269_331_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;doEndTag()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;JspException</span><span id="Codehighlighter1_269_331_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_269_331_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">doEndTag()&nbsp;表示标签结束</span><span style="color: #008000"><br />
</span><span style="color: #008080">12</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">(EVAL_PAGE);<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">EVAL_PAGE标签处理完毕</span><span style="color: #008000"><br />
</span><span style="color: #008080">14</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000">}</span></span></div>
<p><br />
1.3.3服务工作模式<br />
&nbsp;&nbsp;&nbsp;&nbsp; 服务工作者模式将页面流转,前端控制模式,视图助手模式合在一起使用,表示"请求--转发--视图"的整套流程,服务器工作者模式也是MVC模式的实现标准,Struts框架本身基于这个模式实现</p>
<p>1.4&nbsp;&nbsp;表示层伸缩性模式<br />
&nbsp; 1.4.1异步页面模式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当远程数据发生变化时,将其缓存下来这个模式又被称为"发布者--订阅者--模型".功能是利用一个订阅者角色在一定的时间间隔或数据发生变化时接收来自发布者角色的数据,订阅者角色同时会利用模型层来更新数据库,常见的应用为,当发布服务器要显示最新信息的Html页面时,会利用一个订阅者角色我负责.<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 1.4.2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该模式可以缓存动态的页面,尽可能减少重复生成的页面,功能是利用一个缓存过滤器截获请求.判断该请求所返回的页面是否有缓存,如果它在缓存中,则以缓存的页面最高效地进行响应;如果没有可缓存数据,则执行随后的工作,缓存生成页面的结果,缓存过滤器应该被摆放在"装饰过滤器"和工作Servlet之前,该模式其实是装饰器模式的一种变体,常见为对HTTPServletResponse对象进行装饰来保存请求处理结果<br />
&nbsp;&nbsp;&nbsp; 1.4.3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 资源池模式 JDBC连接池<br />
&nbsp;&nbsp;&nbsp; 客户</p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/150350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-10-04 12:48 <a href="http://www.blogjava.net/microlab4321/articles/150350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts学习笔记(6)Validator框架</title><link>http://www.blogjava.net/microlab4321/articles/149349.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Fri, 28 Sep 2007 13:13:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/149349.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/149349.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/149349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/149349.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/149349.html</trackback:ping><description><![CDATA[&nbsp;1.Validator框架以声明的方式为应用程序配置已存在的检验规则,并允许程序员添加更多的检验规则.Validator框架能够被Struts框架很好地支持.也可以被独立出来使用.因此Validator框架和Struts框架是松散偶合.<br />
&nbsp; <br />
2.Validator框架由Validator检验类,Validator配置文件,资源配置文件和JSP标签库组成..<br />
&nbsp;(1).Validator检验类<br />
&nbsp;&nbsp;&nbsp;&nbsp; 该类是在进行检验类时所需要的一个java类.每一次检验的发生都会调用该检验类中的方法,该检验类的方法只针对一种检验规则,但是通过配置文件的声明,可以使检验类规则产生合作.组合成更复杂的检验规则.<br />
<br />
&nbsp;(2).Validator配置文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;Validator-rule.xml是检验规则配置文件,定义了应用程序中可以使用Validators检验规则.换句话就是将所有可用的检验规则声明在Validator-rule.xml中等待被调用.<br />
&nbsp;&nbsp; Validator.xml是具体检验配置文件,将Validator-rules,xml中的检验和应用结合起来的配置文件.他的名称并不一定是"validator.xml";可以自定义.甚至可以不用该文件而直接在Validator-rules.xml中指定具体检验.但为了降低偶合,还是应该分出该配置文件.<br />
&nbsp;(3).资源配置文件<br />
&nbsp;&nbsp; 该文件就是报错信息文件,是为了将检验的出错信息显示给客户端而使用的.就Struts框架和Validator框架协同工作来看,可以认为它就是Struts的resource 绑定所指定的资源配置文件.<br />
(4).JSP标签<br />
&nbsp; JSP用于读取资源配置文件中的报错信息显示出来.Strts框架中许多与资源配置文件相关的标签都实现了这种工能,另外,&lt;html:javascropt&gt;标签可以直接从validator框架中的validaotr-rulse.xml中得到javascrupt的检验结果. <br />
<br />
(2)Validator-rule.xml文件<br />
&nbsp;&nbsp; Validator框架是通过声明的方式,而不是编程的方式来调用检验规则,因此配置文件Validator-rules.xml十分重要,在Validator-rules.xml中讲检验类所实现的检验规则和声明表示衔接起来,提供声明实现<br />
&nbsp;&nbsp; Validator-rules.xml文件<br />
&nbsp; Validator框架是通过声明的方式,而不是编程的方式来调用检验规则.因此配置文件Validator-rules.xml十分重要,在Validator-rules.xml中将检验类所实现的检验规则和声明标识衔接起来,提供声明的实现.<br />
&nbsp;&nbsp; 简单的Validator-rules.xml<br />
<p>&lt;!DOCTYPE form-validation PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd"&gt;<br />
&lt;!--<br />
--&gt;</p>
<p>&lt;form-validation&gt;</p>
<p>&nbsp;&nbsp; &lt;global&gt;&nbsp;<span style="color: red"><span style="color: #0000ff">&nbsp;//所有检验规则的声明都被定义&lt;global&gt;元素下作为其子元素&nbsp;&nbsp;<br />
</span></span>&nbsp;&nbsp;&nbsp; &lt;validator name="required"<span style="color: #0000ff">//每个validator都代表一个检验规则,name属性是该检验规则的声明标识</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classname="org.apache.struts.validator.FieldChecks"<span style="color: #0000ff">//检验规则的实体类</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method="validateRequired"//<span style="color: #0000ff">检验类中的方法名,指定声明标识将调用该方法来进行检验</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; methodParams="java.lang.Object,//<span style="color: #0000ff">检验类所需要的传入参数</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.commons.validator.ValidatorAction,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.commons.validator.Field,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts.action.ActionErrors,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; javax.servlet.http.HttpServletRequest"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg="errors.required"&gt;//<span style="color: #0000ff">msg属性指定了报错信息在资源配置文件中的"键值",通过该"键值"从资源配置文件中找到该条报错信息,并显示出来.</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/validator&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;validator name="integer"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classname="org.apache.struts.validator.FieldChecks"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method="validateInteger"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; methodParams="java.lang.Object,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.commons.validator.ValidatorAction,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.commons.validator.Field,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts.action.ActionErrors,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; javax.servlet.http.HttpServletRequest"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depends=""<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg="errors.integer"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/validator&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;validator name="range"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classname="org.apache.struts.validator.FieldChecks"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method="validateIntRange"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; methodParams="java.lang.Object,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.commons.validator.ValidatorAction,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.commons.validator.Field,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts.action.ActionErrors,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; javax.servlet.http.HttpServletRequest"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depends="integer"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg="errors.range"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/validator&gt;<br />
&nbsp;&nbsp; &lt;/global&gt;<br />
&lt;/form-validation&gt;<br />
3个&lt;validator&gt;元素的校验规则<br />
*校验值是否不为空或不为null<br />
*校验值是否可以安全转换为integer型<br />
*校验该校验值的范围是否在最大和最小值之间<br />
<br />
&lt;validator&gt;元素还有其他属性来帮助实现其他功能<br />
name属性为range的&lt;validator&gt;元素拥有depends属性,并指定属性的内容为"integer"<br />
depends属性的含义是:本&lt;validator&gt;校验规则必须依赖另一个检验规则而实现.换句话说,就是必须先校验depends属性所指定的&lt;validator&gt;检验规则,通过后才会校验自身规则.depends属性的内容应该是另一组&lt;validator&gt;校验规则的声明.<br />
&nbsp; <br />
(2)2<br />
validator.xml文件<br />
&nbsp; 该文件是将validator-rules.xml中的校验和应用程序结合起来的配置文件,有了validator-rule.xml后,只要通过validator,.xml将它与具体校验逻辑结合,就能完成真正的具体校验<br />
&nbsp; 结合validator.xml的ActionForm<br />
validator框架的ActionForm<br />
package struts.sample.cap5.sample.form;<br />
import org.apache.struts.validator.ValidatorForm;<br />
public class CheckForm extends ValidatorForm{//不能继承普通的ActionForm,必须继承自ValidatorForm或ValidatorActionForm.若是动态ActionForm,则需要继续于DynaValidatorFor或DynaValidatorActionForm<br />
private sring userName;<br />
private int age;<br />
private string email;<br />
private string password;<br />
public String getUserName(){<br />
return userName;<br />
}<br />
public String getUserName(){<br />
return userName;<br />
}<br />
public void setUserName(String userName){<br />
this.userName=userName;<br />
}<br />
public int getAge(){<br />
return age;<br />
}<br />
public void setAge(int age){<br />
this.age=age;<br />
}<br />
public String getEmail(){<br />
return email;<br />
}<br />
public void setEmail(string email){<br />
this.email=email;<br />
}<br />
public String getPassWord(){<br />
return password;<br />
}<br />
public void setPassword(String password){<br />
this.password=password;<br />
}<br />
}<br />
*ValidatorForm(或DynaValidatorFor)将根据surut-config.xml文件中&lt;action&gt;的name属性,为当前ActionForm调用相应的校验规则,这在validator.xml中可以看到<br />
*ValidatorActionForm(或DynaValidatorActionForm)使用struts-config.xml中&lt;action&gt;的path属性,为当前ActionForm调用相应的检验规则.<br />
<br />
</p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/149349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-09-28 21:13 <a href="http://www.blogjava.net/microlab4321/articles/149349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts学习笔记(5)Struts国际化</title><link>http://www.blogjava.net/microlab4321/articles/147822.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 24 Sep 2007 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/147822.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/147822.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/147822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/147822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/147822.html</trackback:ping><description><![CDATA[<p>一国际化与本地化<br />
&nbsp;&nbsp; 1.国际化的含义:<br />
&nbsp;&nbsp;&nbsp;&nbsp; 就是让一个程序在不同语系的操作系统之间能够有不同的显示,所谓不同显示的含义就是:语言的不同,语法的不同,数字.日期.排序以及货币格式的不同.<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 2.本地化的含义<br />
&nbsp;&nbsp;&nbsp; 本地化相对于国际化来说,所涵盖的范围小得多,它指为单一一个操作系统提供符合的语言环境。比喻直接将英文软件转化为中文软件就是本地化的一种。国际化是泛指，本地化是单一指定。<br />
<br />
二认识编码<br />
&nbsp;&nbsp; 1.UNICODE是微软所提出的多字节等长码，它可以使双字节既可以表示英文字母，也可以表示汉字。表示英文字母的等长码时，对其第一个字节进行补充动作。<br />
&nbsp;&nbsp; java语言默认的编码就是UNICODE；通常被国际化组织认可，用双字节表示的中文中，针对Struts的国际化主要是UNICODE.<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; 2.Struts中国际化的步骤：<br />
&nbsp;&nbsp; UTF-8编码就是以UNICODE编码的储存方式来表示的，它是Struts国际化的好帮手，它已经包含了英文字母的显示。<br />
&nbsp;&nbsp; (1).指定程序编码和编译时的字符编码为UTF-8<br />
&nbsp;&nbsp;&nbsp;(2).指定请求到来时的字符编码为UTF-8<br />
&nbsp;&nbsp; (3).在JSP的头部声明中也要出现UTF-8声明<br />
&nbsp;&nbsp; (4).对任何外部资源配置文件的编写都使用UTF-8<br />
<br />
三.Resource绑定<br />
&nbsp; 1.在Struts-config.xml中,配置资源文件需要做如下步骤<br />
&nbsp; (1).从Struts-config.xml中找到"resource.application"<br />
&nbsp; (2).为应该确定本地化环境后缀<br />
&nbsp; (3).为本地化应用加上.properties扩展名<br />
&nbsp; (4).在classpath目录下找到resource目录下的本地应用资源配置文件.<br />
<br />
2.确定本地化后缀<br />
&nbsp; JSP发送请求到达ActionServlet时.request都会用一个request.getLcale()的方法返回java.util.Locale对象.这个Locale对象保存的就是本地化区域环境.Locale对象由JDK提供专门用来实现国际化工作.<br />
&nbsp; 在Struts框架中,与Locale对象配合"确定本地化环境后缀",会读取Locale对象的内容,并将它的语言和国家信息"_"产生一组字符串,追加到原来的文件名后.<br />
&nbsp;&nbsp; static public final Locale SIMPLFIED_CHINESE=new Locale("zh","CN");<br />
&nbsp;struts框架读取对象该对象后,产生的本地化环境后缀就是"application_zh_CN".再加上.properties的扩展名,那么在简体中文环境中,struts框架真正应该要读取得的资源配置文件其实应该是:application_zh_CN.properties</p>
<p>3.Locale对象<br />
&nbsp;&nbsp;&nbsp; 要动态改变Locale对象,就必须先确定Locale对象的读取在框架中是怎样进行的,Locale对象被保存在什么地方.<br />
&nbsp;&nbsp; Struts框架对于Locale对象的读取是通过Session来进行的程序开始进行时,Struts框架就已经将Locale对象的实例存放在Session中得到Locale对象,再得到合适的资源配置文件.<br />
&nbsp;&nbsp; 把本地化Local对象的实例存放在Session中.<br />
&nbsp;(1).存放本地化Locale对象到Session中是由Struts框架自行完成的..<br />
&nbsp;(2).Struts框架内容定义了GloBals类的静态全局变量,LOCALE_KEY,用来表示org,apache,struts.action.LOCALE;不应单独使用,而是存放Locale对象用Globals.LOCALE_KEY来代替<br />
<br />
</p>
 <img src ="http://www.blogjava.net/microlab4321/aggbug/147822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-09-24 15:49 <a href="http://www.blogjava.net/microlab4321/articles/147822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts学习笔记(4)Struts-config.xml详解</title><link>http://www.blogjava.net/microlab4321/articles/147444.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Sat, 22 Sep 2007 09:59:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/147444.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/147444.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/147444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/147444.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/147444.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;Struts-config.xml是struts框架的核心配置文件,其最基本的功能是用来配置Action和ActionForm,通知Struts框架完成传递和页面流转.<br />
&nbsp;&nbsp; 一.处理异常的exception和global-exception<br />
&nbsp;&nbsp; 在Web应用中,对异常处理位置都是业务逻辑失败的信息.因为异常处理还需要编写ActionErrors,给出报错信息将导致在Action会看到许多的ActionErrors的代码.<br />
&nbsp;&nbsp; struts解决了这个问题,它允许程序员配置任何异常,并且在将异常转化为报错信息的时候,不必须自行使用"try catch"来捕捉,写报错转发到出错页面.<br />
&nbsp;&nbsp; 1.局部异常<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就是针对一个Action响应所抛出的异常,该异常将只负责Action的程序段,并且自定义在&lt;action&gt;元素中.<br />
<br />
&nbsp;&nbsp; 局部异常的定义:<br />
&nbsp; &lt;action-mapping&gt;<br />
&nbsp;&nbsp; &lt;action<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input="SampleJsp.jsp"&nbsp;<span style="font-size: 8pt"><span style="font-size: 10pt"><span style="color: #0000ff"><span style="font-size: 8pt"><span style="font-size: 10pt">指定了SampleForm对象使用的ActionForrm对象名称,与form-bean元素定义的name属性一致</span></span></span><br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="SampleForm"&nbsp;&nbsp;<span style="font-size: 10pt; color: #0000ff">指定了SampleForm对象使用的ActionForm对象名称<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path="/SampleAction" <span style="font-size: 10pt; color: #0000ff">如果使用了SampleForm.do的响应,那么ActionServlet控制器组件就会自动找到本Action对象</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope="request"&nbsp;&nbsp;<span style="font-size: 10pt; color: #0000ff">&nbsp;使用ActionForm的范围<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="struts.sample.cap3.sample1.action.SampleAction"&nbsp; <span style="font-size: 10pt; color: #0000ff">解释本Action对象的路俓<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validate="false"&gt;&nbsp;&nbsp; <span style="font-size: 10pt; color: #0000ff">定义使用的ActionForm在Action是否需要检验<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;expetion<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key="userNameException"&nbsp; <span style="font-size: 10pt; color: #0000ff">指定了在资源配置文件中报错信息的键<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path="/SampleJsp.jsp"&nbsp;&nbsp;<span style="font-size: 10pt; color: #0000ff">&nbsp;指定了报错之后所转发到的JSP页面,在该页面中可以通过标签库来读取报错信息,并显示<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="struts.sample.cap3.sample1.exception.UserNameException"/&gt; <span style="font-size: 10pt; color: #0000ff">指定了该异常类的java实体名<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key="SampleJsp.jsp"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="java.sql.SQLException"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action-mappings&gt;<br />
<br />
&nbsp;2.全局异常<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指对所有定义在Struts-config.xml的Action程序都进行处理,他定义在&lt;global-exception&gt;元素中<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;global-exception&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; key="passWordException.jsp"<br />
&nbsp;&nbsp;&nbsp;&nbsp; path="SampleJsp.jsp"<br />
&nbsp;&nbsp;&nbsp;&nbsp; type="struts.sample.cap3.sample.exception.passWordException"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;global-exception&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 定义全局变量时无需将&lt;exception&gt;元素作为任何&lt;action&gt;元素的子元素,而是直接作为&nbsp;&lt;global-exception&gt;的子元素.<br />
<br />
&nbsp; 简单示例:<br />
&nbsp; (1).自定义标签类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserNameException.java<br />
<p>package struts.sample.cap3.sample1.exception;<br />
public class UserNameException extends Exception {<br />
&nbsp; public UserNameException(){<br />
&nbsp;&nbsp; super();<br />
&nbsp; }<br />
&nbsp; public UserNameException(String message){<br />
&nbsp;&nbsp; super(); <br />
&nbsp; }<br />
&nbsp; public UserNameException(String message,Throwable cause){<br />
&nbsp;&nbsp; super(message,cause);<br />
&nbsp; }<br />
&nbsp; public UserNameException(Throwable cause){<br />
&nbsp;&nbsp; super(cause);<br />
&nbsp; }<br />
&nbsp; public UserNameException(Exception exc){<br />
&nbsp;&nbsp; super(exc);<br />
&nbsp; }</p>
<p>}<br />
</p>
<br />
(2)业务逻辑类<br />
UserNameService.java<br />
<p>package struts.sample.cap3.sample1.service<br />
&nbsp;import struts.sample.cap3.sample1.exception.UserNameException;<br />
&nbsp;import struts.sample.cap3.sample1.exception.UserNameException2;<br />
public class UserNameService {<br />
&nbsp;public void UserNameLogic() throws UserNameException{<br />
&nbsp;&nbsp;throw new UserNameException("UserName");<br />
&nbsp;}</p>
<p>}<br />
</p>
<br />
(3)Action类<br />
SampleAction.java<br />
&nbsp;
<p>package struts.sample.cap3.sample1.action;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;<br />
import org.apache.struts.action.Action;<br />
import org.apache.struts.action.ActionForm;<br />
import org.apache.struts.action.ActionForward;<br />
import org.apache.struts.action.ActionMapping;<br />
import struts.sample.cap3.sample1.exception.UserNameException;<br />
import struts.sample.cap3.sample1.service.UserNameService;<br />
public class SampleAction extends Action{<br />
&nbsp; public ActionForward execute(<br />
&nbsp;&nbsp;&nbsp; ActionMapping mapping,<br />
&nbsp;&nbsp;&nbsp; ActionForm form,<br />
&nbsp;&nbsp;&nbsp; HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws Exception{<br />
&nbsp;&nbsp; UserNameService userNameService=new UserNameService();<br />
&nbsp;&nbsp; return&nbsp; null;<br />
&nbsp; }</p>
<p>}<br />
</p>
<br />
&nbsp;(4)资源配置文件<br />
application.properties<br />
userNameException=用户名无法确定<br />
XXX=XXX<br />
....<br />
<br />
(5)JSP页面<br />
<p>&lt;%@ page contentType="text/html;charset=UTF-8" %&gt;<br />
&lt;%@ page language="java"%&gt;</p>
<p>&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %&gt;<br />
&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;&lt;title&gt;JSP for SampleForm&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;html:errors/&gt;&lt;p/&gt;<br />
&lt;html:form action="SampleAction.do"&gt;<br />
userName : &lt;html:text property="userName"/&gt;&lt;br/&gt;<br />
password : &lt;html:password property="password"/&gt;&lt;br/&gt;<br />
sex: &lt;html:select property="sex"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;html:option key="F" value="F"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;html:option key="M" value="M"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:select&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; age : &lt;html:text property="age"/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; email : &lt;html:text property="email"/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:submit/&gt;&lt;html:cacel/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
</p>
<br />
<br />
二:global-forwards标记与全局转发<br />
&nbsp;1.全局转发&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所谓全局转发,就是在整个应用程序中,无论怎样的请求者都可以使用的全局中转.它可以仅仅通过一个请求转发到一个JSP页面,也可以通过另一个请求转发到另一个已经定义的Action请求.可以理解为全局转发就是一个控制器,它可以随着按钮(请求)的切换而转换(转发)到任何一个频道(JSP页面和请求).<br />
<br />
2. global-forward标记的配置<br />
&nbsp;&lt;blobal-forward&gt;<br />
&nbsp;&lt;forward<br />
&nbsp;&nbsp; name="Login"<br />
&nbsp; &nbsp;path="/LoginSampleJSP.jsp"/&gt;<br />
&nbsp;&lt;forward<br />
&nbsp;&nbsp; name="success"<br />
&nbsp; &nbsp;path="/SampleAction"<br />
&nbsp;&nbsp; redirect="true"&nbsp; 属性允许在2个Web context中进行转发,默认为false<br />
&nbsp; contextRelative="true"/&gt;&nbsp; 属性允许在多个struts配置文件模块中都可以识别转发,默认为false.<br />
&nbsp; &lt;/blobal-forwards&gt;<br />
&nbsp; name的属性,path的属性是必须的,它们分别表示了转发标识和转发定位,对于任何一个&lt;forward&gt;元素都可以被设置.它实现了无论是全局转发还是局部转发都可以在模块间实现通讯.<br />
&nbsp;<br />
3.Struts-config.xml中的转发<br />
&nbsp;(1).&lt;action&gt;元素结合Action bean的局部转发<br />
&nbsp;(2).&lt;action&gt;元素的简单局部转发<br />
&nbsp;(3).Action bean中的程序转发<br />
&nbsp;(4).&lt;global-forwards&gt;的全局转发<br />
<br />
(1)这类转发是在请求到来后做一些业务逻辑,然后根据业务需要将结果转发到另一个请求或直接显示出一个JSP页面.<br />
Struts-config.xml配置<br />
&lt;action-mapping&gt;<br />
&nbsp;&lt;action<br />
&nbsp; name="SampleForm"<br />
&nbsp; path="/SampleAction"<br />
&nbsp; scope="request"<br />
&nbsp; type="struts.sample.cap3.sample1.action.SampleAction"<br />
&nbsp; validate="false"&gt;<br />
<span style="color: red">&nbsp;&lt;forward name="SampleAction" path="/SampleJsp.jsp"/&gt;<br />
&nbsp;&lt;forward name="failue" path="/Login"/&gt;</span><br />
&nbsp;&lt;/action&gt;<br />
&nbsp;&lt;/action-mapping&gt;<br />
<br />
Action bean程序代码<br />
&nbsp; public class SampleAction extends Action{<br />
&nbsp;&nbsp; public ActionForward execute(<br />
&nbsp;&nbsp;&nbsp;ActionMapping mapping,<br />
&nbsp; ActionForm form,<br />
&nbsp; HttpServletRequest request ,<br />
&nbsp; HttpServletResponse response) throws Exception{<br />
&nbsp;//业务逻辑代码................<br />
<span style="color: red">&nbsp; if(true){<br />
&nbsp; return mapping.findForward("SampleAction");<br />
&nbsp;}else{<br />
&nbsp; return mappingForward("failue")<br />
}<br />
}</span><br />
&nbsp;<br />
(2) 这类转发只需要定义&lt;action&gt;元素,而不用专门的Action bean来配合工作,可以转发到请求或JSP页面.通常这类转发被用作直接转发到一个JSP显示页面的请求.<br />
&nbsp;<span style="color: red">&nbsp;&lt;action forward="/SampleJsp.jsp" path="/Welcome"/&gt;<br />
</span>&nbsp; 利用&lt;action&gt;元素的forward属性和path属性来完成工作,没有定义的ActionForm的name属性和定义Action bean Java实体名的type属性.当请求为path属性所定义的内容时,将直接转发到forward属性所指定的地方...<br />
<br />
(3).通过Action bean的execte方法由程序员利用代码来制定转发.通常这类转发被使用在不确定转发目的地的场合,可能会根据请求request或ActionForm传入的内容来指定转发<br />
Struts-config.xml配置<br />
&lt;action-mapping&gt;<br />
&nbsp;&lt;action<br />
&nbsp; name="SampleForm"<br />
&nbsp; path="/SampleAction"<br />
&nbsp; scope="request"<br />
&nbsp; type="struts.sample.cap3.sample1.action.SampleAction"<br />
&nbsp; validate="false"&gt;<br />
<span style="color: red">&nbsp;&lt;forward name="SampleAction" path="/SampleJsp.jsp"/&gt;<br />
&nbsp;&lt;forward name="failue" path="/Login"/&gt;</span><br />
&nbsp;&lt;/action&gt;<br />
&nbsp;&lt;/action-mapping&gt;<br />
<br />
Action bean程序代码<br />
&nbsp; public class SampleAction extends Action{<br />
&nbsp;&nbsp; public ActionForward execute(<br />
&nbsp;&nbsp;&nbsp;ActionMapping mapping,<br />
&nbsp; ActionForm form,<br />
&nbsp; HttpServletRequest request ,<br />
&nbsp; HttpServletResponse response) throws Exception{<br />
&nbsp;//业务逻辑代码................<br />
<span style="color: red">&nbsp; return new ActionForward(request.getParmeter("pageFlow"));}<br />
}<br />
<br />
<span style="color: #000000">返回的ActionForward类型对象可以实现动态转发,本示例中使用JSP页面中名为"pageFlow"的控件所指定的值作为转发目的地."pageFlow"控件的值可以是一个请求,也可以是一个JSP页面.这样,转发的目的地就完全交给进行请求的JSP页面来指定.</span><br />
&nbsp;<br />
<font style="color: #000000" color="#000000">(4).这一类型的转发仅仅关注在转发这个动作上面,而不关注请求,因此全局转发必须配合&lt;action&gt;元素或者Action bean来实现"请求-转发"的整个过程.这类转发通常被使用在有统一转发目的地的显式逻辑中.<br />
struts-config.xml配置(同上)<br />
<br />
Actionbean部分(同上)+<br />
<span style="color: #ff0000">return mapping.findForward("Login");<br />
return mapping.findForward("SampleAction");<br />
</span><br />
四.控制器<br />
&nbsp; Struts框架的控制器由ActionServlet(Struts Servlet) RequestProcessor(请求处理),ModoleConfig(存储配置信息),Action,<br />
ActionForward(Action的转发)5个主要对象多组成,他们完成了Struts框架服务器端表示层MVC的所有工作.<br />
&nbsp; 流程如下<br />
&nbsp; 1.客户端的请求到来后发送到ActionServlet中<br />
&nbsp; 2.ActionServlet调用RequestProoessor处理用户请求<br />
&nbsp; 3.RequestProcess根据Module得到请求对应的Action<br />
&nbsp; 4.具体Action对象处理请求的具体工作<br />
&nbsp; 5.从Action的处理返回ActionForward,转发到指定的目的地....<br />
</font></span>
<img src ="http://www.blogjava.net/microlab4321/aggbug/147444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-09-22 17:59 <a href="http://www.blogjava.net/microlab4321/articles/147444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)Struts学习心得之Struts流程篇</title><link>http://www.blogjava.net/microlab4321/articles/137625.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Fri, 17 Aug 2007 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/137625.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/137625.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/137625.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/137625.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/137625.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Struts学习心得之Struts流程篇（1）&nbsp;刚接触Struts，刚接触MVC架构，或者刚接触任何新东西，我觉得首先要搞清楚流程，要对新事物有一个大概的、总体的认识，先有感性认识，先培养起来兴趣是非常重要的。下面就把我学习Struts的总体业务流程通过一个实例来进行概括，有什么错误和不妥之处，请你发表评论指教！（1）搭建环境&nbsp;&nbsp; 1、获得struts的支持包。str...&nbsp;&nbsp;<a href='http://www.blogjava.net/microlab4321/articles/137625.html'>阅读全文</a><img src ="http://www.blogjava.net/microlab4321/aggbug/137625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-17 16:46 <a href="http://www.blogjava.net/microlab4321/articles/137625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)Strus常见错误及原因分析 </title><link>http://www.blogjava.net/microlab4321/articles/137623.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Fri, 17 Aug 2007 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/137623.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/137623.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/137623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/137623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/137623.html</trackback:ping><description><![CDATA[<div>
<p>本篇文章包含了在用<span>Struts开发web应用时经常碰到的一些异常和错误，根据异常或错误信息本身，经常可以找到潜在的错误发生原因。</span></p>
<p>下面列出了一些<span>Struts的常见错误和异常，并给出了一些可能发生此类错误或异常的原因。有的后面有相关连接，你可以通过它找到更多的信息。</span></p>
<p>
<table cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td bgColor=#003366 colSpan=2>
            <p align=center><strong><span>Cannot retrieve mapping for action</span><span> </span></strong></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>异常</span><span> </span></p>
            </td>
            <td>
            <p><span>javax.servlet.jsp.JspException: Cannot retrieve mapping for action <em>/Login </em></span><em><span>（</span><span>/Login</span><span>是你的</span><span>action</span><span>名字）</span></em><span> </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p>&nbsp;<span> </span></p>
            </td>
            <td>
            <p>&nbsp;<span> </span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p><span>可能原因</span><span> </span></p>
            </td>
            <td>
            <p><span>action</span><span>没有再</span><code><span>struts-config.xml</span></code><span> </span><span>中定义，或没有找到匹配的</span><span>action</span><span>，例如在</span><span>JSP</span><span>文件中使用</span> <code><span>&lt;html:form action="</span></code><em><span>Login.do</span></em><code><span>"</span></code><span>.</span><span>将表单提交给</span><span>Login.do</span><span>处理，如果出现上述异常，请查看</span><span>struts-config.xml</span><span>中的定义部分，有时可能是打错了字符或者是某些不符合规则，可以使用</span><span>struts console</span><span>工具来检查。</span><span> </span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td bgColor=#003366 colSpan=2>
            <p align=center><strong><font color=#ffffff><span>Cannot retrieve definition for form bean null</span><span> </span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td width="9%">
            <p><span>异常</span><span> </span></p>
            </td>
            <td width="89%">
            <p><span>org.apache.jasper.JasperException: Cannot retrieve definition for form bean null</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="9%">
            <p><span>可能原因</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><br>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
            </td>
            <td width="89%">
            <p><span>这个异常是因为</span><span>Struts</span><span>根据</span><span>struts-config.xml</span><span>中的</span><span>mapping</span><span>没有找到</span><span>action</span><span>期望的</span><span>form bean</span><span>。大部分的情况可能是因为在</span><span>form-bean</span><span>中设置的</span><span>name</span><span>属性和</span><span>action</span><span>中设置的</span><span>name</span><span>属性不匹配所致。换句话说，</span><span>action</span><span>和</span><span>form</span><span>都应该各自有一个</span><span>name</span><span>属性，并且要精确匹配，包括大小写。这个错误当没有</span><span>name</span><span>属性和</span><span>action</span><span>关联时也会发生，如果没有在</span><span>action</span><span>中指定</span><span>name</span><span>属性，那么就没有</span><span>name</span><span>属性和</span><span>action</span><span>相关联。当然当</span><span>action</span><span>制作某些控制时，譬如根据参数值跳转到相应的</span><span>jsp</span><span>页面，而不是处理表单数据，这是就不用</span><span>name</span><span>属性，这也是</span><span>action</span><span>的使用方法之一。</span><span> </span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellPadding=0 width=803 border=0>
    <tbody>
        <tr>
            <td width=795 colSpan=2>
            <p align=center><strong><font color=#ffffff><span>No action instance for path /<em>xxxx</em> could be created</span><span> </span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td width=76>
            <p><span>异常</span><span> </span></p>
            </td>
            <td width=713>
            <p><span>No action instance for path /<em>xxxx</em> could be created</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=76 rowSpan=6>
            <p><span>可能原因</span><span> </span></p>
            </td>
            <td width=713>
            <p><span>特别提示：因为有很多中情况会导致这个错误的发生，所以推荐大家调高你的</span><span>web</span><span>服务器的日志</span><span>/</span><span>调试级别，这样可以从更多的信息中看到潜在的、在试图创建</span><span>action</span><span>类时发生的错误，这个</span><span>action</span><span>类你已经在</span><span>struts-config.xml</span><span>中设置了关联（即添加了</span><span>&lt;action&gt;</span><span>标签）。</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td width=713>
            <p><span>在</span><code><span>struts-config.xml</span><span>中通过<span>action标签的class属性指定的action类不能被找到有很多种原因，例如：</span></span></code><span> </span></p>
            <ul type=disc>
                <li><span>定位编译后的</span><span>.class</span><span>文件失败。</span><span>Failure to place compiled </span><code><span>.class</span></code><span> file for the action in the classpath (</span><span>在</span><span>web</span><span>开发中，</span><span>class</span><span>的的位置在</span><span>r </span><code><span>WEB-INF/classes，</span><span>所以你的<span>action class必须要在这个目录下。例如你的action类位于WEB-INF/classes/action/Login.class,那么在struts-config.xml中设置action的属性type时就是action.Login</span></span></code><span>).</span>
                <li><span>拼写错误，这个也时有发生，并且不易找到，特别注意第一个字母的大小写和包的名称。</span><span> </span></li>
            </ul>
            </td>
        </tr>
        <tr>
            <td width=713>
            <p><span>在</span><code><span>struts-config.xml中指定的action类没有继承自Stuts的Action类，或者你自定义的Action类没有继承自Struts提供的Action类。 </span></code></p>
            <p><code><span>你的<span>action类必须继承自Struts提供的Action类。</span></span></code><span> </span></p>
            </td>
        </tr>
        <tr>
            <td width=713>
            <p><span>你的<span>classpath的问题。例如web server没有发现你的资源文件，资源文件必须在</span></span><code><span>WEB-INF/classes/目录下</span><span>。</span></code> </p>
            </td>
        </tr>
        <tr>
            <td width=713>
            <p><span>Problem in </span><code><span>struts-config.xml</span></code><span> file with action mapping. </span></p>
            </td>
        </tr>
        <tr>
            <td width=713>
            <p><span>Problem with </span><code><span>data-sources.xml</span></code><span> file.</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=76>
            <p><span>相关链接</span><span> </span></p>
            </td>
            <td width=713>
            <ul type=disc>
                <li><span><a href="http://www.mail-archive.com/struts-user@jakarta.apache.org/msg65874.html">http://www.mail-archive.com/struts-user@jakarta.apache.org/msg65874.html</a></span>
                <li><span>Action Mapping mistake in </span><code><span>struts-config.xml</span></code><span>:<br><a href="http://www.manning.com/ao/readforum.html?forum=siaao&amp;readthread=177">http://www.manning.com/ao/readforum.html?forum=siaao&amp;readthread=177</a></span>
                <li><code><span>data-sources.xml</span></code><span> file?:<br><a href="http://www.caucho.com/quercus/faq/section.xtp?section_id=30">http://www.caucho.com/quercus/faq/section.xtp?section_id=30</a> </span></li>
            </ul>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellPadding=0 width=802 border=0>
    <tbody>
        <tr>
            <td width=794 colSpan=2>
            <p align=center><strong><span><font color=#ffffff>No getter method for property <em>XXXX</em> of bean org.apache.struts.taglib.html.BEAN</font></span><font color=#ffffff><span> </span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td width=74>
            <p><span>异常</span><span> </span></p>
            </td>
            <td width=714>
            <p><span>javax.servlet.jsp.JspException: No getter method for property <em>username</em> of bean org.apache.struts.taglib.html.BEAN</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td width=74 rowSpan=2>
            <p><span>可能原因</span><span> </span></p>
            </td>
            <td width=714>
            <p><span>没有位</span><span>form bean</span><span>中的某个变量定义</span><span>getter </span><span>方法</span> </p>
            </td>
        </tr>
        <tr>
            <td width=714>
            <p><span>这个错误主要发生在表单提交的</span><span>FormBean</span><span>中，用</span><span>struts</span><span>标记</span><span>&lt;html:text property=&#8221;username&#8221;&gt;</span><span>时，在</span><span>FormBean</span><span>中必须有一个</span><span>getUsername()</span><span>方法。注意字母&#8220;</span><span>U</span><span>&#8221;。</span> </p>
            </td>
        </tr>
        <tr>
            <td width=74>
            <p><span>Related Links</span><span> </span></p>
            </td>
            <td width=714>
            <ul type=disc>
                <li><span>Case can trip up the matching between get method's name and name specified in Struts tag<br><a href="http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&amp;f=58&amp;t=000163">http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&amp;f=58&amp;t=000163</a> </span></li>
            </ul>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellSpacing=5 cellPadding=0 width=802 border=0>
    <tbody>
        <tr>
            <td width=778 colSpan=2>
            <p align=center><strong><span><font color=#ffffff>java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm</font></span><font color=#ffffff><span> </span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td width=48>
            <p><span>错误</span><span> </span></p>
            </td>
            <td width=712>
            <p><span>java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=48 rowSpan=2>
            <p><span>可能原因</span><span> </span></p>
            </td>
            <td width=712>
            <p><span>这个错误主要发生在在</span><span>classpath</span><span>中找不到相应的</span><span>Java .class</span><span>文件。如果这个错误发生在</span><span>web</span><span>应用程序的运行时，主要是因为指定的</span><span>class</span><span>文件不在</span><span>web server</span><span>的</span><span>classpath</span><span>中（</span><code><span>/WEB-INF/classes</span></code><span> </span><span>和</span> <code><span>/WEB-INF/lib）。 </span></code></p>
            <p><code><span>在上面的错误中，原因是找不到<span>ActionForm类。</span></span></code><span> </span></p>
            </td>
        </tr>
        <tr>
            <td width=712>
            <p><span>This error is sometimes seen when one or more </span><code><span>ActionForm.class</span></code><span> instances are actually in the classpath. This most often occurs when </span><code><span>ActionForm.class</span></code><span> is made available correctly by placing </span><code><span>struts.jar</span></code><span> in the </span><code><span>/WEB-INF/lib</span></code><span> directory. When this library has been correctly placed and it is verified that </span><code><span>ActionForm.class</span></code><span> actually is present in the </span><code><span>struts.jar</span></code><span> file, the problem is either that more than one copy of </span><code><span>ActionForm.class</span></code><span> is in the classpath or (more likely) that duplicate versions of class files other than </span><code><span>ActionForm</span></code><span> are in the same classpath, causing confusion. This is especially true if a class that extends </span><code><span>ActionForm</span></code><span> is made available twice, such as in an </span><code><span>.ear</span></code><span> file that encompasses a </span><code><span>.war</span></code><span> file as well as in the </span><code><span>.war</span></code><span> file's own classpath (</span><code><span>/WEB-INF/classes</span></code><span>). This problem can be resolved by guaranteeing that there are no redundant classes, especially those related to Struts (directly from Struts or extensions of Struts), in the web application's view.</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td width=48>
            <p><span>相关连接</span><span> </span></p>
            </td>
            <td width=712>
            <ul type=disc>
                <li><span>EJB and Web Shared Links:<br><a href="http://forum.java.sun.com/thread.jsp?forum=26&amp;thread=413060&amp;tstart=0&amp;trange=15" target=_new>http://forum.java.sun.com/thread.jsp?forum=26&amp;thread=413060&amp;tstart=0&amp;trange=15</a></span>
                <li><span>Keep </span><code><span>Action</span></code><span> and </span><code><span>ActionForm</span></code><span> (and their children) as non-overlapping unit(s) of an application<br><a href="http://www.mail-archive.com/struts-user@jakarta.apache.org/msg47466.html" target=_new>http://www.mail-archive.com/struts-user@jakarta.apache.org/msg47466.html</a><br><a href="http://www.mail-archive.com/struts-user@jakarta.apache.org/msg47467.html" target=_new>http://www.mail-archive.com/struts-user@jakarta.apache.org/msg47467.html</a> </span></li>
            </ul>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellPadding=0 width="90%" border=0>
    <tbody>
        <tr>
            <td colSpan=2>
            <p align=center><strong><span><font color=#ffffff>Exception creating bean of class org.apache.struts.action.ActionForm: {1}</font></span><font color=#ffffff><span> </span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>异常</span><span> </span></p>
            </td>
            <td>
            <p><span>javax.servlet.jsp.JspException: Exception creating bean of class org.apache.struts.action.ActionForm: {1}</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top rowSpan=2>
            <p><span>可能原因</span><span> </span></p>
            </td>
            <td>
            <p><span>Instantiating Struts-provided </span><code><span>ActionForm</span></code><span> class directly instead of instantiating a class derived off </span><code><span>ActionForm</span></code><span>. This might occur implicitly if you specify that a form-bean is this Struts </span><code><span>ActionForm</span></code><span> class rather than specifying a child of this class for the form-bean.</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>Not associating an </span><code><span>ActionForm</span></code><span>-descended class with an </span><code><span>action</span></code><span> can also lead to this error.</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>Related Links</span><span> </span></p>
            </td>
            <td>
            <p>&nbsp;<span> </span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellPadding=0 width=801 border=0>
    <tbody>
        <tr>
            <td width=793 colSpan=2>
            <p align=center><strong><span><font color=#ffffff>Cannot find ActionMappings or ActionFormBeans collection</font></span><font color=#ffffff><span> </span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td width=64>
            <p><span>Exception</span><span> </span></p>
            </td>
            <td width=723>
            <p><span>javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=64 rowSpan=4>
            <p><span>可能原因</span><span> </span></p>
            </td>
            <td width=723>
            <p><span>不是标识</span><span>Struts actionServlet</span><span>的</span><span>&lt;servlet&gt;</span><span>标记就是映射</span><span>.do</span><span>扩展名的</span><span>&lt;sevlet-mapping&gt;</span><span>标记或者两者都没有在</span><span>web.xml</span><span>中声明。</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td width=723>
            <p><span>在</span><span>struts-config.xml</span><span>中的打字或者拼写错误也可导致这个异常的发生。例如缺少一个标记的关闭符号</span><span>/&gt;</span><span>。<span>最好使用</span></span><span>struts console</span><span>工具检查一下</span><span>。</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td width=723>
            <p><span>另外，</span><span>load-on-startup</span><span>必须在</span><span>web.xml</span><span>中声明，这要么是一个空标记，要么指定一个数值，这个数值用来表</span><span>servlet</span><span>运行的优先级，数值越大优先级越低。</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td width=723>
            <p><span>还有一个和使用</span><span>load-on-startup</span><span>有关的是使用</span><span>Struts</span><span>预编译</span><span>JSP</span><span>文件时也可能导致这个异常。</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td width=64>
            <p><span>相关链接</span><span> </span></p>
            </td>
            <td width=723>
            <ul type=disc>
                <li><span>Explicitly Define </span><code><span>&lt;load-on-startup&gt;</span></code><span><br><a href="http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&amp;f=50&amp;t=001055">http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&amp;f=50&amp;t=001055</a><br><a href="http://threebit.net/tutorials/ejb/general/" target=_new>http://threebit.net/tutorials/ejb/general/</a> </span></li>
            </ul>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellPadding=0 width=803 border=0>
    <tbody>
        <tr>
            <td width=795 colSpan=2>
            <p align=center><strong><span><font color=#ffffff>NullPointerException at ... RequestUtils.forwardURL</font></span><font color=#ffffff><span> </span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td width=64>
            <p><span>异常</span><span> </span></p>
            </td>
            <td width=725>
            <p><span>java.lang.NullPointerException at org.apache.struts.util.RequestUtils.forwardURL(RequestUtils.java:1223) </span></p>
            </td>
        </tr>
        <tr>
            <td width=64>
            <p><span>可能原因</span><span> </span></p>
            </td>
            <td width=725>
            <p><span>在</span><span>struts-config.xml</span><span>中的</span><span>forward</span><span>元素缺少</span><span>path</span><span>属性。例如应该是如下形式：</span><span><br>&lt;forward name="userhome" path="/user/userhome.jsp"/&gt;</span><span> </span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellPadding=0 width="90%" border=0>
    <tbody>
        <tr>
            <td colSpan=2>
            <p align=center><strong><span><font color=#ffffff>Cannot find bean org.apache.struts.taglib.html.BEAN in any scope</font></span><font color=#ffffff><span> </span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>Exception</span><span> </span></p>
            </td>
            <td>
            <p><span>javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p>&nbsp;<span> </span></p>
            </td>
            <td>
            <p>&nbsp;<span> </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>Probable Causes</span><span> </span></p>
            </td>
            <td>
            <p>试图在<span>Struts的form标记外使用form的子元素。这常常发生在你在&lt;/html:form&gt;后面使用Struts的html标记。</span></p>
            <p>另外要注意可能你不经意使用的无主体的标记，如<span>&lt;html:form &#8230; /&gt;，这样web 服务器解析时就当作一个无主体的标记，随后使用的所有&lt;html&gt;标记都被认为是在这个标记之外的，如又使用了&lt;html:text property=&#8221;id&#8221;&gt;</span></p>
            <p>还有就是在使用<span>taglib引入HTML标记库时，你使用的prefix的值不是html。&nbsp;</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>相关连接</span><span> </span></p>
            </td>
            <td>
            <ul type=disc>
                <li><span>Using </span><code><span>form</span></code><span> subelements outside of a </span><code><span>form</span></code><span> tag<br><a href="http://forum.java.sun.com/thread.jsp?thread=337537&amp;forum=4&amp;message=1384153">http://forum.java.sun.com/thread.jsp?thread=337537&amp;forum=4&amp;message=1384153</a> </span></li>
            </ul>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellPadding=0 width="90%" border=0>
    <tbody>
        <tr>
            <td colSpan=2>
            <p align=center><strong><span><font color=#ffffff>Missing message for key <em>xx.xx.xx</em></font></span><font color=#ffffff><span> </span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>Exception</span><span> </span></p>
            </td>
            <td>
            <p><span>javax.servlet.jsp.JspException: Missing message for key <em>xx.xx.xx</em></span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td rowSpan=2>
            <p><span>Probable Causes</span><span> </span></p>
            </td>
            <td>
            <p><span>这个</span><span>key</span><span>的值对没有在资源文件</span><code><span>ApplicationResources.properties</span></code><span>中定义。如果你使用</span><span>eclipse</span><span>时经常碰到这样的情况，当项目重新编译时，</span><span>eclipse</span><span>会自动将</span><span>classes</span><span>目录下的资源文件删除。</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><code><span>资源文件</span><span>ApplicationResources.properties</span></code><span> </span><span>不在</span><span>classpath</span><span>中</span> <span>应将资源文件放到</span> <code><span>WEB-INF/classes</span></code><span> </span><span>目录下，当然要在</span><span>struts-config.xml</span><span>中定义</span><span>) </span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellPadding=0 width="90%" border=0>
    <tbody>
        <tr>
            <td colSpan=2>
            <p align=center><strong><span><font color=#ffffff>Cannot find message resources under key org.apache.struts.action.MESSAGE</font></span><font color=#ffffff><span> </span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>异常</span><span> </span></p>
            </td>
            <td>
            <p><span>Cannot find message resources under key org.apache.struts.action.MESSAGE</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td rowSpan=3>
            <p><span>可能原因</span><span> </span></p>
            </td>
            <td>
            <p><span>很显然，这个错误是发生在使用资源文件时，而</span><span>Struts</span><span>没有找到资源文件。</span> </p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>Implicitly trying to use message resources that are not available (such as using empty </span><code><span>html:options</span></code><span> tag instead of specifying the options in its body -- this assumes options are specified in </span><code><span>ApplicationResources.properties</span></code><span> file)</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>XML parser issues -- too many, too few, incorrect/incompatible versions</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>Related Links</span><span> </span></p>
            </td>
            <td>
            <ul type=disc>
                <li><span>Provide Struts with Resource Bundle<br><a href="http://threebit.net/tutorials/ejb/general/" target=_new>http://threebit.net/tutorials/ejb/general/</a></span>
                <li><span>XML Parser Issues<br><a href="http://www.mail-archive.com/struts-user@jakarta.apache.org/msg15779.html">http://www.mail-archive.com/struts-user@jakarta.apache.org/msg15779.html</a> </span></li>
            </ul>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellPadding=0 width="90%" border=0>
    <tbody>
        <tr>
            <td colSpan=2>
            <p align=center><strong><span><font color=#ffffff>No input attribute for mapping path /loginAction</font></span><font color=#ffffff><span> </span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>错误</span><span> </span></p>
            </td>
            <td>
            <p><span>No input attribute for mapping path /xxxxAction</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>可能原因</span><span>e</span><span> </span></p>
            </td>
            <td>
            <p><span>No </span><code><span>input</span></code><span> attribute in action mapping in </span><code><span>struts-config.xml</span></code><span> file for the action with the name specified in the error message. An </span><code><span>input</span></code><span> attribute is not required if form validation is not performed (either because the </span><code><span>validate</span></code><span> attribute is set to </span><code><span>false</span></code><span> or because the validation method in the relevant form class is not implemented. The </span><code><span>input</span></code><span> attribute specifies the page leading to this action because that page is used to display error messages from the form validation.</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>Related Links</span><span> </span></p>
            </td>
            <td>
            <p>&nbsp;<span> </span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellPadding=0 width="90%" border=0>
    <tbody>
        <tr>
            <td colSpan=2>
            <p align=center><strong><span><font color=#ffffff>Strange Output Characters</font></span><span> </span></strong></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>错误</span><span> </span></p>
            </td>
            <td>
            <p><span>Strange and seemingly random characters in HTML and on screen, but not in original JSP or servlet.</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td rowSpan=2>
            <p><span>可能原因</span><span> </span></p>
            </td>
            <td>
            <p><span>混和使用</span><span>Struts</span><span>的</span><span>html:form</span><span>标记和标准的</span><span>HTML</span><span>标记不正确。</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>使用的编码样式在本页中不支持。</span><span> </span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellPadding=0 width=803 border=0>
    <tbody>
        <tr>
            <td width=795 colSpan=2>
            <p align=center><strong><span><font color=#ffffff>"Document contained no data" or no data rendered on page</font></span><span> </span></strong></p>
            </td>
        </tr>
        <tr>
            <td width=72 rowSpan=2>
            <p><span>错误</span><span> </span></p>
            </td>
            <td width=717>
            <p><span>"Document contained no data" in Netscape</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td width=717>
            <p><span>No data rendered (completely empty) page in Microsoft Internet Explorer</span><span> </span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=72>
            <p><span>可能原因</span><span> </span></p>
            </td>
            <td width=717>
            <p><span>使用一个</span><span>Action</span><span>的派生类而没有实现</span><span>perform()</span><span>方法或</span><span>execute()</span><span>方法。在</span><span>Struts1.0</span><span>中实现的是</span><span>perform()</span><span>方法，在</span><span>Struts1.1</span><span>中实现的是</span><span>execute()</span><span>方法，但</span><span>Struts1.1</span><span>向后兼容</span><span>perform()</span><span>方法。</span></p>
            <p><span>但你使用</span><span>Struts1.1</span><span>创建一个</span><span>Action</span><span>的派生类，并且实现了</span><span>execute()</span><span>方法，而你在</span><span>Struts1.0</span><span>中运行的话，就会得到</span><span>"Document contained no data" error message in Netscape or a completely empty (no HTML whatsoever) page rendered in Microsoft Internet Explorer.&#8221;</span><span>的错误信息。</span><span> </span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
</div>
<img src ="http://www.blogjava.net/microlab4321/aggbug/137623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-17 16:43 <a href="http://www.blogjava.net/microlab4321/articles/137623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts环境配置手顺(eclipse版)，包括SQL Server的连接 </title><link>http://www.blogjava.net/microlab4321/articles/137303.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Thu, 16 Aug 2007 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/137303.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/137303.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/137303.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/137303.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/137303.html</trackback:ping><description><![CDATA[Struts环境配置手顺<br><br>1.Eclipse<br>&nbsp;&nbsp;下载网址：&nbsp;&nbsp;http://www.eclipse.org/<br><br>2.tomcat<br>&nbsp;&nbsp;下载网址：&nbsp;&nbsp;http://jakarta.apache.org/site/binindex.cgi<br><br>3.struts<br>&nbsp;&nbsp;下载网址：&nbsp;&nbsp;http://jakarta.apache.org/site/binindex.cgi<br><br>4.tomcat&nbsp;for&nbsp;Eclipse插件<br>&nbsp;&nbsp;下载网址：&nbsp;&nbsp;http://www.sysdeo.com/eclipse/tomcatPlugin.html<br><br>5.easy&nbsp;struts插件<br>&nbsp;&nbsp;下载网址：&nbsp;&nbsp;http://sourceforge.net/projects/easystruts<br><br>6.EJB开发工具lomboz(不是必需的)&nbsp;&nbsp;<br>&nbsp;&nbsp;下载网址：&nbsp;&nbsp;http://www.objectlearn.com/<br><br>把上述4中的com.sysdeo.eclipse.tomcat_2.2.1和上述5中的com.cross.easystruts.eclipse_0.6.4分别COPY到<br>eclipse\plugins\,然后进行以下设置<br><br>1.Tomcat的初始化设置:启动Eclipse，通过菜单Windows-&gt;Preferences打开设置窗口<br>&nbsp;&nbsp;选择Tomcat并做配置<br>1.Easy&nbsp;Struts的初始化设置：启动Eclipse，通过菜单Windows-&gt;Preferences打开设置窗口<br>&nbsp;&nbsp;选择struts&nbsp;1.1并在struts&nbsp;1.1所需的库文件中找到并添加struts.jar文件<br>3.在struts&nbsp;1.1所需的类型库描述文件中建议至少加入前面提到的三个描述文件分别是：<br>&nbsp;&nbsp;struts_html.tld、struts_bean.tld、struts_logic.tld，这三个文件会在创建struts应用项目时自动拷贝到项目的WEB-INF目录下。<br>4.新建一个Tomcat项目,然后右击project-&gt;Properties-&gt;Libraries,把struts&nbsp;1.1中的包全部加入\r<br>5.新建Add&nbsp;Easy&nbsp;Struts&nbsp;Support<br>6.把struts&nbsp;1.1中的包全部COPY到project-&gt;WEB-INF\LIB\<br><br>用JAVA连接SQL&nbsp;Server&nbsp;2000取得数据<br>1.下载JDBC&nbsp;FOR&nbsp;SQLSERVER&nbsp;的驱动：<br>http://www.microsoft.com/downloads/details.aspx?FamilyID=4f8f2f01-1ed7-4c4d-8f7b-3d47969e66ae&amp;DisplayLang=en#filelist<br>点击setup.exe下载驱动<br>2.下载后开始安装，就用默认设置安装,会被安装到：<br>&nbsp;&nbsp;&nbsp;C:\Program&nbsp;Files\Microsoft&nbsp;SQL&nbsp;Server&nbsp;2000&nbsp;Driver&nbsp;for&nbsp;JDBC<br>3.把C:\Program&nbsp;Files\Microsoft&nbsp;SQL&nbsp;Server&nbsp;2000&nbsp;Driver&nbsp;for&nbsp;JDBC\lib<br>&nbsp;&nbsp;下面的mssqlserver.jar,msbase.jar,msutil.jar三个文件拷贝到你的<br>&nbsp;&nbsp;&nbsp;JDK主目录\jre\lib\ext下面，现在JDBC驱动就算配置好了<br>4.编译运行测试程序：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;driverName&nbsp;=&nbsp;"com.microsoft.jdbc.sqlserver.SQLServerDriver";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;connURL&nbsp;=&nbsp;"jdbc:microsoft:sqlserver://BLUESKY:1433;User=sa;Password=sa;DatabaseName=sitedb";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(driverName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;DriverManager.getConnection(connURL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;stmt&nbsp;=&nbsp;conn.createStatement();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;strsql&nbsp;=&nbsp;new&nbsp;StringBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strsql.append("select&nbsp;*&nbsp;from&nbsp;USERTABLE&nbsp;where&nbsp;username&nbsp;='"&nbsp;+&nbsp;username&nbsp;+&nbsp;"'");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;stmt.executeQuery(strsql.toString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!rs.next()&nbsp;||!password.equals(NulltoString(rs.getString("password")).trim())){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBmsg&nbsp;=&nbsp;"对不起，您所输入的用户不存在或用户密码不正确";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username&nbsp;=&nbsp;NulltoString(rs.getString("username"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selectright&nbsp;=&nbsp;NulltoString(rs.getString("selectright"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deleteright&nbsp;=&nbsp;NulltoString(rs.getString("deleteright"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateright&nbsp;=&nbsp;NulltoString(rs.getString("updateright"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch&nbsp;(ClassNotFoundException&nbsp;ex){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch&nbsp;(SQLException&nbsp;ex){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>接下来就可以开始做struts了!!!&nbsp; 
<img src ="http://www.blogjava.net/microlab4321/aggbug/137303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-16 16:04 <a href="http://www.blogjava.net/microlab4321/articles/137303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>