java

位置:IT落伍者 >> java >> 浏览文章

Struts开发指南之工作流程实例演示


发布日期:2018年08月04日
 
Struts开发指南之工作流程实例演示

下图是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

上一篇:我为什么学习Hibernate

下一篇:一个struts2和spring2的整合