先看chain-config.xml
<?xml version="1.0" ?>
<catalog name="struts">
<define name="lookup" className="org.apache.commons.chain.generic.LookupCommand" />
<!-- ========== Servlet Complete Request Chain ========================= -->
<chain name="servlet-standard">
// 异常处理command,这个类实现了filter接口,会做process后处理。在做precess后处理时,先判断ActionContext中是否有exception对象,如果存在,则找到name是servlet-exception的command来处理
<command className="org.apache.struts.chain.commands.ExceptionCatcher"
catalogName="struts" exceptionCommand="servlet-exception" />
//找到name是process-action的command处理
<lookup catalogName="struts" name="process-action" optional="false" />
//找到name是process-view的command处理
<lookup catalogName="struts" name="process-view" optional="false" />
</chain>
<!-- ========== Action Processing chain ======================== -->
<chain name="process-action">
<!-- Look up optional preprocess command -->实际上是一个前置处理,但是没有配置。optional=true表示该lookupcommand在找不到servlet-standard-preprocess时,也能正常执行(optional=false时会抛出异常)。
<lookup catalogName="struts" name="servlet-standard-preprocess" optional="true" />
<!-- 选择区域信息,会从session,request中得到,如果都不存在,则生成默认locale,然后放入session中 -->
<command className="org.apache.struts.chain.commands.servlet.SelectLocale" />
<!-- 设定应用访问路径,放入request中 -->
<command className="org.apache.struts.chain.commands.servlet.SetOriginalURI" />
<!-- 设置响应信息头:禁用缓存 -->
<command className="org.apache.struts.chain.commands.servlet.RequestNoCache" />
<!-- 设定响应内容类型,默认是text/html -->
<command className="org.apache.struts.chain.commands.servlet.SetContentType" />
<!-- 清除session中的部分信息 -->
<command className="org.apache.struts.chain.commands.RemoveCachedMessages" />
<!-- 根据请求,匹配action -->
<command className="org.apache.struts.chain.commands.servlet.SelectAction" />
<!-- Authorize the selected ActionConfig for this request JAAS权限 -->
<command className="org.apache.struts.chain.commands.servlet.AuthorizeAction" />
<!-- 根据action的name创建form -->
<command className="org.apache.struts.chain.commands.CreateActionForm" />
<!-- 处理上传form,并且把form放进session -->
<command className="org.apache.struts.chain.commands.servlet.PopulateActionForm" />
<!-- 验证,在form中要重写validate方法 -->
<command className="org.apache.struts.chain.commands.servlet.ValidateActionForm" />
<!-- 设定form验证失败时候的跳转页面 ,主要是根据action中配置的input属性-->
<command className="org.apache.struts.chain.commands.servlet.SelectInput" />
<!-- 如果在action中配置了command,并且能够找到这个command,那么执行这个command(前提是form通过验证) -->
<command className="org.apache.struts.chain.commands.ExecuteCommand" />
<!-- 设定跳转,根据action中的forward属性(不是action标签里面的forward标签) -->
<command className="org.apache.struts.chain.commands.servlet.SelectForward" />
<!-- 在actioncontext中设置include属性 -->
<command className="org.apache.struts.chain.commands.SelectInclude" />
<!-- 如果存在include,那么跳转 -->
<command className="org.apache.struts.chain.commands.servlet.PerformInclude" />
<!-- 根据type创建action -->
<command className="org.apache.struts.chain.commands.servlet.CreateAction" />
<!-- 执行action的excute -->
<command className="org.apache.struts.chain.commands.servlet.ExecuteAction" />
</chain>
<!-- ========== View Processing chain ======================== -->
<chain name="process-view">
<!-- Lookup and execute a chain command if the current ForwardConfig is so-configured. -->
<command className="org.apache.struts.chain.commands.ExecuteForwardCommand" />
<!-- Follow the returned ForwardConfig (if any) -->
<command className="org.apache.struts.chain.commands.servlet.PerformForward" />
</chain>
<!-- ========== Servlet Exception Handler Chain ======================== -->
<chain name="servlet-exception">
<!-- Execute the configured exception handler (if any) -->
<command className="org.apache.struts.chain.commands.servlet.ExceptionHandler" />
<!-- Follow the returned ForwardConfig (if any) -->
<command className="org.apache.struts.chain.commands.servlet.PerformForward" />
</chain>
</catalog>