Struts2的Action.docx
- 文档编号:5691780
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:33
- 大小:31.93KB
Struts2的Action.docx
《Struts2的Action.docx》由会员分享,可在线阅读,更多相关《Struts2的Action.docx(33页珍藏版)》请在冰豆网上搜索。
Struts2的Action
对于Struts2应用中的开发者来说,Action才是整个应用系统的核心,开发者需要提供大量的Action类,并且在struts.xml文件中对Action类进行配置,Action中包含了对用户请求的处理逻辑,因此,我们也称Action为业务控制器.
1)实现Action实现类
相对于Struts1而言,Struts2采用的低侵入式的设计,Struts2不要求Action类继承任何的Struts2基类,或者实现任何的Struts2的接口,在这种设计方式下,Struts2的Action类是一个非常普通的POJO(但是通常会包含一个没有参数的execute()方法),从而,有很好的代码复用性.
Struts2通常直接使用Action来封装HTTP请求参数,因此,Action类里面还应该包含与请求参数相对应的属性,并且为这些属性提供getter和setter方法.
比如说,用户请求包含user和password两个请求参数,那么Action就应该提供user和两个属性来封装用户的请求参数,并且为user和password提供对应的getter和setter方法,西面是处理该请求的Action的代码片段:
packagecom.supermos.app.Action;
//处理用户请求的Action类,这个只是一个POJO类
//不需要继承任何的基类,不需要实现任何的接口
publicclassLoginAction{
//提供两个属性来封装HTTP请求的参数
privateStringuser;
privateStringpassword;
publicStringgetUser(){
returnuser;
}
publicvoidsetUser(Stringuser){
this.user=user;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
//Action类默认来处理用户请求的方法,execute
publicStringexecute(){
//处理结束,返回一个字符串,这个字符串将对应视图物理资源
return"success";
}
}
上面的Action类只是一个普通的Java类,这个Java类提供了两个属性,user和password,这个两个属性分别对应两个HTTP请求参数.
(即使Action需要处理的请求包含user和password两个HTTP请求参数,Action类也是可以不包含user和password两个属性的,因为系统是通过对应的getter和setter方法来处理请求参数的,而不是通过属性的名字来处理请求参数的,也就是说,如果包含user的HTTP请求参数,Action类里面是否包含user属性并不重要,重要的是要包含voidsetUser(Stringuser)和StringgetUser()这两个方法)
Action类的属性,不仅可以用于封装请求参数,还可以用于封装处理结果.比如在前面的Action代码中看到的,如果希望将服务器提示的”登录成功”在下一个页面中输出,那么,我们可以在Action类中增加一个tip属性,并且为该属性提供对应的getter和setter方法,也就是为Action类增加如下的代码片段:
//封装服务器提示的tip属性
privateStringtip;
publicStringgetTip(){
returntip;
}
publicvoidsetTip(Stringtip){
this.tip=tip;
}
一旦在Action中设置了tip属性的值,我们就可以在下一个页面当中使用struts2标签来输出该属性的值,在jSP页面当中输出tip属性值的代码片段如下:
--使用Struts2标签来输出tip属性的值-->
propertyvalue=”tip”/> 系统不会严格区分Actino里面的那个属性是用来封装请求参数的属性,那个事用来封装结果的属性,对于系统来说,封装请求参数和封装处理结果的属性石完全平等的.如果用户的HTTP请求里面包含了tip的请求参数,系统就会调用Action的voidsetTip(Stringtip)方法,通过这种方式,名为tip的请求参数就可以传给Action实例,如果Action类里面没有包含对应的方法,那么名字为tip的请求参数也就无法传入该Action. 同样,在JSP页面中输出的Action属性的时候,它也不会区分该属性是用来封装请求参数的还是用于封装处理结果的属性,所以说,使用Struts2的标签既可以输出Action的处理结果,也可以输出Http请求参数值. 从上面的代码可以看到,需要在JSP页面中输出的处理结果是一个非常简单的字符串,可以使用 property…/>标签来控制输出.实际上,Action类里面可以封装非常复杂的属性,包括其他用户自己定义的属性,数组,集合对象和Map对象等等.对于这些复杂类型的输出,一样可以通过Struts2的标签来完成. 为了让用户开发的Action来更加的规范,Struts2提供了一个Action接口,这个接口定义了Struts2的Action处理类应该实现的规范,下面是Action接口的代码: publicinterfaceAction{ publicstaticfinalStringSUCCESS="success"; publicstaticfinalStringERROR="error"; publicstaticfinalStringINPUT="input"; publicstaticfinalStringLOGIN="login"; publicstaticfinalStringNONE="none"; publicStringexecute()throwsException; } 上面的Action接口里面只定义了一个execute方法,该接口的规范规定了Action类应该包含一个execute方法,该方法的作用是返回一个字符串,除此之外,该接口还定义了5个字符串常量,他们的作用是统一execute方法的返回值. 比如说,当Action处理完用户的请求成功之后,有人喜欢返回welcome这种字符串,有的人喜欢返回success字符串…这样不利于项目的统一管理.Struts2的Action定义上面的5个字符串: error,none,input,longin和success等等分别代表了特定的含义,当然,如果开发者依然希望使用特定的字符串做为逻辑视图的名字,开发者依然可以返回自己的视图. 另外,Struts2还提供了Action类的一个实现类: ActionSupport,下面是Action类的代码: packagecom.opensymphony.xwork2; importcom.opensymphony.xwork2.util.ValueStack; importcom.opensymphony.xwork2.util.logging.Logger; importcom.opensymphony.xwork2.util.logging.LoggerFactory; importjava.io.Serializable; importjava.util.*; /** *Providesadefaultimplementationforthemostcommonactions. */ //系统提供的ActionSupport类 publicclassActionSupportimplementsAction,Validateable,ValidationAware,TextProvider,LocaleProvider,Serializable{ protectedstaticLoggerLOG=LoggerFactory.getLogger(ActionSupport.class); privatefinaltransientTextProvidertextProvider=newTextProviderFactory().createInstance(getClass(),this); privatefinalValidationAwareSupportvalidationAware=newValidationAwareSupport(); //收集校验错误的方法 publicvoidsetActionErrors(Collection validationAware.setActionErrors(errorMessages); } //返回校验错误的方法 publicCollection returnvalidationAware.getActionErrors(); } publicvoidsetActionMessages(Collection validationAware.setActionMessages(messages); } publicCollection returnvalidationAware.getActionMessages(); } /** *@deprecatedUse{@link#getActionErrors()}. */ @DeprecatedpublicCollection returngetActionErrors(); } /** *@deprecatedUse{@link#getFieldErrors()}. */ @DeprecatedpublicMap returngetFieldErrors(); } //设置表单域校验错误信息 publicvoidsetFieldErrors(Map validationAware.setFieldErrors(errorMap); } //返回表单域校验错误信息 publicMap returnvalidationAware.getFieldErrors(); } //控制locale的相关信息 publicLocalegetLocale(){ ActionContextctx=ActionContext.getContext(); if(ctx! =null){ returnctx.getLocale(); }else{ LOG.debug("Actioncontextnotinitialized"); returnnull; } } publicbooleanhasKey(Stringkey){ returntextProvider.hasKey(key); } //返回国际化信息的方法 publicStringgetText(StringaTextName){ returntextProvider.getText(aTextName); } publicStringgetText(StringaTextName,StringdefaultValue){ returntextProvider.getText(aTextName,defaultValue); } publicStringgetText(StringaTextName,StringdefaultValue,Stringobj){ returntextProvider.getText(aTextName,defaultValue,obj); } publicStringgetText(StringaTextName,List returntextProvider.getText(aTextName,args); } publicStringgetText(Stringkey,String[]args){ returntextProvider.getText(key,args); } publicStringgetText(StringaTextName,StringdefaultValue,List returntextProvider.getText(aTextName,defaultValue,args); } publicStringgetText(Stringkey,StringdefaultValue,String[]args){ returntextProvider.getText(key,defaultValue,args); } publicStringgetText(Stringkey,StringdefaultValue,List returntextProvider.getText(key,defaultValue,args,stack); } publicStringgetText(Stringkey,StringdefaultValue,String[]args,ValueStackstack){ returntextProvider.getText(key,defaultValue,args,stack); } publicResourceBundlegetTexts(){ returntextProvider.getTexts(); } publicResourceBundlegetTexts(StringaBundleName){ returntextProvider.getTexts(aBundleName); } publicvoidaddActionError(StringanErrorMessage){ validationAware.addActionError(anErrorMessage); } publicvoidaddActionMessage(StringaMessage){ validationAware.addActionMessage(aMessage); } publicvoidaddFieldError(StringfieldName,StringerrorMessage){ validationAware.addFieldError(fieldName,errorMessage); } publicStringinput()throwsException{ returnINPUT; } publicStringdoDefault()throwsException{ returnSUCCESS; } /** *Adefaultimplementationthatdoesnothinganreturns"success". * *Subclassesshouldoverridethismethodtoprovidetheirbusinesslogic. *
*Seealso{@linkcom.opensymphony.xwork2.Action#execute()}.
*
*@returnreturns{@link#SUCCESS}
*@throwsExceptioncanbethrownbysubclasses.
*/
//默认的处理用户请求的方法,直接返回success字符串
publicStringexecute()throwsException{
returnSUCCESS;
}
publicbooleanhasActionErrors(){
returnvalidationAware.hasActionErrors();
}
publicbooleanhasActionMessages(){
returnvalidationAware.hasActionMessages();
}
publicbooleanhasErrors(){
returnvalidationAware.hasErrors();
}
publicbooleanhasFieldErrors(){
returnvalidationAware.hasFieldErrors();
}
/**
*Clearsfielderrors.UsefulforContinuationsandothersituations
*whereyoumightwanttoclearpartsofthestateonthesameaction.
*/
publicvoidclearFieldErrors(){
validationAware.clearFieldErrors();
}
/**
*Clearsactionerrors.UsefulforContinuationsandothersituations
*whereyoumightwanttoclearpartsofthestateonthesameaction.
*/
publicvoidclearActionErrors(){
validationAware.clearActionErrors();
}
/**
*Clearsmessages.UsefulforContinuationsandothersituations
*whereyoumightwanttoclearpartsofthestateonthesameaction.
*/
publicvoidclearMessages(){
validationAware.clearMessages();
}
/**
*Clearsallerrors.UsefulforContinuationsandothersituations
*whereyoumightwanttoclearpartsofthestateonthesameaction.
*/
publicvoidclearErrors(){
validationAware.clearErrors();
}
/**
*Clearsallerrorsandmessages.UsefulforContinuationsandothersituations
*whereyoumightwanttoclearpartsofthestateonthesameaction.
*/
publicvoidclearErrorsAndMessages(){
validationAware.clearErrorsAndMessages();
}
/**
*Adefaultimplementationthatvalidatesnothing.
*Subclassesshouldoverridethismethodtoprovidevalidations.
*/
//包含空的输入校验方法
publicvoidvalidate(){
}
@OverridepublicObjectclone()throwsCloneNotSupportedException{
returnsuper.clone();
}
publicvoidpause(Stringresult){
}
}
正如上面的代码看到的,该Action是一个默认的Action类,该类里面已经提供了很多默认的方法,这些默认的方法包括获取国际化信息的方法,数据校验的方法,默认的处理用户请求的方法等等,实际上,ActionSupport类是Struts2默认的Action处理类,如果让开发者的Action类继承该ActionSupport来,就会大大的简化Action的开发.
(当用户配置的Action类没有指定class属性的时候,系统会自动使用ActionSupport类作为默认的Action处理类)
2)Action访问ServletAPI
Struts2的Action并没有直接和任何的ServletAPI进行耦合,这是Struts2的一个改良之处,因为Action类不再和ServletAPI耦合,就可以更加轻松的去测试该Action,就不用mock去模拟数据测试了.
但是对于web应用的控制器而言,不访问ServletAPI几乎是不可能的,比如说跟踪HTTPSession的状态等等.Struts2框架提供了一种更加轻松的方式来访问ServletAPI,Web应用中通常需要访问的ServletAPI就是HttpServletRequest,HttpSession和HttpContext,这三个类分别代表JSP内置对象里面的request,session和application.
Struts2提供了一个ActionContext类,Struts2的Action可以通过该类来访问ServletAPI,下面是ActionC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Struts2 Action