﻿<?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-lanxin1020-随笔分类-struts1</title><link>http://www.blogjava.net/lanxin1020/category/38970.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 11 May 2009 09:55:39 GMT</lastBuildDate><pubDate>Mon, 11 May 2009 09:55:39 GMT</pubDate><ttl>60</ttl><item><title>struts-config.xml文件配置</title><link>http://www.blogjava.net/lanxin1020/archive/2009/05/11/270067.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Mon, 11 May 2009 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/lanxin1020/archive/2009/05/11/270067.html</guid><wfw:comment>http://www.blogjava.net/lanxin1020/comments/270067.html</wfw:comment><comments>http://www.blogjava.net/lanxin1020/archive/2009/05/11/270067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lanxin1020/comments/commentRss/270067.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lanxin1020/services/trackbacks/270067.html</trackback:ping><description><![CDATA[<p>以下是一份完整的struts-config.xml文件,配置元素的说明详见注释.<br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE struts-config PUBLIC<br />
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"<br />
"http://jakarta.apache.org/struts/dtds/struts-config.dtd"&gt;<br />
&lt;!-- struts-config.xml中的元素必须按照上述doc指令中的dtd文档定义顺序书写，本例即遵从了dtd定义顺序 --&gt;<br />
&lt;!-- struts-config是整个xml的根元素，其他元素必须被包含其内 --&gt;<br />
&lt;struts-config&gt;<br />
&lt;!--<br />
&nbsp;&nbsp; 名称:data-sources<br />
&nbsp;&nbsp; 描述：data-sources元素定义了web App所需要使用的数据源<br />
&nbsp;&nbsp; 数量：最多一个<br />
&nbsp;&nbsp; 子元素:data-source<br />
--&gt;<br />
&lt;data-sources&gt;<br />
&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp; 名称：data-source<br />
&nbsp;&nbsp;&nbsp; 描述：data-source元素定义了具体的数据源<br />
&nbsp;&nbsp;&nbsp; 数量：任意多个<br />
&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp;&nbsp; @key：当需要配置多个数据源时，相当于数据源的名称，用来数据源彼此间进行区别<br />
&nbsp;&nbsp;&nbsp;&nbsp; @type：可以使用的数据源实现的类，一般来自如下四个库<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Poolman，开放源代码软件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expresso，Jcorporate<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDBC Pool，开放源代码软件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBCP，Jakarta<br />
&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp; &lt;data-source key="firstOne" type="org.apache.commons.dbcp.BasicDataSource"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp;&nbsp; 名称：set-property<br />
&nbsp;&nbsp;&nbsp;&nbsp; 描述：用来设定数据源的属性<br />
&nbsp;&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @autoCommit:是否自动提交 可选值：true/false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @description:数据源描述<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @driverClass:数据源使用的类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @maxCount:最大数据源连接数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @minCount:最小数据源连接数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @user:数据库用户<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @password:数据库密码<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @url:数据库url<br />
&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;set-property property="autoCommit" value="true"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;set-property property="description" value="Hello!"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;set-property property="driverClass" value="com.mysql.jdbc.Driver"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;set-property property="maxCount" value="10"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;set-property property="minCount" value="2"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;set-property property="user" value="root"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;set-property property="password" value=""/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;set-property property="url" value="jdbc:mysql://localhost:3306/helloAdmin"/&gt;<br />
&nbsp;&nbsp; &lt;/data-source&gt;<br />
&lt;/data-sources&gt;<br />
<br />
&lt;!--<br />
&nbsp;&nbsp; 名称：form-beans<br />
&nbsp;&nbsp; 描述：用来配置多个ActionForm Bean<br />
&nbsp;&nbsp; 数量：最多一个<br />
&nbsp;&nbsp; 子元素：form-bean<br />
--&gt;<br />
&lt;form-beans&gt;<br />
&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp; 名称：form-bean<br />
&nbsp;&nbsp;&nbsp; 描述：用来配置ActionForm Bean<br />
&nbsp;&nbsp;&nbsp; 数量：任意多个<br />
&nbsp;&nbsp;&nbsp; 子元素：form-property<br />
&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp;&nbsp; @className：指定与form-bean元素相对应的配置类，一般默认使用org.apaceh.struts.config.FormBeanConfig，如果自定义，则必须继承 FormBeanConfig<br />
&nbsp;&nbsp;&nbsp;&nbsp; @name：必备属性！为当前form-bean制定一个全局唯一的标识符，使得在整个Struts框架内，可以通过该标识符来引用这个ActionForm Bean。<br />
&nbsp;&nbsp;&nbsp;&nbsp; @type：必备属性！指明实现当前ActionForm Bean的完整类名。<br />
&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp; &lt;form-bean name="Hello" type="myPack.Hello"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp;&nbsp; 名称：form-property<br />
&nbsp;&nbsp;&nbsp;&nbsp; 描述：用来设定ActionForm Bean的属性<br />
&nbsp;&nbsp;&nbsp;&nbsp; 数量：根据实际需求而定，例如，ActionForm Bean对应的一个登陆Form中有两个文本框，name和password，ActionForm Bean中也有这两个字段，则此处编写两个form-property来设定属性<br />
&nbsp;&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @className：指定与form-property相对应的配置类，默认是org.apache.struts.config.FormPropertyConfig，如果自定义，则必须继承FormPropertyConfig类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @name：所要设定的ActionForm Bean的属性名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @type：所要设定的ActionForm Bean的属性值的类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @initial：当前属性的初值<br />
&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form-property name="name" type="java.lang.String"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form-property name="number" type="java.lang.Iteger" initial="18"/&gt;<br />
&nbsp;&nbsp; &lt;/form-bean&gt;<br />
&lt;/form-beans&gt;<br />
<br />
&lt;!--<br />
&nbsp;&nbsp; 名称：global-exceptions<br />
&nbsp;&nbsp; 描述：处理异常<br />
&nbsp;&nbsp; 数量：最多一个<br />
&nbsp;&nbsp; 子元素：exception<br />
--&gt;<br />
&lt;global-exceptions&gt;<br />
&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp; 名称：exception<br />
&nbsp;&nbsp;&nbsp; 描述：具体定义一个异常及其处理<br />
&nbsp;&nbsp;&nbsp; 数量：任意多个<br />
&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp;&nbsp; @className:指定对应exception的配置类，默认为org.apache.struts.config.ExceptionConfig<br />
&nbsp;&nbsp;&nbsp;&nbsp; @handler:指定异常处理类，默认为org.apache.struts.action.ExceptionHandler<br />
&nbsp;&nbsp;&nbsp;&nbsp; @key:指定在Resource Bundle种描述该异常的消息key<br />
&nbsp;&nbsp;&nbsp;&nbsp; @path:指定当发生异常时，进行转发的路径<br />
&nbsp;&nbsp;&nbsp;&nbsp; @scope:指定ActionMessage实例存放的范围，默认为request，另外一个可选值是session<br />
&nbsp;&nbsp;&nbsp;&nbsp; @type:必须要有！指定所需要处理异常类的名字。<br />
&nbsp;&nbsp;&nbsp;&nbsp; @bundle:指定资源绑定<br />
&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp; &lt;exception<br />
&nbsp;&nbsp;&nbsp; key=""hello.error<br />
&nbsp;&nbsp;&nbsp; path="/error.jsp"<br />
&nbsp;&nbsp;&nbsp; scope="session"<br />
&nbsp;&nbsp;&nbsp; type="hello.HandleError"/&gt;<br />
&lt;/global-exceptions&gt;<br />
<br />
&lt;!--<br />
&nbsp;&nbsp; 名称：global-forwards<br />
&nbsp;&nbsp; 描述：定义全局转发<br />
&nbsp;&nbsp; 数量：最多一个<br />
&nbsp;&nbsp; 子元素：forward<br />
--&gt;<br />
&lt;global-forwards&gt;<br />
&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp; 名称：forward<br />
&nbsp;&nbsp;&nbsp; 描述：定义一个具体的转发<br />
&nbsp;&nbsp;&nbsp; 数量：任意多个<br />
&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp;&nbsp; @className:指定和forward元素对应的配置类，默认为org.apache.struts.action.ActionForward<br />
&nbsp;&nbsp;&nbsp;&nbsp; @contextRelative:如果为true，则指明使用当前上下文，路径以&#8220;/&#8221;开头，默认为false<br />
&nbsp;&nbsp;&nbsp;&nbsp; @name:必须配有！指明转发路径的唯一标识符<br />
&nbsp;&nbsp;&nbsp;&nbsp; @path:必须配有！指明转发或者重定向的URI。必须以"/"开头。具体配置要与contextRelative相应。<br />
&nbsp;&nbsp;&nbsp;&nbsp; @redirect:为true时，执行重定向操作，否则执行请求转发。默认为false<br />
&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp; &lt;forward name="A" path="/a.jsp"/&gt;<br />
&nbsp;&nbsp; &lt;forward name="B" path="/hello/b.do"/&gt;<br />
&lt;/global-forwards&gt;<br />
<br />
&lt;!--<br />
&nbsp;&nbsp; 名称：action-mappings<br />
&nbsp;&nbsp; 描述：定义action集合<br />
&nbsp;&nbsp; 数量：最多一个<br />
&nbsp;&nbsp; 子元素：action<br />
--&gt;<br />
&lt;action-mappings&gt;<br />
&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp; 名称：action<br />
&nbsp;&nbsp;&nbsp; 描述：定义了从特定的请求路径到相应的Action类的映射<br />
&nbsp;&nbsp;&nbsp; 数量：任意多个<br />
&nbsp;&nbsp;&nbsp; 子元素：exception,forward（二者均为局部量）<br />
&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp;&nbsp; @attribute:制定与当前Action相关联的ActionForm Bean在request和session范围内的名称（key）<br />
&nbsp;&nbsp;&nbsp;&nbsp; @className:与Action元素对应的配置类。默认为org.apache.struts.action.ActionMapping<br />
&nbsp;&nbsp;&nbsp;&nbsp; @forward:指名转发的URL路径<br />
&nbsp;&nbsp;&nbsp;&nbsp; @include:指名包含的URL路径<br />
&nbsp;&nbsp;&nbsp;&nbsp; @input:指名包含输入表单的URL路径，表单验证失败时，请求会被转发到该URL中<br />
&nbsp;&nbsp;&nbsp;&nbsp; @name:指定和当前Acion关联的ActionForm Bean的名字。该名称必须在form-bean元素中定义过。<br />
&nbsp;&nbsp;&nbsp;&nbsp; @path:指定访问Action的路径，以"/"开头，没有扩展名<br />
&nbsp;&nbsp;&nbsp;&nbsp; @parameter:为当前的Action配置参数，可以在Action的execute()方法中，通过调用ActionMapping的getParameter()方法来获取参数<br />
&nbsp;&nbsp;&nbsp;&nbsp; @roles:指定允许调用该Aciton的安全角色。多个角色之间用逗号分割。处理请求时，RequestProcessor会根据该配置项来决定用户是否有调用该Action的权限<br />
&nbsp;&nbsp;&nbsp;&nbsp; @scope:指定ActionForm Bean的存在范围，可选值为request和session。默认为session<br />
&nbsp;&nbsp;&nbsp;&nbsp; @type:指定Action类的完整类名<br />
&nbsp;&nbsp;&nbsp;&nbsp; @unknown:值为true时，表示可以处理用户发出的所有无效的Action URL。默认为false<br />
&nbsp;&nbsp;&nbsp;&nbsp; @validate:指定是否要先调用ActionForm Bean的validate()方法。默认为true<br />
&nbsp;&nbsp;&nbsp; 注意：如上属性中，forward/include/type三者相斥，即三者在同一Action配置中只能存在一个。<br />
&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp; &lt;action path="/search"<br />
&nbsp;&nbsp;&nbsp; type="addressbook.actions.SearchAction"<br />
&nbsp;&nbsp;&nbsp; name="searchForm"<br />
&nbsp;&nbsp;&nbsp; scope="request"<br />
&nbsp;&nbsp;&nbsp; validate="true"<br />
&nbsp;&nbsp;&nbsp; input="/search.jsp"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/display.jsp"/&gt;<br />
&nbsp;&nbsp; &lt;/action&gt;&nbsp;&nbsp;<br />
&lt;/action-mappings&gt;<br />
<br />
&lt;!--<br />
&nbsp;&nbsp; 名称：controller<br />
&nbsp;&nbsp; 描述：用于配置ActionServlet<br />
&nbsp;&nbsp; 数量：最多一个<br />
&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp; @bufferSize:指定上传文件的输入缓冲的大小.默认为4096<br />
&nbsp;&nbsp;&nbsp; @className:指定当前控制器的配置类.默认为org.apache.struts.config.ControllerConfig<br />
&nbsp;&nbsp;&nbsp; @contentType:指定相应结果的内容类型和字符编码<br />
&nbsp;&nbsp;&nbsp; @locale:指定是否把Locale对象保存到当前用户的session中,默认为false<br />
&nbsp;&nbsp;&nbsp; @processorClass:指定负责处理请求的Java类的完整类名.默认org.apache.struts.action.RequestProcessor<br />
&nbsp;&nbsp;&nbsp; @tempDir:指定文件上传时的临时工作目录.如果没有设置,将才用Servlet容器为web应用分配的临时工作目录.<br />
&nbsp;&nbsp;&nbsp; @nochache:true时,在相应结果中加入特定的头参数:Pragma ,Cache-Control,Expires防止页面被存储在可数浏览器的缓存中,默认为false<br />
--&gt;<br />
&lt;controller <br />
&nbsp;&nbsp; contentType="text/html;charset=UTF-8"<br />
&nbsp;&nbsp; locale="true"<br />
&nbsp;&nbsp; processorClass="CustomRequestProcessor"&gt;<br />
&lt;/controller&gt;<br />
&lt;!--<br />
&nbsp;&nbsp; 名称:message-resources<br />
&nbsp;&nbsp; 描述:配置Resource Bundle.<br />
&nbsp;&nbsp; 数量:任意多个<br />
&nbsp;&nbsp; 属性:<br />
&nbsp;&nbsp;&nbsp; @className:指定和message-resources对应的配置类.默认为org.apache.struts.config.MessageResourcesConfig<br />
&nbsp;&nbsp;&nbsp; @factory:指定资源的工厂类,默认为org.apache.struts.util.PropertyMessageResourcesFactory<br />
&nbsp;&nbsp;&nbsp; @key:<br />
&nbsp;&nbsp;&nbsp; @null:<br />
&nbsp;&nbsp;&nbsp; @parameter:<br />
--&gt;<br />
&lt;message-resources<br />
&nbsp;&nbsp; null="false"<br />
&nbsp;&nbsp; parameter="defaultResource"/&gt;<br />
&lt;message-resources<br />
&nbsp;&nbsp; key="images"<br />
&nbsp;&nbsp; null="false"<br />
&nbsp;&nbsp; parameter="ImageResources"/&gt;<br />
&nbsp;&nbsp;<br />
&lt;!--<br />
&nbsp;&nbsp; 名称:plug-in<br />
&nbsp;&nbsp; 描述:用于配置Struts的插件<br />
&nbsp;&nbsp; 数量:任意多个<br />
&nbsp;&nbsp; 子元素:set-property<br />
&nbsp;&nbsp; 属性:<br />
&nbsp;&nbsp;&nbsp; @className:指定Struts插件类.此类必须实现org.apache.struts.action.PlugIn接口<br />
--&gt;<br />
&lt;plug-in<br />
&nbsp;&nbsp; className="org.apache.struts.validator.ValidatorPlugIn"&gt;<br />
&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp; 名称:set-property<br />
&nbsp;&nbsp;&nbsp; 描述:配置插件的属性<br />
&nbsp;&nbsp;&nbsp; 数量:任意多个<br />
&nbsp;&nbsp;&nbsp; 属性:<br />
&nbsp;&nbsp;&nbsp;&nbsp; @property:插件的属性名称<br />
&nbsp;&nbsp;&nbsp;&nbsp; @value:该名称所配置的值<br />
&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp; &lt;set-property <br />
&nbsp;&nbsp;&nbsp; property="pathnames"<br />
&nbsp;&nbsp;&nbsp; value="/WEB-INF/validator-rules.xml,/WEB-INF/vlaidation.xml"/&gt;<br />
&lt;/plug-in&gt;<br />
<br />
&lt;/struts-config&gt;</p>
<img src ="http://www.blogjava.net/lanxin1020/aggbug/270067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lanxin1020/" target="_blank">lanxin1020</a> 2009-05-11 16:26 <a href="http://www.blogjava.net/lanxin1020/archive/2009/05/11/270067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>扩充struts验证框架，进行多表单页面的验证（转）</title><link>http://www.blogjava.net/lanxin1020/archive/2009/05/09/269828.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Sat, 09 May 2009 14:59:00 GMT</pubDate><guid>http://www.blogjava.net/lanxin1020/archive/2009/05/09/269828.html</guid><wfw:comment>http://www.blogjava.net/lanxin1020/comments/269828.html</wfw:comment><comments>http://www.blogjava.net/lanxin1020/archive/2009/05/09/269828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lanxin1020/comments/commentRss/269828.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lanxin1020/services/trackbacks/269828.html</trackback:ping><description><![CDATA[<p>struts的validator的客户端验证，不能进行多表单页面的验证，原因是由&lt;html:script&gt;标签生成的javascipt是根据每个表单，生成一段代码。例如：</p>
<p>&lt;html:javascript formName="searchSgbySjForm" dynamicJavascript="true" staticJavascript="false"/&gt;<br />
生成&nbsp;&nbsp;:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; var bCancel = false;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; function validateSearchSgbySjForm(form) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (bCancel)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return validateRequired(form) &amp;&amp; validateDate(form);&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function required () <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.aa = new Array("sgfssjq", "事故发生时间起 不可为空.", new Function ("varName", "this.datePatternStrict='yyy-MM-dd';&nbsp;return thisvarName];"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ab = new Array("sgfssjz", "事故发生时间止 不可为空.", new Function ("varName", "this.datePatternStrict='yyy-MM-dd';&nbsp; return this[varName];"));&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function DateValidations ()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.aa = new Array("sgfssjq", "事故发生时间起 不是有效的日期类型.", new Function ("varName", "this.datePatternStrict='yyy-MM-dd';&nbsp; return this&nbsp; [varName];"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ab = new Array("sgfssjz", "事故发生时间止 不是有效的日期类型.", new Function ("varName", "this.datePatternStrict='yyy-MM-dd';&nbsp; return this[varName];"));&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;} </p>
<p>如果有多个的话required和DateValidations 都会重复的，而javascript是只认最后一个函数的。所以，会导致验证出错。</p>
<p>再写一个标签 ，主要根据原来的代码修改，代码如下:</p>
<p>package com.tmri.acd.tag;</p>
<p>import java.io.IOException;<br />
import java.util.ArrayList;<br />
import java.util.Collections;<br />
import java.util.Comparator;<br />
import java.util.Iterator;<br />
import java.util.List;<br />
import java.util.Locale;<br />
import java.util.Map;</p>
<p>import javax.servlet.jsp.JspException;<br />
import javax.servlet.jsp.JspWriter;<br />
import javax.servlet.jsp.PageContext;<br />
import javax.servlet.jsp.tagext.BodyTagSupport;</p>
<p>import org.apache.commons.validator.Field;<br />
import org.apache.commons.validator.Form;<br />
import org.apache.commons.validator.ValidatorAction;<br />
import org.apache.commons.validator.ValidatorResources;<br />
import org.apache.commons.validator.util.ValidatorUtils;<br />
import org.apache.commons.validator.Var;<br />
import org.apache.struts.Globals;<br />
import org.apache.struts.action.ActionMapping;<br />
import org.apache.struts.config.ModuleConfig;<br />
import com.tmri.acd.tag.TagUtils;<br />
import org.apache.struts.util.MessageResources;<br />
import org.apache.struts.validator.Resources;<br />
import org.apache.struts.validator.ValidatorPlugIn;<br />
import java.util.StringTokenizer;</p>
<p>public class JavascriptValidatorTag extends BodyTagSupport <br />
{<br />
&nbsp;private static final Comparator actionComparator = new Comparator() <br />
{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int compare(Object o1, Object o2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ValidatorAction va1 = (ValidatorAction) o1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ValidatorAction va2 = (ValidatorAction) o2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((va1.getDepends() == null || va1.getDepends().length() == 0)&nbsp;&amp;&amp; (va2.getDepends() == null || va2.getDepends().length() == 0)) <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; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (&nbsp;&nbsp;(va1.getDepends() != null &amp;&amp; va1.getDepends().length() &gt; 0)&nbsp;&nbsp;&amp;&amp; (va2.getDepends() == null || va2.getDepends().length() == 0)) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/lanxin1020/aggbug/269828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lanxin1020/" target="_blank">lanxin1020</a> 2009-05-09 22:59 <a href="http://www.blogjava.net/lanxin1020/archive/2009/05/09/269828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Strust组件—Action类详解 (转)</title><link>http://www.blogjava.net/lanxin1020/archive/2009/04/05/263973.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Sun, 05 Apr 2009 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/lanxin1020/archive/2009/04/05/263973.html</guid><wfw:comment>http://www.blogjava.net/lanxin1020/comments/263973.html</wfw:comment><comments>http://www.blogjava.net/lanxin1020/archive/2009/04/05/263973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lanxin1020/comments/commentRss/263973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lanxin1020/services/trackbacks/263973.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="hilite2">Action</span>类是用户请求和业务逻辑之间的桥梁，每个<span class="hilite2">Action</span>充当客户的一项业务代理。在RequestProcessor类预处理请求时，在创建了<span class="hilite2">Action</span>的实例后，就调用自身的processActionPerform（）方法，该方法再调用<span class="hilite2">Action</span>类的execute（）。 <br />
<span class="hilite2">Action</span>的excute（）方法调用模型的业务方法，完成用户请求，然后根据执行结果把请求转发给其他合适的WEB组件。 <br />
<br />
<span style="color: red">一、<span class="hilite2">Action</span>类缓存</span> <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struts应用的生命周期中RequestProcessor只保证一个<span class="hilite2">Action</span>实例,所有的客户请求都共享这个实例.所有请求可以同时执行它的excute（）方法。RequestProcessor类包含一个HashMap，作为存放所有<span class="hilite2">Action</span>实例的缓存。每个<span class="hilite2">Action</span>实例在缓存中存放的key为<span class="hilite2">Action</span>类名。在RequestProcessor类的processActionCreate()方法中，首先检查在HashMap中是否存在<span class="hilite2">Action</span>实例，如果有直接使用，否则创建一个新的。创建<span class="hilite2">Action</span>实力的代码位于同步代码块中，以保证只有一个线程创建<span class="hilite2">Action</span>实例，然后放在HashMap中。供其他线程使用。 <br />
如下代码<br />
<li><span><span class="keyword">protected</span><span>&nbsp;<span class="hilite2">Action</span>&nbsp;processActionCreate(HttpServletRequest&nbsp;request, &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response, &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionMapping&nbsp;mapping) &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException&nbsp;</span>
<li><span>{&nbsp;&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Acquire&nbsp;the&nbsp;<span class="hilite2">Action</span>&nbsp;instance&nbsp;we&nbsp;will&nbsp;be&nbsp;using&nbsp;(if&nbsp;there&nbsp;is&nbsp;one) </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;className&nbsp;=&nbsp;mapping.getType(); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(log.isDebugEnabled())&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span class="string">"&nbsp;Looking&nbsp;for&nbsp;<span class="hilite2">Action</span>&nbsp;instance&nbsp;for&nbsp;class&nbsp;"</span><span>&nbsp;+&nbsp;className); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;:TODO:&nbsp;If&nbsp;there&nbsp;were&nbsp;a&nbsp;mapping&nbsp;property&nbsp;indicating&nbsp;whether </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;an&nbsp;<span class="hilite2">Action</span>&nbsp;were&nbsp;a&nbsp;singleton&nbsp;or&nbsp;not&nbsp;([true]), </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;could&nbsp;we&nbsp;just&nbsp;instantiate&nbsp;and&nbsp;return&nbsp;a&nbsp;new&nbsp;instance&nbsp;here? </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hilite2">Action</span>&nbsp;instance&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">synchronized</span><span>&nbsp;(actions)&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Return&nbsp;any&nbsp;existing&nbsp;<span class="hilite2">Action</span>&nbsp;instance&nbsp;of&nbsp;this&nbsp;class </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance&nbsp;=&nbsp;(<span class="hilite2">Action</span>)&nbsp;actions.get(className); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(instance&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(log.isTraceEnabled())&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.trace(</span><span class="string">"&nbsp;&nbsp;Returning&nbsp;existing&nbsp;<span class="hilite2">Action</span>&nbsp;instance"</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(instance); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Create&nbsp;and&nbsp;return&nbsp;a&nbsp;new&nbsp;<span class="hilite2">Action</span>&nbsp;instance </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(log.isTraceEnabled())&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.trace(</span><span class="string">"&nbsp;&nbsp;Creating&nbsp;new&nbsp;<span class="hilite2">Action</span>&nbsp;instance"</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span>
<li><span class="keyword">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance&nbsp;=&nbsp;(<span class="hilite2">Action</span>)&nbsp;RequestUtils.applicationInstance(className); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;:TODO:&nbsp;Maybe&nbsp;we&nbsp;should&nbsp;propagate&nbsp;this&nbsp;exception </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;instead&nbsp;of&nbsp;returning&nbsp;null. </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error( &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getInternal().getMessage(</span><span class="string">"actionCreate"</span><span>,&nbsp;mapping.getPath()), &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.sendError( &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse.SC_INTERNAL_SERVER_ERROR, &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getInternal().getMessage(</span><span class="string">"actionCreate"</span><span>,&nbsp;mapping.getPath()));&nbsp;&nbsp;&nbsp;</span></span>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance.setServlet(</span><span class="keyword">this</span><span>.servlet); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actions.put(className,&nbsp;instance); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(instance); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span>
<p>&nbsp;</p>
<p><span style="color: red"><span style="color: red">二．创建支持多线程的<span class="hilite2">Action</span></span> <br />
1.什么是线程安全的代码 <br />
在多线程环境下能正确执行的代码就是线程安全的。 <br />
安全的意思是能正确执行，否则后果是程序执行错误，可能出现各种异常情况。 <br />
<br />
2.如何编写线程安全的代码 <br />
很多书籍里都详细讲解了如何这方面的问题，他们主要讲解的是如何同步线程对共享资源的使用的问题。主要是对synchronized关键字的各种用法，以及锁的概念。 <br />
Java1.5中也提供了如读写锁这类的工具类。这些都需要较高的技巧，而且相对难于调试。 <br />
<br />
但是，线程同步是不得以的方法,是比较复杂的,而且会带来性能的损失。等效的代码中，不需要同步在编写容易度和性能上会更好些。 <br />
我这里强调的是什么代码是始终为线程安全的、是不需要同步的。如下: <br />
1)常量始终是线程安全的，因为只存在读操作。 <br />
2)对构造器的访问(new 操作)是线程安全的，因为每次都新建一个实例，不会访问共享的资源。 <br />
3)最重要的是:局部变量是线程安全的。因为每执行一个方法，都会在独立的空间创建局部变量，它不是共享的资源。局部变量包括方法的参数变量。 <br />
<br />
Servlet是在多线程环境下的。即可能有多个请求发给一个servelt实例，每个请求是一个线程。 struts下的<span class="hilite2">action</span>也类似，同样在多线程环境下，你也必须编写线程安全的<span class="hilite2">Action</span>类。 <br />
保证线程安全的原则就是仅仅使用局部变量，谨慎使用实例变量（拥有状态的实例,尤其是拥有业务对象状态的实例）. 如果要用到那些有状态的实例,唯一和最好的办法是在<span class="hilite2">Action</span>类中，仅仅在<span class="hilite2">Action</span>类的execute()方法中使用局部变量,对于每个调用execute()方法的线程,JVM会在每个线程的堆栈中创建局部变量,因此每个线程拥有独立的局部变量，不会被其他线程共享.当线程执行完execute()方法后，它的局部变量就会被销毁. <br />
如果<span class="hilite2">Action</span>类的实例变量是必须的话，需要采用JAVA同步机制（synchronized）对访问共享资源的代码块进行同步 <br />
<br />
<br />
<span style="color: red">三、Struts的几种<span class="hilite2">Action</span></span> <br />
Struts提供了一些现成的<span class="hilite2">Action</span>类，直接使用可以大大节省时间，如下 <br />
ForwardAction <br />
可以转发到其他web组件，仅仅提供一个转发功能，不作处理。 <br />
IncludeAction <br />
包含其他web组件。 <br />
DiapatchAction <br />
通常一个<span class="hilite2">Action</span>只完成一个操作，用这个<span class="hilite2">Action</span>可以完成一组相关的操作。 <br />
LookupDispatchAction <br />
他是DiapatchAction的子类，也可以定义多个方法，但主要用于一个表单里有多个按钮，而这些按钮又有一个共同的名字的场合。 <br />
SwitchAction <br />
用于子模块之间的切换。 <br />
<br />
<br />
<span style="color: red">四．ActionForward类</span> <br />
<span class="hilite2">Action</span>类的excute（）方法返回一个ActionForward对象，它代表了web资源的逻辑抽象，这里的web资源可以是jsp页面、Java servlet、或<span class="hilite2">Action</span>。 <br />
从excute返回ActionForward可以有两种方法。 <br />
1） 动态创建一个ActionForward实例 <br />
return new ActionForward（&#8221;Failure&#8221;，&#8221;login.jsp&#8221;,true）； <br />
2) 调用ActionMappin实例的findForward方法 <br />
这个方法先从<span class="hilite2">action</span>级别找，然后在&lt;global-forwards /&gt;级别找 <br />
return mapping.findForward(&#8220;Failure&#8221;); <br />
</span><br />
</p>
</li>
  <img src ="http://www.blogjava.net/lanxin1020/aggbug/263973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lanxin1020/" target="_blank">lanxin1020</a> 2009-04-05 11:19 <a href="http://www.blogjava.net/lanxin1020/archive/2009/04/05/263973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Strust组件—RequestProcessor类详解 (转)</title><link>http://www.blogjava.net/lanxin1020/archive/2009/04/05/263970.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Sun, 05 Apr 2009 03:15:00 GMT</pubDate><guid>http://www.blogjava.net/lanxin1020/archive/2009/04/05/263970.html</guid><wfw:comment>http://www.blogjava.net/lanxin1020/comments/263970.html</wfw:comment><comments>http://www.blogjava.net/lanxin1020/archive/2009/04/05/263970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lanxin1020/comments/commentRss/263970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lanxin1020/services/trackbacks/263970.html</trackback:ping><description><![CDATA[Struts框架只允许应用中存在一个ActionServlet类,但是可以存在多个客户化的<span class="hilite1">RequestProcessor</span>类,每个子应用模块都可以有单独的<span class="hilite1">RequestProcessor</span>类, <br />
<br />
ActionServlet主要负责初始化,以及介绍请求并找到合适的RequestRrocessor,之后真正干活的是RequestProecssor和Action. <br />
上回说到ActionServlet的process方法最终会调用<span class="hilite1">RequestProcessor</span>类的process方法.下面介绍这个方法. <br />
<strong><span style="color: red">一.<span class="hilite1">RequestProcessor</span>的process方法</span></strong> <br />
<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;process(HttpServletRequest&nbsp;request, &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response) &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException,&nbsp;ServletException&nbsp;</span>
<li><span>{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Wrap&nbsp;multipart&nbsp;requests&nbsp;with&nbsp;a&nbsp;special&nbsp;wrapper </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request&nbsp;=&nbsp;processMultipart(request); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Identify&nbsp;the&nbsp;path&nbsp;component&nbsp;we&nbsp;will&nbsp;use&nbsp;to&nbsp;select&nbsp;a&nbsp;mapping </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;path&nbsp;=&nbsp;processPath(request,&nbsp;response); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(path&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(log.isDebugEnabled())&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span class="string">"Processing&nbsp;a&nbsp;'"</span><span>&nbsp;+&nbsp;request.getMethod()&nbsp;+ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">"'&nbsp;for&nbsp;path&nbsp;'"</span><span>&nbsp;+&nbsp;path&nbsp;+&nbsp;</span><span class="string">"'"</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Select&nbsp;a&nbsp;Locale&nbsp;for&nbsp;the&nbsp;current&nbsp;user&nbsp;if&nbsp;requested </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processLocale(request,&nbsp;response); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Set&nbsp;the&nbsp;content&nbsp;type&nbsp;and&nbsp;no-caching&nbsp;headers&nbsp;if&nbsp;requested </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processContent(request,&nbsp;response); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processNoCache(request,&nbsp;response); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;General&nbsp;purpose&nbsp;preprocessing&nbsp;hook </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!processPreprocess(request,&nbsp;response))&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.processCachedMessages(request,&nbsp;response); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Identify&nbsp;the&nbsp;mapping&nbsp;for&nbsp;this&nbsp;request </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionMapping&nbsp;mapping&nbsp;=&nbsp;processMapping(request,&nbsp;response,&nbsp;path); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(mapping&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Check&nbsp;for&nbsp;any&nbsp;role&nbsp;required&nbsp;to&nbsp;perform&nbsp;this&nbsp;action </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!processRoles(request,&nbsp;response,&nbsp;mapping))&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Process&nbsp;any&nbsp;ActionForm&nbsp;bean&nbsp;related&nbsp;to&nbsp;this&nbsp;request </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionForm&nbsp;form&nbsp;=&nbsp;processActionForm(request,&nbsp;response,&nbsp;mapping); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processPopulate(request,&nbsp;response,&nbsp;form,&nbsp;mapping); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Validate&nbsp;any&nbsp;fields&nbsp;of&nbsp;the&nbsp;ActionForm&nbsp;bean,&nbsp;if&nbsp;applicable </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span>
<li><span class="keyword">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!processValidate(request,&nbsp;response,&nbsp;form,&nbsp;mapping))&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="keyword">catch</span><span>&nbsp;(InvalidCancelException&nbsp;e)&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionForward&nbsp;forward&nbsp;=&nbsp;processException(request,&nbsp;response,&nbsp;e,&nbsp;form,&nbsp;mapping); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processForwardConfig(request,&nbsp;response,&nbsp;forward); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;e; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(ServletException&nbsp;e)&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;e; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Process&nbsp;a&nbsp;forward&nbsp;or&nbsp;include&nbsp;specified&nbsp;by&nbsp;this&nbsp;mapping </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!processForward(request,&nbsp;response,&nbsp;mapping))</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!processInclude(request,&nbsp;response,&nbsp;mapping))&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Create&nbsp;or&nbsp;acquire&nbsp;the&nbsp;Action&nbsp;instance&nbsp;to&nbsp;process&nbsp;this&nbsp;request </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Action&nbsp;action&nbsp;=&nbsp;processActionCreate(request,&nbsp;response,&nbsp;mapping); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(action&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Call&nbsp;the&nbsp;Action&nbsp;instance&nbsp;itself </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionForward&nbsp;forward&nbsp;= &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processActionPerform(request,&nbsp;response, &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action,&nbsp;form,&nbsp;mapping); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Process&nbsp;the&nbsp;returned&nbsp;ActionForward&nbsp;instance </span><span>&nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processForwardConfig(request,&nbsp;response,&nbsp;forward); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span>
<p>1)<span style="color: red"> 调用processMultipart()方法</span> <br />
如果HTTP请求方式为post,并且contentType为&#8221;multipart/form-data&#8221;开头,标准的HttpServletRequest对象将被重新包装,以方便处理&#8221;multipart&#8221;类型的HTTP请求.如果请求方式为get,或正congtentType属性不是&#8221;mulitipart&#8221;,就直接返回原始的HttpServletRequest对象. <br />
<br />
<span style="color: red">2) 调用processPath()方法</span> <br />
获得请求的URI的路径,这一信息可用于选择合适的Struts Action组件. <br />
<br />
<span style="color: red">3) 调用processLocale方法</span> <br />
当ControllerConfig对象的locale属性为true,将读取用户请求中包含的Locale信息,然后把Locale实例保存在session范围内. <br />
<br />
<span style="color: red">4) 调用processContendType(contentType)方法</span> <br />
读取ControllerConfig对象的conttentType属性,然后调用response.setContentType(contentType)方法,设置响应结果的文档类型和字符编码. <br />
processContent()方法如下 <br />
</p>
<li><span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;processContent(HttpServletRequest&nbsp;request, &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response)&nbsp;</span>
<li><span>&nbsp;{ &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;contentType&nbsp;=&nbsp;moduleConfig.getControllerConfig().getContentType(); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(contentType&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(contentType); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span>
<p>&nbsp;</p>
<p><br />
<span style="color: red">5) 调用processNoCache()方法</span> <br />
读取ControllerConfig对象的nocache属性,如果nocache属性为true,在响应结果中将加入特定的头参数:Pragma,Cache-Control和Expires, <br />
防止页面被存储在客户的浏览器的缓存中,processNoCache方法的代码如下: <br />
<br />
</p>
<li><span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;processNoCache(HttpServletRequest&nbsp;request, &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response)&nbsp;</span>
<li><span>{ &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(moduleConfig.getControllerConfig().getNocache())&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader(</span><span class="string">"Pragma"</span><span>,&nbsp;</span><span class="string">"No-cache"</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader(</span><span class="string">"Cache-Control"</span><span>,&nbsp;</span><span class="string">"no-cache,no-store,max-age=0"</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setDateHeader(</span><span class="string">"Expires"</span><span>,&nbsp;</span><span class="number">1</span><span>); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
<p><span><br />
<br />
<span style="color: red">6)调用processPreprocess()方法</span> <br />
该方法不执行任何操作.直接返回true.子类可以覆盖这个方法. <br />
执行客户化的预处理请求操作. <br />
<br />
<span style="color: red">7)调用processMapping()方法</span> <br />
寻找和用户请求的URI匹配的ActionMapping,如果不存在这样的ActionMapping,则向用户返回恰当的错误信息. <br />
<br />
<span style="color: red">8)调用processRoles()方法</span> <br />
先判断是否为Action配置了安全角色,如果配置了安全角色,就调用isUserInRole()方法判断当前用户是否具备必需的角色,如果不具备,就结束请求处理流程.,向用户返回恰当的错误消息. <br />
<br />
<span style="color: red">9)调用processActionForm()方法</span> <br />
先判断是否为ActionMapping配置了ActionForm,如果配置了ActionForm,就先从ActionForm的存在范围内（request或session）寻找改ActionForm实例,如果不存在,就创建一个实例,接下来把它保存在合适的范围内,保存时使用的属性key为ActionMapping的name属性。 <br />
<br />
<span style="color: red">10）调用processPopulate()方法</span> <br />
如果为ActionMapping配置了ActionForm，就先调用ActionForm的reset（）方法，再把请求中的表单数据组装到ActionForm中。 <br />
<br />
<span style="color: red">11）调用processValidate（）方法</span> <br />
如果为ActionMapping配置了ActionForm，并且ActionMapping的validate属性为true，就调用ActionForm的validate（）方法，如果validate方法返回的ActionErrors对象中包含ActionMessage对象，说明表单验证失败。就把ActionErrors对象放在request范围内，再把请求转发到ActionMapping的input属性指定的Web组件。如果ActionForm的validate方法执行表单验证成功，就继续执行下面的处理流程。 <br />
<br />
<span style="color: red">12）调用processForward()方法</span> <br />
判断是否在ActionMapping中配置了forward属性。如果配置了这个属性，就调用RequestDispatcher的forward方法，请求处理流程结束。否则进行下一步。 <br />
<br />
<span style="color: red">13）调用processInclude()方法</span> <br />
判断是否在ActionMapping中配置了include属性。如果配置了这个属性，就调用RequestDispatcher的include方法，请求处理流程结束。否则进行下一步。 <br />
<br />
<span style="color: red">14）调用processActionCreate（）方法</span> <br />
先判断是否在Action缓存中存在这个Action实例，如果没有就新建一个Action实例，把它放在Action缓存中。可以看出Action也是只有一个实例在运行的。 <br />
<br />
<span style="color: red">15）调用processActionPerform</span> <br />
该方法调用Action实例的execute方法，该方法位于try/catch中，以及捕获异常。processActionPerform（）方放代码如下。 <br />
<br />
</p>
<li><span><span class="keyword">protected</span><span>&nbsp;ActionForward &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processActionPerform(HttpServletRequest&nbsp;request, &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response, &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Action&nbsp;action, &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionForm&nbsp;form, &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionMapping&nbsp;mapping) &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException,&nbsp;ServletException&nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(action.execute(mapping,&nbsp;form,&nbsp;request,&nbsp;response)); &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(processException(request,&nbsp;response, &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e,&nbsp;form,&nbsp;mapping)); &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
<li><span>&nbsp;&nbsp;&nbsp;</span>
<p>&nbsp;</p>
<p><br />
<span style="color: red">16)调用processActionForward方法</span> <br />
把你的Action的excute方法返回的ActionFoward对象作为参数传给它，processActionForward对象包的请求转发信息来执行请求转发或重定向。 <br />
<br />
在<span class="hilite1">RequestProcessor</span>类的process方法中，会访问ControllerConfig、ActionMappig和ActionForward实力的属性，ControllerConfig类和struts配置文件的&lt;controlle&gt;r元素对应，ActionMapping类和&lt;action&gt;元素对应，ActionForward和&lt;forward&gt;元素对应，process方法通过访问这三个类实例的属性来获得相关的配置信息。 <br />
写了这么多，<span class="hilite1">RequestProcessor</span>干得事够多的吧。 <br />
<br />
<strong><span style="color: red">二．扩展<span class="hilite1">RequestProcessor</span>类</span></strong> <br />
如果想修改<span class="hilite1">RequestProcessor</span>的一些默认功能,改易覆盖<span class="hilite1">RequestProcessor</span>基类中的相关方法. <br />
</p>
<li><span><span>Public&nbsp;</span><span class="keyword">class</span><span>&nbsp;CustomRequestProcessor&nbsp;</span><span class="keyword">extends</span><span>&nbsp;<span class="hilite1">RequestProcessor</span>{ &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;processPreprocess&nbsp;(HttpServletRequest&nbsp;request, &nbsp;&nbsp;</span></span>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response)&nbsp;{&nbsp; &nbsp;&nbsp;</span>
<li><span>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. &nbsp;&nbsp;</span>
<li><span>} &nbsp;&nbsp;</span>
<li><span>}&nbsp;&nbsp;</span>
<p><span>在struts配置文件中，&lt;controller&gt;元素的processorClass属性用于配置你自己的<span class="hilite1">RequestProcessor</span>类<br />
<br />
</p>
<li><span><span>&lt;/controller&nbsp; &nbsp;&nbsp;</span></span>
<li><span>contentType＝&#8220;text/html:charset=&#8221;GB2312&#8221; &nbsp;&nbsp;</span>
<li><span>locale=&#8221;</span><span class="keyword">true</span><span>&#8221;&nbsp;nocache=&#8221;</span><span class="keyword">true</span><span>&#8221;&nbsp;processorCalss=&#8221;com.test.CustomRequestProcessor&#8221;/&gt;&nbsp;&nbsp;</span></span>
<p>&nbsp;</p>
<p><br />
<br />
<br />
</span></span>&nbsp;</p>
</li>
 <img src ="http://www.blogjava.net/lanxin1020/aggbug/263970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lanxin1020/" target="_blank">lanxin1020</a> 2009-04-05 11:15 <a href="http://www.blogjava.net/lanxin1020/archive/2009/04/05/263970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Strust组件—ActionServlet详解(转)</title><link>http://www.blogjava.net/lanxin1020/archive/2009/04/05/263969.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Sun, 05 Apr 2009 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/lanxin1020/archive/2009/04/05/263969.html</guid><wfw:comment>http://www.blogjava.net/lanxin1020/comments/263969.html</wfw:comment><comments>http://www.blogjava.net/lanxin1020/archive/2009/04/05/263969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lanxin1020/comments/commentRss/263969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lanxin1020/services/trackbacks/263969.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大家都知道,Struts控制器组件负责接受用户请求,更通模型,以及返回给用户合适的视图组件. <br />
控制器将模型层和视图层分开,这样分离,可以为同一个模型开发出不同的视图. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面时Struts的三大主要组件 <br />
<span class="hilite1">ActionServlet</span>组件:充当Struts框架的中央控制器 <br />
RequestProcessor组件:充当每个子应用模块的请求处理器 <br />
Action组件:真正来处理一项具体的业务. <br />
<br />
<span style="color: red">一. Struts的init()方法</span> <br />
Struts应用中只存在<span class="hilite1">ActionServlet</span>的一个实例,Servlet容器在启动时,或者用户首次请求<span class="hilite1">ActionServlet</span>时加载<span class="hilite1">ActionServlet</span>类.在这两种情况下,servlet容器都会在<span class="hilite1">ActionServlet</span>容器被加载后立即执行它的init()方法,这可以保证<span class="hilite1">ActionServlet</span>处理用户请求时已经被初始化. <br />
<br />
下面根据Init()讲述Struts的初始化过程 <br />
<li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;init()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;ServletException&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Wraps&nbsp;the&nbsp;entire&nbsp;initialization&nbsp;in&nbsp;a&nbsp;try/catch&nbsp;to&nbsp;better&nbsp;handle </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;unexpected&nbsp;exceptions&nbsp;and&nbsp;errors&nbsp;to&nbsp;provide&nbsp;better&nbsp;feedback </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;to&nbsp;the&nbsp;developer </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span class="comment">//调用initInternal()方法,初始化Struts框架内的消息资源,如与系统日志相关的通知,警告,和错误消息. </span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="number">1</span><span>)initInternal(); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="comment">//调用ininOther()方法,从web.xml文件中加载<span class="hilite1">ActionServlet</span>的初始化参数,如config参数 </span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="number">2</span><span>)initOther(); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="comment">//调用initServlet()方法,从web.xml文件中加载<span class="hilite1">ActionServlet</span>的URL映射信息.同时还会注册web.xml文件和Struts配置文件所使用的DTD文件,这些DTD文件用户验证web.xml和struts配置文件的语法.其中方法里的&nbsp;digester类负责解析web.xml，对字符串servletMapping属性进行初始化 </span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="number">3</span><span>)&nbsp;initServlet(); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="comment">//把<span class="hilite1">ActionServlet</span>实例放到ServletContext里 </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY,&nbsp;</span><span class="keyword">this</span><span>); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="comment">//初始化一个factory,用于创建moduleConfig </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>initModuleConfigFactory(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="comment">//,加载并解析默认struts配置文件/WEB-INF/struts-config.xml,同时创建MoudleConfig实例,放到ServletContext中 </span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="number">4</span><span>)ModuleConfig&nbsp;moduleConfig&nbsp;=&nbsp;initModuleConfig(</span><span class="string">""</span><span>,&nbsp;config); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="comment">//加载并初始化默认子应用模块的消息资源;讲解MessageResources对象,把它存储在ServletContext中. </span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="number">5</span><span>)initModuleMessageResources(moduleConfig); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="comment">//加载并初始化默认子应用模块的数据源,如果在struts配置文件中没有定义&lt;data-sources&nbsp;&gt;元素,忽略这一流程. </span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="number">6</span><span>)initModuleDataSources(moduleConfig); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="comment">//加载并初始化默认子应用的所有插件 </span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="number">7</span><span>)initModulePlugIns(moduleConfig); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="comment">//冻结moduleConfig(,在方法返回之前不能修改它,否则将抛出异常) </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>moduleConfig.freeze(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
<li><span class="comment">//如果还有其他子应用模块,将重复4-7步 </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enumeration&nbsp;names&nbsp;=&nbsp;getServletConfig().getInitParameterNames(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(names.hasMoreElements())&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;=&nbsp;(String)&nbsp;names.nextElement(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!name.startsWith(</span><span class="string">"config/"</span><span>))&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;prefix&nbsp;=&nbsp;name.substring(</span><span class="number">6</span><span>); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;moduleConfig&nbsp;=&nbsp;initModuleConfig &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(prefix,&nbsp;getServletConfig().getInitParameter(name)); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initModuleMessageResources(moduleConfig); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initModuleDataSources(moduleConfig); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initModulePlugIns(moduleConfig); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;moduleConfig.freeze(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="comment">//将各个子模块应用(除了默认的)的前缀存到一个字符数组中,并放到servletcontext中 </span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="keyword">this</span><span>.initModulePrefixes(</span><span class="keyword">this</span><span>.getServletContext()); &nbsp;&nbsp;</span></span></li>
<li><span class="comment">//释放创建的用于读取配置文件的digester实例,释放内存 </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.destroyConfigDigester(); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(UnavailableException&nbsp;ex)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;ex; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Throwable&nbsp;t)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;The&nbsp;follow&nbsp;error&nbsp;message&nbsp;is&nbsp;not&nbsp;retrieved&nbsp;from&nbsp;internal&nbsp;message </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;resources&nbsp;as&nbsp;they&nbsp;may&nbsp;not&nbsp;have&nbsp;been&nbsp;able&nbsp;to&nbsp;have&nbsp;been&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;initialized </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(</span><span class="string">"Unable&nbsp;to&nbsp;initialize&nbsp;Struts&nbsp;<span class="hilite1">ActionServlet</span>&nbsp;due&nbsp;to&nbsp;an&nbsp;"</span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;</span><span class="string">"unexpected&nbsp;exception&nbsp;or&nbsp;error&nbsp;thrown,&nbsp;so&nbsp;marking&nbsp;the&nbsp;"</span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;</span><span class="string">"servlet&nbsp;as&nbsp;unavailable.&nbsp;&nbsp;Most&nbsp;likely,&nbsp;this&nbsp;is&nbsp;due&nbsp;to&nbsp;an&nbsp;"</span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;</span><span class="string">"incorrect&nbsp;or&nbsp;missing&nbsp;library&nbsp;dependency."</span><span>,&nbsp;t); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;UnavailableException(t.getMessage()); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>}&nbsp;&nbsp;</span></li>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将各个子模块应用(除了默认的)的前缀存到一个字符数组中,并放到servletcontext中,对于默认的子应用模块,在appclication范围内存放他的MoudleConfig实例的key为&#8220;org.apache.struts.action.MODULE&#8221;,其他模块如/account,存放的key为org.apache.struts.action.MODULE/account,消息,数据源和插件等部分存在servletcontext的key和上述方法类似,不在说明. <br />
<br />
<br />
<span style="color: red">二.<span class="hilite1">ActionServlet</span>的process方法</span> <br />
当<span class="hilite1">ActionServlet</span>接受到HTTP请求后,在doget()或doPost()方法中都会调用process()方法来处理请求. <br />
</p>
<li><span><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doGet(HttpServletRequest&nbsp;request, &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response) &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException,&nbsp;ServletException&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process(request,&nbsp;response); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>}&nbsp;&nbsp;&nbsp;</span></li>
<p><br />
&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doPost(HttpServletRequest&nbsp;request, &nbsp;&nbsp;</span> </p>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response) &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException,&nbsp;ServletException&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process(request,&nbsp;response); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>}&nbsp;&nbsp;&nbsp;</span></li>
<p><span>下面是process方法,它看上去并不复杂,但他调用的其他方法比较复杂.&nbsp;<br />
&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;process(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response) &nbsp;&nbsp;</span> </p>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException,&nbsp;ServletException&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//根据request里的信息从servletContext里找到相应的子模块ModuleConfig,和它下面的MessageResources,并放到request里,使其他组件可以方便的供request里取得应用配置信息和消息资源. </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ModuleUtils.getInstance().selectModule(request,&nbsp;getServletContext()); &nbsp;&nbsp;</span></li>
<li><span class="comment">//取出MoudleConfig实例config </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ModuleConfig&nbsp;config&nbsp;=&nbsp;getModuleConfig(request); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//根据config里这个子模块的信息,从servletcontext里,取出这个子模块的RequestProcessor实例 </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestProcessor&nbsp;processor&nbsp;=&nbsp;getProcessorForModule(config); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//如果processor实例为空,就新建一个.同时放到servletcontext里. </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(processor&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processor&nbsp;=&nbsp;getRequestProcessor(config); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span class="comment">//调用RequestProcessor的process方法处理, </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processor.process(request,&nbsp;response); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
<p><br />
三. 扩展<span class="hilite1">ActionServlet</span>类 <br />
<strong>从Struts1.1开始,为减轻<span class="hilite1">ActionServlet</span>的负担,多数功能已经移到RequestProcessor类中,所以基本不用扩展<span class="hilite1">ActionServlet</span>类</strong> <br />
<br />
如果需要创建自己的<span class="hilite1">ActionServlet</span>,则可以创建一个它的子类.覆盖init()方法(或其他方法),可以写一些自己的操作,但要先调用super.init(); <br />
定义如下的类： <br />
</p>
<li><span><span class="keyword">package</span><span>&nbsp;sample;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ExtendedActionServlet&nbsp;</span><span class="keyword">extends</span><span>&nbsp;<span class="hilite1">ActionServlet</span>&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;init()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;ServletException&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">super</span><span>.init();&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//do&nbsp;some&nbsp;operations&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;&#8230;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
<li><span>}&nbsp;&nbsp;&nbsp;</span></li>
<p><span><br />
<br />
扩展完类后，还应该在web.xml文件中如下配置：<br />
</p>
<span><span>
<li><span><span>&lt;servlet&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;sample&lt;/servlet-name&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-</span><span class="keyword">class</span><span>&gt;sample.ExtendedActionServlet&lt;/servlet-</span><span class="keyword">class</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&lt;/servlet&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&lt;servlet-mapping&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;sample&lt;/servlet-name&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/action/*&lt;url-pattern&gt;&nbsp;</span></li>
<li></span></span></span></span><br />
</li>
<li><br />
<br />
</span></li>
上面的/action/*表示负责处理所有以/action为前缀的URL,后面的/表示转义 <br />
  <img src ="http://www.blogjava.net/lanxin1020/aggbug/263969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lanxin1020/" target="_blank">lanxin1020</a> 2009-04-05 11:10 <a href="http://www.blogjava.net/lanxin1020/archive/2009/04/05/263969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>