下图是Struts的工作流程前边我们提到所有的请求都提交给ActionServlet来处理
ActionServlet是一个FrontController它是一个标准的Servlet它将request转发给RequestProcessor来处理
ActionMapping是ActionConfig的子类实质上是对strutsconfigxml的一个映射从中可以取得所有的配置信息
RequestProcessor根据提交过来的url如*do从ActionMapping中得到相应的ActionForn和Action然后将request的参数对应到ActionForm中进行form验证如果验证通过则调用Action的execute()方法来执行Action最终返回ActionFoward
ActionFoward是对mapping中一个foward的包装对应于一个url
ActionForm使用了ViewHelper模式是对HTML中form的一个封装其中包含有validate方法用于验证form数据的有效性ActionForm是一个符合JavaBean规范的类所有的属性都应满足get和set对应对于一些复杂的系统还可以采用DynaActionForm来构造动态的Form即通过预制参数来生成Form这样可以更灵活的扩展程序
ActionErrors是对错误信息的包装一旦在执行action或者formvalidate中出现异常即可产生一个ActionError并最终加入到ActionErrors在Form验证的过程中如果有Error发生则会将页面重新导向至输入页并提示错误
Action是用于执行业务逻辑的RequsestHandler每个Action都只建立一个instanceAction不是线程安全的所以不应该在Action中访问特定资源一般来说应改使用BusinessDelegate模式来对Businesstier进行访问以解除耦合
Struts提供了多种Action供选择使用普通的Action只能通过调用execute执行一项任务而DispatchAction可以根据配置参数执行而不是仅进入execute()函数这样可以执行多种任务如insertupdate等LookupDispatchAction可以根据提交表单按钮的名称来执行函数
我们可以先回到刚才的例子理解一下Struts的流程
下面我们看Struts自带的example实例
说明实例二是Struts自带的example程序实现了登录注册修改功能
代码中大量应用了strutstaglib并且采用validator插件进行form的验证
但是代码树立了一个不好的榜样即把大量的业务逻辑写在了action中
部分代码如下
登录logonjsp
<%@pagecon_tentType=text/html;charset=UTFlanguage=java%>
//声明Taglib
<%@tagliburi=/WEBINF/strutsbeantldprefix=bean%>
<%@tagliburi=/WEBINF/strutshtmltldprefix=html%>
<html:htmllocale=true>
<head>
//bean是用来从ApplicationResource中读取in信息
<title><bean:messagekey=logontitle/></title>
<html:base/>
</head>
<bodybgcolor=white>
//错误信息部分
<html:errors/>
//登录formaction为logiondo
<html:formaction=/logonfocus=username
on_submit=returnvalidateLogonForm(this);>
<tableborder=width=%>
<tr>
<thalign=right>
<bean:messagekey=promptusername/>:
</th>
<tdalign=left>
<html:textproperty=usernamesize=maxlength=/>
</td>
</tr>
<tr>
<thalign=right>
<bean:messagekey=promptpasswordbundle=alternate/>:
</th>
<tdalign=left>
<html:passwordproperty=passwordsize=maxlength=redisplay=false/>
</td>
</tr>
<tr>
<tdalign=right>
<html:submitvalue=Submit/>
</td>
<tdalign=left>
<html:reset/>
</td>
</tr>
</table>
</html:form>
//Validator插件用于form验证
<html:javascriptformName=logonFormdynamicJavascript=truestaticJavascript=false/>
<scriptlanguage=Javascriptsrc=staticJavascriptjsp></script>
</body>
</html:html>
strutsconfigxml配置
<formbeans>
<!Logonformbean>
<formbeanname=logonFormtype=orgapachestrutsvalidatorDynaValidatorForm>
<formpropertyname=usernametype=javalangString/>
<formpropertyname=passwordtype=javalangString/>
</formbean>
<!Subscriptionformbean>
<formbeanname=subscriptionFormtype=orgapachestrutswebappexampleSubscriptionForm/>
</formbeans>
<actionmappings>
<!Editmailsubscription>
<actionpath=/editSubscription
type=orgapachestrutswebappexampleEditSubscriptionAction
attribute=subscriptionForm
scope=request
validate=false>
<forwardname=failurepath=/mainMenujsp/>
<forwardname=successpath=/subscriptionjsp/>
</action>
subscriptionForm是一个标准的ActionForm其中reset方法用于清除form的值validate方法用于验证
publicfinalclassSubscriptionFormextendsActionForm{
//Themaintenanceactionweareperforming(CreateorEdit)
privateStringaction=Create;
//Shouldweautoconnectatstartuptime?
privatebooleanautoConnect=false;
//Thehostname
privateStringhost=null;
privateStringpassword=null;
privateStringtype=null;
privateStringusername=null;
publicStringgetAction(){return(thisaction);}
publicvoidsetAction(Stringaction){thisaction=action;}
publicbooleangetAutoConnect(){return(thisautoConnect);}
publicvoidsetAutoConnect(booleanautoConnect){thisautoConnect=autoConnect;}
publicStringgetHost(){return(thishost);}
publicvoidsetHost(Stringhost){thishost=host;}
publicStringgetPassword(){return(thispassword);}
publicvoidsetPassword(Stringpassword){thispassword=password;}
publicStringgetType(){return(thistype);}
publicvoidsetType(Stringtype){thistype=type;}
publicStringgetUsername(){return(thisusername);}
publicvoidsetUsername(Stringusername){thisusername=username;}
/**
*Resetallpropertiestotheirdefaultvalues
*
*@parammappingThemappingusedtoselectthisinstance
*@paramrequestTheservletrequestweareprocessing
*/
publicvoidreset(ActionMappingmappingHttpServletRequestrequest){
thisaction=Create;
thisautoConnect=false;
thishost=null;
thispassword=null;
thistype=null;
thisusername=null;
}
/**
*ValidatethepropertiesthathavebeensetfromthisHTTPrequest
*andreturnan<code>ActionErrors</code>objectthatencapsulatesany
*validationerrorsthathavebeenfoundIfnoerrorsarefoundreturn
*<code>null</code>oran<code>ActionErrors</code>objectwithno
*recordederrormessages
*
*@parammappingThemappingusedtoselectthisinstance
*@paramrequestTheservletrequestweareprocessing
*/
publicActionErrorsvalidate(ActionMappingmapping
HttpServletRequestrequest){
ActionErrorserrors=newActionErrors();
if((host==null)||(hostlength()<))
errorsadd(host
newActionError(errorhostrequired));
if((username==null)||(usernamelength()<))
errorsadd(username
new