﻿<?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-宝贝小猪唛-文章分类-框架&amp;设计模式</title><link>http://www.blogjava.net/yanpeng/category/17927.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 03 Mar 2007 09:01:18 GMT</lastBuildDate><pubDate>Sat, 03 Mar 2007 09:01:18 GMT</pubDate><ttl>60</ttl><item><title>struts bean标签库</title><link>http://www.blogjava.net/yanpeng/articles/86014.html</link><dc:creator>宝贝小猪唛</dc:creator><author>宝贝小猪唛</author><pubDate>Thu, 07 Dec 2006 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/yanpeng/articles/86014.html</guid><wfw:comment>http://www.blogjava.net/yanpeng/comments/86014.html</wfw:comment><comments>http://www.blogjava.net/yanpeng/articles/86014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yanpeng/comments/commentRss/86014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yanpeng/services/trackbacks/86014.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">Struts bean标签库中的标签可以访问已经存在的javabean以及它们的属性，还可以定义新的bean，把它存放在page范围内或者用户指定的范围内，供网页内其它元素访问。<br />bean标签库中的标签大致分为以下三类<br /><font color="#ff0000">1.用于访问http请求信息或jsp隐含对象的bean标签</font><br /><font color="#0000ff">&lt;bean:cookie&gt;:</font>访问cookie信息<br />   id属性:定义一个javax.servlet.http.Cookie类型的变量，该变量存放在page范围内<br />   name属性:指定Cookie的名字<br />   value属性:指定cookie的默认值。如果由name属性指定的Cookie不存在，就使用value属性指<br />                       定的默认值<br />   multiple属性:如果设置了该属性（可以设置为任意一个字符串），可以检索出所有和cookie名<br />                           字匹配的cookie。此时id属性定义了一个cookie数组类型的变量，而不是单个<br />                           cookie类型的变量<br /><font color="#0000cc">&lt;bean:header&gt;:</font>访问http请求中的header信息<br />   id属性:定义一个java.lang.String类型的变量，该变量存放在page范围内<br />   name属性:指定需要检索的header信息<br /><font color="#0000cc">&lt;bean:parameter&gt;:</font>访问请求参数<br />   id属性:定义一个java.lang.String类型的变量，该变量存放在page范围内<br />   name属性:指定请求参数名<br />   value属性:指定请求参数的默认值<br /><font color="#0000cc">&lt;bean:page&gt;:</font>访问jsp隐含对象<br />   id属性:定义一个引用隐含对象的变量，该变量存放在page范围内<br />   property属性:指定隐含对象的名字，可选值包括application,config,request,response，session<br /><font color="#ff0000">2.用于访问web应用资源的bean标签<br /></font><font color="#0000cc">&lt;bean:message&gt;:</font>输出Resource Bundle中的一条消息<br />   bundle属性:指定Resource Bundle，和struts配置文件的&lt;message-resources&gt;元素的<br />                          key属性匹配，如果没有配置bundle属性，就采用默认的Resource Bundle<br />   key属性:指定消息key<br />   在&lt;bean:message&gt;标签中指定消息key有三种方式：<br />         （1）.&lt;bean:message&gt;标签的key属性直接指定消息key<br />         （2）.&lt;bean:message&gt;标签的name属性指定一个可以转化为字符串的变量，这个变量的<br />                字符串值为消息key<br />         （3）.同时指定&lt;bean:message&gt;标签的name属性和property属性。name属性指定一个<br />                 javabean，property属性指定javabean的一个属性，这个javabean的属性的值就<br />                 是消息key<br />         对于带参数的复合消息，可以使用&lt;bean:message&gt;标签的arg0、arg1、arg2、arg3、arg4<br />         属性来设置参数值<br /><font color="#0000cc">&lt;bean:resource&gt;:</font>用于检索web资源的内容<br />   id属性:定义一个代表web资源的变量<br />   name属性:指定web资源的路径<br />   input属性:如果没有设置input属性，则id属性定义的变量为字符串类型，如果给input属性<br />                      设置了值（可以是任意字符串），则id属性定义的变量为java.io.InputStream类型<br /><font color="#0000cc">&lt;bean:struts&gt;:</font>检索struts框架内在的对象（如ActionFormBean,ActionForward或<br />                          ActionMapping）。必须设置formbean,forward或mapping属性中的一个属性<br />   id属性:定义一个page范围的变量，用来引用struts框架的内在对象<br />   formbean属性:指定ActionFormBean对象，和配置文件的&lt;form-bean&gt;元素匹配<br />   forward属性:指定ActionForward对象，和配置文件的&lt;global-forwards&gt;元素的&lt;forward&gt;<br />                           子元素匹配<br />   mapping属性:指定ActionMapping对象，和配置文件的&lt;action&gt;元素匹配<br /><font color="#0000cc">&lt;bean:include&gt;:</font>包含其它web资源的内容，和标准jsp标签&lt;jsp:include&gt;相似，区别在于<br />                            &lt;bean:include&gt;把其他web资源的内容存放在一个变量中，而不是显示在<br />                            网页上<br />   id属性:定义一个代表其他web资源的变量<br />   forward属性:指定全局转发路径，和配置文件的&lt;global-forwards&gt;元素中的&lt;forward&gt;<br />                           子元素匹配<br />   page属性:指定相对于当前应用的URI，以“/”开头<br />   href属性:指定完整的URL<br /><font color="#ff0000">3.用于定义或输出javabean的bean标签<br /></font><font color="#000000"><font color="#0000cc">&lt;bean:define&gt;:</font>定义一个变量<br />   id属性:指定变量的名字<br />   toScope属性:指定这个变量的存放范围，如果没有设置toScope属性，则这个变量存放在<br />                            page范围内<br />   scope属性:指定javabean范围<br />   给id属性定义的变量赋值有三种方式：<br />      （1）.设置value属性，此时id属性定义的变量为字符串类型，value属性代表这个变量的<br />              字符串值<br />      （2）.同时设置name和property属性。name属性指定一个已经存在的bean，property属性<br />             指定已经存在的bean的某个属性，id属性定义的变量的值由property属性决定<br />      （3）.同时设置name属性和type属性。name属性指定一个已经存在的javabean，type属性<br />             指定这个javabean的完整类名，id属性定义的变量引用这个已经存在的javabean<br />              对于由name属性指定的已经存在的javabean，在默认情况下&lt;bean:define&gt;标签会<br />              依次在page,request,session和application范围寻找这个javabean，也可以设置scope<br />              属性，明确指定这个javabean的范围<br /><font color="#0000cc">&lt;bean:write&gt;:</font>显示javabean或其属性的内容<br />   name属性:指定已经存在的变量<br />   property属性:指定bean的属性<br />   format属性:设置输出数据的格式<br />   filter属性:默认值为true。如果值为true，将把输出内容中特殊的HTML符号作为普通字符串<br />                     显示，如果为false，则不会转化为普通字符串<br />   如果希望输出bean的某个属性值，应该同时设置name属性和property属性<br /><font color="#0000cc">&lt;bean:size&gt;:</font>获得Map或Collection集合的长度<br />   id属性:定义一个Integer类型的变量，值为Map，collection或数组的长度<br />   name属性:指定已经存在的Map，collection或数组变量<br /><br />大多数bean标签具有以下<font color="#ff0000">共同属性</font>：<br />   id属性：定义一个变量，默认情况下该变量存放在page范围内。对于&lt;bean:define&gt;标签，它<br />                 的toScope属性可以指定这个变量的存放范围<br />   name属性：指定已经存在的javabean的名字。property属性指定这个javabean的某个属性，<br />                        scope属性指定这个javabean的范围，可选值为page,request,session和application<br />                        如果没有设置scope属性，将依次从page,request,session和application范围内寻<br />                        找这个javabean</font></font>
		</p>
<img src ="http://www.blogjava.net/yanpeng/aggbug/86014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yanpeng/" target="_blank">宝贝小猪唛</a> 2006-12-07 10:06 <a href="http://www.blogjava.net/yanpeng/articles/86014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts-处理标单跨页</title><link>http://www.blogjava.net/yanpeng/articles/85765.html</link><dc:creator>宝贝小猪唛</dc:creator><author>宝贝小猪唛</author><pubDate>Wed, 06 Dec 2006 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/yanpeng/articles/85765.html</guid><wfw:comment>http://www.blogjava.net/yanpeng/comments/85765.html</wfw:comment><comments>http://www.blogjava.net/yanpeng/articles/85765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yanpeng/comments/commentRss/85765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yanpeng/services/trackbacks/85765.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">有的时候由于表单数据太多，无法在同一个页面显示，可以把它拆分成多个表单，<br />分多个页面显示，这种情况下，既可以为每个表单创建单独的ActionForm，<br />也可以只创建一个ActionForm和多个表单对应<br /><br />例：<br />insertForm表单包含三个字段：name,phone,address，把它分成两个表单。<br />第一个表单在insertContent.jsp中，包含name和phone字段。<br />第二个表单在insertContent_next.jsp中，包含address字段，<br />它们分别对应不同的Action:"/insert1"和"/insert2"，但是这两个Action与同一个Actionform映射<br />1.把html表单拆分到多个jsp页面中<br />   可以在每个表单中定义一个隐含字段&lt;html:hidden property="page"/&gt;代表当前页面编号<br /><br />   insertContent.jsp中定义html表单的代码<br />   &lt;html:form action="/insert1.do" focus="title"&gt;<br />      <font color="#ff0000">&lt;html:hidden property="page" value="1"/&gt;<br /></font>      ...........................<br />   &lt;/html:form&gt;<br /><br />   insertContent_next.jsp中定义html表单的代码<br />   &lt;html:form action="/insert1.do" focus="title"&gt;<br />      <font color="#ff0000">&lt;html:hidden property="page" value="2"/&gt;<br /></font>      ...........................<br />   &lt;/html:form&gt;<br /><br />2.创建和多个html表单对应的ActionForm<br />   以上两个html表单都对应InsertForm Bean，在创建时应注意以下几点<br />      (1).提供和html表单隐藏字段page对应的page属性<br />            private String page = null;<br />            public String getPage(){<br />               return page;<br />            }<br />            public void setPage(){<br />            this.page = page;<br />            }<br />      (2).在reset()方法中只能把和当前正在处理的表单相关的属性恢复为默认值<br />            否则将使上一页表单数据丢失。<br />            由于struts先调用reset()方法，再把用户输入的表单数据组装到ActionForm中，<br />            因此在reset()中不能根据page属性判断处理的是哪个页面，<br />            应直接从HttpServletRequest对象中读取当前表单的page字段值<br />            <font color="#ff0000">int numPage = new Ingeter(request.getParameter("page")).intValue();<br />    </font><font color="#000000">  (3).在validate()方法中，仅对和当前表单相关的属性进行验证<br />            由于在调用validate()方法前已经把数据组装到ActionForm中，<br />            因此在validate()中可以根据page属性决定正在处理那个表单<br />代码如下：<br />public void reset(ActionMapping mapping, HttpServletRequest request) {<br />        int numPage=0;<br />        try{ <br />            numPage=new Integer(request.getParameter("page")).intValue();<br />        }catch(Exception e){}        <br />        <font color="#ff0000">if(numPage==1){</font><br />            name=null;<br />            phone=null;<br />        }     <br />      <font color="#ff0000"> if(numPage==2){</font><br />         address=null;<br />       }<br />       page=null;<br />}<br /><br /><br />public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {<br /></font></font>
				<font size="2">
						<font color="#000000">            ActionErrors errors = new ActionErrors();<br />            int numPage=0;<br />            try{ <br />               numPage=new Integer(page).intValue();<br />            }catch(Exception e){}        <br />          <font color="#ff0000"> if(numPage==1){</font><br />                if (((name == null) || (name.length() &lt; 1)))<br />                     errors.add("name", new ActionMessage("error.name.required"));<br />           if(((phone == null)|| (phone.length() &lt; 1)))<br />                     errors.add("phone", new ActionMessage("error.phone.required"));<br />           }     <br />           <font color="#ff0000">if(numPage==2){</font><br />                if(((address == null)|| (address.length() &lt; 1)))<br />                     errors.add("address", new ActionMessage("error.address.required"));<br />           }<br />        return errors;<br /></font>
				</font>
				<font size="2">
						<font color="#000000">      }<br /><br />3.配置ActionForm和多个Action映射<br />   当ActionForm与多个表单对应时，应该把ActionForm存放在session范围内<br />   本例中当用户提交第一个表单时，请求由org.apache.struts.actions.ForwardAction处理<br />   以下是&lt;action&gt;元素配置代码<br />   &lt;action path="/insert1"<br /><font color="#ff0000">                  parameter="/insert_next.jsp"<br />                  type="org.apache.struts.actions.ForwardAction"<br /></font>                  name="insertForm"<br />                  scope="session"<br />                  input="/insert.jsp"<br />                  validate="true"&gt;<br />   &lt;/action&gt;<br />   &lt;action path="/insert2"<br />                  type="address.actions.InsertAction"<br />                  name="insertForm"<br />                  <font color="#ff0000">scope="session"<br /></font>                  input="/insert_next.jsp"<br />                  validate="true"&gt;<br />   &lt;/action&gt;</font>
				</font>
		</p>
<img src ="http://www.blogjava.net/yanpeng/aggbug/85765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yanpeng/" target="_blank">宝贝小猪唛</a> 2006-12-06 10:19 <a href="http://www.blogjava.net/yanpeng/articles/85765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts的工作流程</title><link>http://www.blogjava.net/yanpeng/articles/84884.html</link><dc:creator>宝贝小猪唛</dc:creator><author>宝贝小猪唛</author><pubDate>Fri, 01 Dec 2006 08:37:00 GMT</pubDate><guid>http://www.blogjava.net/yanpeng/articles/84884.html</guid><wfw:comment>http://www.blogjava.net/yanpeng/comments/84884.html</wfw:comment><comments>http://www.blogjava.net/yanpeng/articles/84884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yanpeng/comments/commentRss/84884.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yanpeng/services/trackbacks/84884.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">在web应用启动时就会加载并初始化ActionServlet,ActionServlet从struts-config.xml中读取配置信息<br /><br />当ActionServlet接受到一个客户请求时，执行以下流程<br /><br />1.检索和用户请求匹配的ActionMapping实例，如果不存在，就返回用户请求路径无效的信息<br />2.如果ActionForm实例不存在，就创建一个ActionForm对象，把客户提交的表单数据保存到ActionForm对象中<br />3.根据配置信息决定是否需要表单验证，如需要就调用ActionForm的validate（）方法<br />4.如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象，就表示表单验证成功<br />5.ActionServlet根据ActionMapping实例包含的映射信息决定将请求发给那个Action，如果相应的Action实例不存在，就先创建这个实例，然后调用Action的execute()方法<br />6.Action的execute()方法返回一个ActionForward对象，ActionServlet再把客户请求转发给ActionForward对象指向的jsp组件<br />7.ActionForward对象指向的jsp组件生成动态网页返回给客户</font>
		</p>
<img src ="http://www.blogjava.net/yanpeng/aggbug/84884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yanpeng/" target="_blank">宝贝小猪唛</a> 2006-12-01 16:37 <a href="http://www.blogjava.net/yanpeng/articles/84884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts-Tiles使用</title><link>http://www.blogjava.net/yanpeng/articles/84849.html</link><dc:creator>宝贝小猪唛</dc:creator><author>宝贝小猪唛</author><pubDate>Fri, 01 Dec 2006 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/yanpeng/articles/84849.html</guid><wfw:comment>http://www.blogjava.net/yanpeng/comments/84849.html</wfw:comment><comments>http://www.blogjava.net/yanpeng/articles/84849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yanpeng/comments/commentRss/84849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yanpeng/services/trackbacks/84849.html</trackback:ping><description><![CDATA[
		<font size="2">Tiles框架建立在jsp的include指令基础之上，为创建web页面提供了一种模版机制<br /><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'"> </span></span></span>特性：  <br />    a.创建可重用的模版<br />    b.动态构建和装载页面<br />    c.定义可重用的Tiles组件<br />    d.支持国际化<br /><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'"> </span></span></span>Tiles框架包含以下内容<br />   a.Tiles标签库<br />   b.Tiles组件的配置文件<br />   c.TilesPlugIn插件<br /><br /></font>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo1; tab-stops: list 21.0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN">
								<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'"> </span></span>
						</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Century; mso-hansi-font-family: Century">安装所需文件</span>
						<span lang="EN-US" style="mso-fareast-font-family: SimSun; mso-fareast-language: ZH-CN">
								<font face="Century">,</font>
						</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Century; mso-hansi-font-family: Century">如果在</span>
						<span lang="EN-US" style="mso-fareast-font-family: SimSun; mso-fareast-language: ZH-CN">
								<font face="Century">web</font>
						</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Century; mso-hansi-font-family: Century">应用中使用</span>
						<span lang="EN-US" style="mso-fareast-font-family: SimSun; mso-fareast-language: ZH-CN">
								<font face="Century">tiles</font>
						</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Century; mso-hansi-font-family: Century">标签库，以下文件必须在</span>
						<span lang="EN-US" style="mso-fareast-font-family: SimSun; mso-fareast-language: ZH-CN">
								<font face="Century">WEB-INF/lib</font>
						</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Century; mso-hansi-font-family: Century">目录中。</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l2 level3 lfo1; tab-stops: list 63.0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN">
								<span style="mso-list: Ignore">²<span style="FONT: 7pt 'Times New Roman'">        </span></span>
						</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts.jar</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l2 level3 lfo1; tab-stops: list 63.0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN">
								<span style="mso-list: Ignore">²<span style="FONT: 7pt 'Times New Roman'">        </span></span>
						</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Commons-digester.jar</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l2 level3 lfo1; tab-stops: list 63.0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN">
								<span style="mso-list: Ignore">²<span style="FONT: 7pt 'Times New Roman'">        </span></span>
						</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Commons-beanutils.jar</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l2 level3 lfo1; tab-stops: list 63.0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN">
								<span style="mso-list: Ignore">²<span style="FONT: 7pt 'Times New Roman'">        </span></span>
						</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Commons-collections.jar</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l2 level3 lfo1; tab-stops: list 63.0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN">
								<span style="mso-list: Ignore">²<span style="FONT: 7pt 'Times New Roman'">        </span></span>
						</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Commons-logging.jar</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 42pt">
				<font size="2">
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">把</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">struts-tiles.tld</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">文件放到</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">WEN-INF</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">目录下</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo1; tab-stops: list 21.0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN">
								<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'"></span></span>
						</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">在</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">web.xml</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">中配置</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 42pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">&lt;taglib&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 42pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">
								<span style="mso-tab-count: 1">        </span>&lt;taglib-uri&gt;/WEB-INF/struts-tiles.tld&lt;/taglib-uri&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 42pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">
								<span style="mso-tab-count: 1">        </span>&lt;taglib-location&gt;/WEB-INF/struts-tiles.tld&lt;/taglib-location&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 42pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">&lt;/taglib&gt;</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo1; tab-stops: list 21.0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN">
								<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'"></span></span>
						</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">在专门的</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">xml</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">中配置</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">tiles</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">组件，该文件在</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">WEB-INF</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">下</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">      &lt;tiles-definitions&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 21pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">
								<span style="mso-tab-count: 1">    </span>&lt;definition name=”index-definition” path=”/layout.jsp”&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 21pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">
								<span style="mso-tab-count: 2">       </span>&lt;put name=”sidebar” value=”sidebar.jsp”/&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 21pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">
								<span style="mso-tab-count: 2">       </span>&lt;put name=”header” value=”header.jsp”/&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 21pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">
								<span style="mso-tab-count: 2">       </span>&lt;put name=”content” value=”indexContent.jsp”/&gt;<br />       </font>
				</span>
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">&lt;put name=”footer” value=”footer.jsp”/&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">
								<span style="mso-tab-count: 1">        </span>&lt;/definition&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">      &lt;/tiles-definitions&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo1; tab-stops: list 21.0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN">
								<span style="mso-list: Ignore">l</span>
						</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">在</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">struts</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">配置文件</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">(struts-config.xml)</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">中配置</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">TilesPlugin</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">插件</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">         &lt;plug-in className=”org.apache.struts.tiles.TilesPlugin”&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">         &lt;set-property property=”definitions-config” value=”/WEN-INF/tiles-defs.xml”/&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">         &lt;set-property property=”definitions-parser-validate” value=”true”/&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
						<font size="2">         &lt;/plug-in&gt;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo3; tab-stops: list 63.0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN">
								<span style="mso-list: Ignore">²<span style="FONT: 7pt 'Times New Roman'">        </span></span>
						</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">definitions-config</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">参数指定</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">tiles</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">组件的配置文件</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo3; tab-stops: list 63.0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN">
								<span style="mso-list: Ignore">²<span style="FONT: 7pt 'Times New Roman'">        </span></span>
						</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">definitions-parser-validate</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">参数指定</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">xml</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">解析器是否验证</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">tiles</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">配置文件，默认值为</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">true<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN">
								<span style="mso-list: Ignore">l</span>
						</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">在</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">web.xml</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">中配置</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">ActionServlet</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt">
				<font size="2">
						<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN">
								<span style="mso-list: Ignore">l</span>
						</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">在</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">.jsp</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">文件中插入</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">tiles</span>
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">组件</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt 21pt">
				<font size="2">
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">如</span>
						<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">&lt;tiles:insert definition=”index-definition”&gt;</span>
						<span lang="EN-US" style="mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
<img src ="http://www.blogjava.net/yanpeng/aggbug/84849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yanpeng/" target="_blank">宝贝小猪唛</a> 2006-12-01 15:07 <a href="http://www.blogjava.net/yanpeng/articles/84849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>运用Jakarta Struts的七大实战心法</title><link>http://www.blogjava.net/yanpeng/articles/84826.html</link><dc:creator>宝贝小猪唛</dc:creator><author>宝贝小猪唛</author><pubDate>Fri, 01 Dec 2006 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/yanpeng/articles/84826.html</guid><wfw:comment>http://www.blogjava.net/yanpeng/comments/84826.html</wfw:comment><comments>http://www.blogjava.net/yanpeng/articles/84826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yanpeng/comments/commentRss/84826.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yanpeng/services/trackbacks/84826.html</trackback:ping><description><![CDATA[
		<font color="#ff99ff">
				<font color="#ff0099">
						<font style="BACKGROUND-COLOR: #ffffff">1. 只在必要的时候才考虑扩展Struts框架</font>
						<br />
				</font>
				<br />一个好的framework有很多优点，首先，它必须能够满足用户的可预见的需求。为此 Struts为Web 应用提供了一个通用的架构，这样开发人员可以把精力集中在如何解决实际业务问题上。其次，一个好的framework还必须能够在适当的地方提供扩展接口，以便应用程序能扩展该框架来更好的适应使用者的实际需要。<br /><br />如果Struts framework在任何场合，任何项目中都能很好的满足需求，那真是太棒了。但是实际上，没有一个框架声称能做到这一点。一定会有一些特定的应用需求是框架的开发者们无法预见到的。因此，最好的办法就是提供足够的扩展接口，使得开发工程师能够调整struts来更好的符合他们的特殊要求。<br /><br />在Struts framework中有很多地方可供扩展和定制。几乎所有的配置类都能被替换为某个用户定制的版本，这只要简单的修改一下Struts的配置文件就可以做到。<br /><br />其他组件如ActionServlet和 RequestProcessor 也能用自定义的版本代替. 甚至连Struts 1.1里才有的新特性也是按照扩展的原则来设计的。例如，在异常处理机制中就允许用户定制异常处理的句柄，以便更好的对应用系统发生的错误做出响应。<br /><br />作为框架的这种可调整特性在它更适合你的应用的同时也在很大的程度上影响了项目开发的效果。首先，由于您的应用是基于一个现有的成熟的、稳定的framework如Struts，测试过程中发现的错误数量将会大大减少，同时也能缩短开发时间和减少资源的投入。因为你不再需要投入开发力量用于编写基础框架的代码了。<br /><br />然而, 实现更多的功能是要花费更大的代价的。我们必须小心避免不必要的滥用扩展性能， Struts是由核心包加上很多工具包构成的，它们已经提供了很多已经实现的功能。因此不要盲目的扩展Struts框架，要先确定能不能采用其他方法使用现有的功能来实现。 在决定编写扩展代码前务必要确认Struts的确没有实现你要的功能。否则重复的功能会导致混乱将来还得花费额外的精力清除它。<br /><br /><font color="#ff0099">2. 使用异常处理声明</font><br /><br />要定义应用程序的逻辑流程，成熟的经验是推荐在代码之外，用配置的方法来实现，而不是写死在程序代码中的。在J2EE中，这样的例子比比皆是。从实现EJB的安全性和事务性行为到描述JMS消息和目的地之间的关系，很多运行时的处理流程都是可以在程序之外定义的。<br /><br />Struts 创建者从一开始就采用这种方法，通过配置Struts的配置文件来定制应用系统运行时的各个方面。这一点在版本1.1的新特性上得到延续，包括新的异常处理功能。在Struts framework以前的版本中，开发人员不得不自己处理Struts应用中发生的错误情况。在最新的版本中，情况大大的改观了，Struts Framework提供了内置的一个称为 ExceptionHandler 的类， 用于系统缺省处理action类运行中产生的错误。这也是在上一个技巧中我们提到的framework许多可扩展接口之一。<br /><br />Struts缺省的 ExceptionHandler类会生成一个ActionError对象并保存在适当的范围（scope）对象中。这样就允许JSP页面使用错误类来提醒用户出现什么问题。如果你认为这不能满足你的需求，那么可以很方便的实现你自己的ExcepionHandler类。<br /><br />具体定制异常处理的方法和机制<br /><br />要定制自己的异常处理机制，第一步是继承org.apache.struts.action.ExceptionHandler类。这个类有2个方法可以覆盖，一个是excute()另外一个是storeException(). 在多数情况下，只需要覆盖其中的excute()方法。下面是ExceptionHandler类的excute()方法声明：<br /><br /><br /><br />正如你看到的，该方法有好几个参数，其中包括原始的异常。方法返回一个ActionForward对象，用于异常处理结束后将controller类带到请求必须转发的地方去。<br /><br />当然您可以实现任何处理，但一般而言，我们必须检查抛出的异常,并针对该类型的异常进行特定的处理。缺省的，系统的异常处理功能是创建一个出错信息，同时把请求转发到配置文件中指定的地方去。 定制异常处理的一个常见的例子是处理嵌套异常。假设该异常包含有嵌套异常，这些嵌套异常又包含了其他异常，因此我们必须覆盖原来的execute()方法，对每个异常编写出错信息。<br /><br />一旦你创建了自己的ExceptionHandler 类，就应该在Struts配置文件中的部分声明这个类，以便让Struts知道改用你自定义的异常处理取代缺省的异常处理. <br /><br />可以配置你自己的ExceptionHandler 类是用于Action Mapping特定的部分还是所有的Action对象。如果是用于Action Mapping特定的部分就在<action>元素中配置。如果想让这个类可用于所有的Action对象,可以在<global-sections> 元素中指定。例如，假设我们创建了异常处理类CustomizedExceptionHandler用于所有的Action类, <global-exceptions>元素定义如下所示：<br /><br /><br /><br />在<exception />元素中可以对很多属性进行设置。在本文中，最重要的属性莫过于handler属性, handler属性的值就是自定义的继承了ExceptionHandler类的子类的全名。 假如该属性没有定义，Struts会采用自己的缺省值。当然，其他的属性也很重要，但如果想覆盖缺省的异常处理的话，handler无疑是最重要的属性。<br /><br />最后必须指出的一点是，你可以有不同的异常处理类来处理不同的异常。在上面的例子中，CustomizedExceptionHandler用来处理任何java.lang.Exception的子类. 其实，你也可以定义多个异常处理类，每一个专门处理不同的异常树。下面的XML片断解释了如何配置以实现这一点。<br /><br /><br /><br />在这里，一旦有异常抛出，struts framework将试图在配置文件中找到ExceptionHandler，如果没有找到，那么struts将沿着该异常的父类链一层层往上找直到发现匹配的为止。因此，我们可以定义一个层次型的异常处理关系结构，在配置文件中已经体现了这一点。<br /><br /><font color="#ff0099">3. 使用应用模块（Application Modules）<br /></font><br />Struts 1.1的一个新特性是应用模块的概念。应用模块允许将单个Struts应用划分成几个模块，每个模块有自己的Struts配置文件，JSP页面，Action等等。这个新特性是为了解决大中型的开发队伍抱怨最多的一个问题，即为了更好的支持并行开发允许多个配置文件而不是单个配置文件。<br /><br />注：在早期的beta版本中，该特性被称为子应用（sub-applications），最近的改名目的是为了更多地反映它们在逻辑上的分工。<br /><br />显然，当很多开发人员一起参加一个项目时，单个的Struts配置文件很容易引起资源冲突。应用模块允许Struts按照功能要求进行划分，许多情况已经证明这样更贴近实际。例如，假设我们要开发一个典型的商店应用程序。可以将组成部分划分成模块比如catalog（商品目录）, customer（顾客）, customer service（顾客服务）, order（订单）等。每个模块可以分布到不同的目录下，这样各部分的资源很容易定位，有助于开发和部署。图1 显示了该应用的目录结构。 <br /><br />注：如果你无需将项目划分成多个模块，Struts框架支持一个缺省的应用模块。这就使得应用程序也可以在1.0版本下创建，具有可移植性，因为应用程序会自动作为缺省的应用模块。<br /><br />为了使用多应用模块功能，必须执行以下几个准备步骤：<br /><br />1. 为每个应用模块创建独立的Struts配置文件。<br /><br />2. 配置Web 部署描述符 Web.xml文件。<br /><br />3. 使用org.apache.struts.actions.SwitchAction 来实现程序在模块之间的跳转. <br /><br />创建独立的Struts配置文件<br /><br />每个Struts应用模块必须拥有自己的配置文件。允许创建自己的独立于其他模块的Action，ActionForm，异常处理甚至更多。<br /><br />继续以上面的商店应用程序为例，我们可以创建以下的配置文件：一个文件名为struts-config-catalog.xml，包含catalog（商品目录）、items(商品清单)、和其它与库存相关的功能的配置信息；另一个文件名为struts- config-order.xml, 包含对order（订单）和order tracking（订单跟踪）的设置。第三个配置文件是struts-config.xml,其中含有属于缺省的应用模块中的一般性的功能。<br /><br />配置Web部署描述符 <br /><br />在Struts的早期版本中，我们在Web.xml中指定Struts配置文件的路径。好在这点没变，有助于向后兼容。但对于多个应用模块，我们需要在Web部署描述符中增加新的配置文件的设定。<br /><br />对于缺省的应用（包括Struts的早期版本），Struts framework 在Web.xml文件中查找带有config的元素<init-param>，用于载入Action mapping 和其它的应用程序设定。作为例子，以下的XML片断展现一个典型的<init-param>元素：<br /><br /><br /><br />注：如果在现有的<init-param>元素中找不到\"config\"关键字，Struts framework将缺省地使用/WEB/struts-config.xml<br /><br />为了支持多个应用模块(Struts 1.1的新特性)，必须增加附加的<init-param>元素。与缺省的<init-param>元素不同的是，附加的<init-param>元素与每个应用模块对应，必须以config/xxx的形式命名，其中字符串xxx代表该模块唯一的名字。例如，在商店应用程序的例子中，<init-param>元素可定义如下（注意粗体字部分）：<br /><br />第一个 <init-param>元素对应缺省的应用模块。第二和第三个元素分别代表非缺省应用模块catalog 和 order。<br /><br />当Struts载入应用程序时，它首先载入缺省应用模块的配置文件。然后查找带有字符串config/xxx 形式的附加的初始化参数。对每个附加的配置文件也进行解析并载入内存。这一步完成后，用户就可以很随意地用config/后面的字符串也就是名字来调用相应的应用模块。<br /><br />多个应用模块之间调用Action类<br /><br />在为每个应用模块创建独立的配置文件之后，我们就有可能需要调用不同的模块中Action。为此必须使用Struts框架提供的SwitchAction类。Struts 会自动将应用模块的名字添加到URL,就如Struts 自动添加应用程序的名字加到URL一样。应用模块是对框架的一个新的扩充，有助于进行并行的团队开发。如果你的团队很小那就没必要用到这个特性，不必进行模块化。当然，就算是只有一个模块，系统还是一样的运作。<br /><br /><font color="#ff0099">4. 把JSP放到WEB-INF后以保护JSP源代码</font><br /><br />为了更好地保护你的JSP避免未经授权的访问和窥视， 一个好办法是将页面文件存放在Web应用的WEB-INF目录下。<br /><br />通常JSP开发人员会把他们的页面文件存放在Web应用相应的子目录下。一个典型的商店应用程序的目录结构如图2所示。跟catalog （商品目录）相关的JSP被保存在catalog子目录下。跟customer相关的JSP，跟订单相关的JSP等都按照这种方法存放。<br /><br /><br />这种方法的问题是这些页面文件容易被偷看到源代码，或被直接调用。某些场合下这可能不是个大问题，可是在特定情形中却可能构成安全隐患。用户可以绕过Struts的controller直接调用JSP同样也是个问题。<br /><br />为了减少风险，可以把这些页面文件移到WEB-INF 目录下。基于Servlet的声明，WEB-INF不作为Web应用的公共文档树的一部分。因此，WEB-INF 目录下的资源不是为客户直接服务的。我们仍然可以使用WEB-INF目录下的JSP页面来提供视图给客户，客户却不能直接请求访问JSP。<br /><br />采用前面的例子，图3显示将JSP页面移到WEB-INF 目录下后的目录结构<br /><br /><br />如果把这些JSP页面文件移到WEB-INF 目录下，在调用页面的时候就必须把\"WEB-INF\"添加到URL中。例如，在一个Struts配置文件中为一个logoff action写一个Action mapping。其中JSP的路径必须以\"WEB-INF\"开头。如下所示：请注意粗体部分.<br /><br />这个方法在任何情况下都不失为Struts实践中的一个好方法。是唯一要注意的技巧是你必须把JSP和一个Struts action联系起来。即使该Action只是一个很基本的很简单JSP，也总是要调用一个Action，再由它调用JSP。<br /><br />最后要说明的是，并不是所有的容器都能支持这个特性。WebLogic早期的版本不能解释Servlet声明，因此无法提供支持，据报道在新版本中已经改进了。总之使用之前先检查一下你的Servlet容器。<br /><br /><font color="#ff0099">5. 使用 Prebuilt Action类提升开发效率</font><br /><br />Struts framework带有好几个prebuilt Action类，使用它们可以大大节省开发时间。其中最有用的是org.apache.struts.actions.ForwardAction 和 org.apache.struts.actions.DispatchAction.<br /><br />使用 ForwardAction<br /><br />在应用程序中，可能会经常出现只要将Action对象转发到某个JSP的情况。在上一点中曾提到总是由Action调用JSP是个好习惯。如果我们不必在Action中执行任何业务逻辑，却又想遵循从Action访问页面的话，就可以使用ForwardAction，它可以使你免去创建许多空的Action类。运用ForwardAction的好处是不必创建自己的Action类，你需要做的仅仅是在Struts配置文件中配置一个Action mapping。<br /><br />举个例子，假定你有一个JSP文件index.jsp ，而且不能直接调用该页面，必须让程序通过一个Action类调用，那么，你可以建立以下的Action mapping来实现这一点：<br /><br />正如你看到的，当 /home 被调用时, 就会调用ForwardAction 并把请求转发到 index.jsp 页面.<br /><br />再讨论一下不通过一个Action类直接转发到某个页面的情况，必须注意我们仍然使用<action>元素中的forward属性来实现转发的目标。这时<action>元素定义如下：<br /><br />以上两种方法都可以节省你的时间，并有助于减少一个应用所需的文件数。<br /><br />使用 DispatchAction<br /><br />DispatchAction是Struts包含的另一个能大量节省开发时间的Action类。与其它Action类仅提供单个execute()方法实现单个业务不同，DispatchAction允许你在单个Action类中编写多个与业务相关的方法。这样可以减少Action类的数量，并且把相关的业务方法集合在一起使得维护起来更容易。<br /><br />要使用DispatchAction的功能，需要自己创建一个类，通过继承抽象的DispatchAction得到。对每个要提供的业务方法必须有特定的方法signature。例如，我们想要提供一个方法来实现对购物车添加商品清单，创建了一个类ShoppingCartDispatchAction提供以下的方法：<br /><br />那么，这个类很可能还需要一个deleteItem()方法从客户的购物车中删除商品清单，还有clearCart()方法清除购物车等等。这时我们就可以把这些方法集合在单个Action类，不用为每个方法都提供一个Action类。<br /><br />在调用ShoppingCartDispatchAction里的某个方法时，只需在URL中提供方法名作为参数值。就是说，调用addItem()方法的 URL看起来可能类似于：<br /><br />http://myhost/storefront/action/cart?method=addItem<br /><br />其中method参数指定ShoppingCartDispatchAction中要调用的方法。参数的名称可以任意配置，这里使用的\"method\"只是一个例子。参数的名称可以在Struts配置文件中自行设定。<br /><br /><font color="#ff0099">6.使用动态ActionForm</font><br /><br />在Struts framework中，ActionForm对象用来包装HTML表格数据（包括请求），并返回返回动态显示给用户的数据。它们必须是完全的JavaBean，并继承.Struts　里面的ActionForm类，同时，用户可以有选择地覆盖两个缺省方法。<br /><br />该特性能节省很多时间，因为它可以协助进行自动的表现层的验证。ActionForm的唯一缺点是必须为不同的HTML表格生成多个ActionForm 类以保存数据。例如，如果有一个页面含有用户的注册信息，另一个页面则含有用户的介绍人的信息，那么就需要有两个不同的ActionForm类。这在大的应用系统中就会导致过多的ActionForm类。Struts 1.1对此做出了很好的改进，引入了动态ActionForm类概念<br /><br />通过Struts framework中的DynaActionForm类及其子类可以实现动态的ActionForm ，动态的ActionForm允许你通过Struts的配置文件完成ActionForm的全部配置；再也没有必要在应用程序中创建具体的ActionForm类。具体配置方法是：在Struts的配置文件通过增加一个<form-bean>元素，将type属性设定成DynaActionForm或它的某个子类的全名。下面的例子创建了一个动态的ActionForm名为logonForm，它包含两个实例变量：username 和 password.<br /><br /><br /><br />动态的ActionForm可以用于Action类和JSP，使用方法跟普通的ActionForm相同，只有一个小差别。如果使用普通的ActionForm对象则需要提供get 和 set方法取得和设置数据。以上面的例子而言，我们需要提供getUsername() 和 setUsername()方法取得和设置username变量，同样地有一对方法用于取得和设置password变量.<br /><br />这里我们使用的是DynaActionForm，它将变量保存在一个Map类对象中，所以必须使用DynaActionForm 类中的get(name) 和 set(name)方法，其中参数name是要访问的实例变量名。例如要访问DynaActionForm中username的值，可以采用类似的代码：<br /><br />String username = (String)form.get(\"username\");<br /><br />由于值存放在一个Map对象，所以要记得对get()方法返回的Object对象做强制性类型转换。<br /><br />DynaActionForm有好几个很有用的子类。其中最重要的是DynaValidatorForm ，这个动态的ActionForm和Validator 一起利用公共的Validator包来提供自动验证。这个特性使你得以在程序代码之外指定验证规则。将两个特性结合使用对开发人员来说将非常有吸引力。<br /><br /><font color="#ff0099">7. 使用可视化工具<br /></font><br />自从Struts 1.0 分布以来，就出现了不少可视化工具用于协助创建，修改和维护Struts的配置文件。配置文件本身是基于XML格式，在大中型的开发应用中会增大变得很笨拙。为了更方便的管理这些文件，一旦文件大到你无法一目了然的时候，建议试着采用其中的一种GUI 工具协助开发。商业性的和开放源代码的工具都有不少，表1列出了可用的工具和其相关链接，从那里可以获取更多信息。<br /><br />表 1. Struts GUI 工具<br />应用程序 性质 网址 <br />Adalon 商业软件 http://www.synthis.com/products/adalon <br />Easy Struts 开放源码 http://easystruts.sourceforge.net/ <br />Struts Console 免费 http://www.jamesholmes.com/struts/console <br />JForms 商业软件 http://www.solanasoft.com/ <br />Camino 商业软件 http://www.scioworks.com/scioworks_camino.html <br />Struts Builder 开放源码 http://sourceforge.net/projects/rivernorth/ <br />StrutsGUI 免费 http://www.alien-factory.co.uk/struts/struts-index.html <br /></form-bean></action></action></init-param></init-param></init-param></init-param></init-param></init-param></init-param></init-param></global-exceptions></global-sections></action></font>
<img src ="http://www.blogjava.net/yanpeng/aggbug/84826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yanpeng/" target="_blank">宝贝小猪唛</a> 2006-12-01 14:17 <a href="http://www.blogjava.net/yanpeng/articles/84826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>