业务控制器Action组件教学示例及课后练习参考资料.docx
- 文档编号:6408148
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:20
- 大小:431.24KB
业务控制器Action组件教学示例及课后练习参考资料.docx
《业务控制器Action组件教学示例及课后练习参考资料.docx》由会员分享,可在线阅读,更多相关《业务控制器Action组件教学示例及课后练习参考资料.docx(20页珍藏版)》请在冰豆网上搜索。
业务控制器Action组件教学示例及课后练习参考资料
编程业务控制器Action组件--------将Action类实现Action接口
1、为什么要实现Action接口
(1)如果不实现Action接口
不同的开发者在编程Action类,就可能会出现下面的状况:
没有提供execute()或者方法名称不是execute()。
将出现下面的错误!
(2)如何避免这样的错误在Action类的编程实现中重复出现?
必须提出一个强制的“规范”!
提出接口、并且实现该接口!
2、com.opensymphony.xwork2.Action接口的定义
3、当Action实现了Action接口后,如果还继续没有提供execute()方法时
IDE工具及时提醒开发人员在自己的Action类要重写execute()方法
4、Action接口的定义
publicinterfaceAction{
publicstaticfinaljava.lang.StringSUCCESS="success";
publicstaticfinaljava.lang.StringNONE="none";
publicstaticfinaljava.lang.StringERROR="error";
publicstaticfinaljava.lang.StringINPUT="input";
publicstaticfinaljava.lang.StringLOGIN="login";
publicabstractjava.lang.Stringexecute()throwsjava.lang.Exception;
}
其中的SUCCESS、NONE、ERROR、INPUT、LOGIN几个字符串常量定义了常用的几类返回值。
而execute()方法,则是每个Action的入口方法,默认情况下XWork将调用每个Action的execute()方法以完成业务逻辑处理。
这样对于我们的Action类来说,最简单的方式就是只实现publicjava.lang.Stringexecute()throwsjava.lang.Exception这个方法就可以了,它的返回值是一个字符串类型的路径别名,这个别名定义在配置文件的result标记中。
5、实现Action接口的主要目的
(1)规范Action类的编程——必须重写execute()方法,能够减少上面的错误情况
(2)规范Action程序的处理的“结果状态”的名称——标准化返回的结果
6、将UserInfoAction类实现com.opensymphony.xwork2.Action
packagecom.px1987.sshwebcrm.action;
importjava.text.DateFormat;
importjava.util.Date;
importcom.opensymphony.xwork2.Action;
publicclassUserInfoActionimplementsAction{
publicStringexecute(){
resultMessage="您好!
您登陆成功!
时间为:
"+
DateFormat.getInstance().format(newDate());
returnthis.SUCCESS;
}
privateStringresultMessage;
publicStringgetResultMessage(){
returnresultMessage;
}
publicvoidsetResultMessage(StringresultMessage){
this.resultMessage=resultMessage;
}
publicUserInfoAction(){
}
}
7、以后不再会出现下面的错误或者不规范的情况
(1)出现错误
(2)也不再会出现不规范的返回结果
8、为什么要实现接口呢?
Struts2中的action可以不再继承于任何类或需要实现任何接口,返回的SUCCESS是在接口com.opensymphony.xwork2.Action中定义,另外同时定义的还有ERROR,INPUT,LOGIN,NONE。
●SUCCESS:
Action正确的执行完成,返回相应的视图;
●NONE:
表示Action正确的执行完成,但并不返回任何视图;
●ERROR:
表示Action执行失败,返回到错误处理视图;
●INPUT:
Action的执行,需要从前端界面获取参数,INPUT就是代表这个参数输入的界面,一般在应用中,会对这些参数进行验证,如果验证没有通过,将自动返回到该视图;
●LOGIN:
Action因为用户没有登陆的原因没有正确执行,将返回该登陆视图,要求用户进行登陆验证。
9、再部署并执行本程序------Struts.xml文件不变化
http:
//127.0.0.1:
8080/sshwebcrm/userManage/userLogin.jsp
将Action类继承ActionSupport类
继承com.opensymphony.xwork2.ActionSupport(可以规范Action编程,同时可以获得Struts2所提供的技术支持)
1、com.opensymphony.xwork2.ActionSupport类(适配器类---类似HttpServlet类)
参考JavaDoc,可知ActionSupport类实现了下面的接口:
●com.opensymphony.xwork2.Action、
●com.opensymphony.xwork2.LoaleProvider
●com.opensymphony.xwork2.TextProvider
●com.opensymphony.xwork2.Validateable
●com.opensymphony.xwork2.ValidationAware
●com.uwyn.rife.continuations.ContinuableObject
●java.io.Searializable
●java.lang.Cloneable
因此,如果继承于ActionSupport类,将能够获得更多的技术支持(如国际化、表单验证、拦截器)、文件上传下载等
2、编程该类
packagecom.px1987.sshwebcrm.action;
importjava.text.DateFormat;
importjava.util.Date;
importcom.opensymphony.xwork2.ActionSupport;
//publicclassUserInfoActionimplementsAction
publicclassUserInfoActionextendsActionSupport{
publicStringexecute(){
resultMessage="您好!
您登陆成功!
时间为:
"+
DateFormat.getInstance().format(newDate());
returnthis.SUCCESS;
}
privateStringresultMessage;
publicStringgetResultMessage(){
returnresultMessage;
}
publicvoidsetResultMessage(StringresultMessage){
this.resultMessage=resultMessage;
}
publicUserInfoAction(){
}
}
3、再执行本程序http:
//127.0.0.1:
8080/Struts2Web/userManage/userLogin.jsp
4、此时如果在Action类不重写execute方法
(1)此时没有语法错误——因为继承是“非强制性”、而实现接口“是强制性”
(2)执行的结果——出现下面的状况,出现了“逻辑性”的错误
(3)由于ActionSupport类不是抽象类
更好的设计,应该将ActionSupport类设计为抽象类,并且将execute()方法继续设计为抽象方法
publicStringexecute(){
return“”;
}
注意:
在继承ActionSupport类的同时,还必须要重写execute()方法。
体验自定义Action调用方法的实现示例
1、修改UserInfoAction类
packagecom.px1987.sshwebcrm.action;
importjava.text.DateFormat;
importjava.util.Date;
importcom.opensymphony.xwork2.ActionSupport;
//publicclassUserInfoActionimplementsAction
publicclassUserInfoActionextendsActionSupport{
publicStringdoUserLogin(){
resultMessage="您好!
采用自定义方法处理登陆功能!
";
returnthis.SUCCESS;
}
publicStringexecute(){
resultMessage="您好!
您登陆成功!
时间为:
"+
DateFormat.getInstance().format(newDate());
returnthis.SUCCESS;
}
privateStringresultMessage;
publicStringgetResultMessage(){
returnresultMessage;
}
publicvoidsetResultMessage(StringresultMessage){
this.resultMessage=resultMessage;
}
publicUserInfoAction(){
}
}
注意:
Struts2的Action是基于Command模式的实现,在Struts2中,除了实现Action接口的execute()方法之外,Action还可以定义多个执行方法。
这些方法必须要是无方法参数,并且返回返回字符串的方法。
2、修改struts.xml配置文件中的项目
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.1.dtd">
name="userInfoAction"class="com.px1987.sshwebcrm.action.UserInfoAction"> 3、访问自定义的Action方法时 在表单中继续以http: //127.0.0.1: 8080/sshwebcrm/userInfoAction.action标准的请求方式进行访问,将出现下面的结果。 注意 此时Strust2系统将找由“method="doUserLogin"”所定义的目标方法,而不再找标准的execute方法。 从结果来看是相同的,这主要是由于在配置文件中的method="doUserLogin"的设置所起的作用。 4、如果Action类中有多个不同的自定义方法时,刚才的实现方法不能满足要求 (1)此时可以采用在Action名后加上“! xxx”(xxx为目标方法名)指定请求的目标方法 因此,该方法能够满足在Action类中有多个不同的处理器方法的应用要求。 (2)实现的方法 只需要在请求时指定目标方法名。 比如,修改userLogin.jsp页面的表单提交的action属性为下面的内容 doUserLogin.action"method="post"> 并且可以将“method="doUserLogin"”除掉, 再进行表单的提交,同样也将出现下面的结果 其中struts.xml文件中的 它的出现可以让我们避免多个名字相同的action定义出现冲突。 它的默认值是””,也就是空字符串。 另外它还可以取值为根目录,也就是”/”,被称为RootNamespace,它对应着访问Web应用根目录的情况,对我们的例子来说就是在浏览器中访问/showDateAction。 其它的取值,一般来说以/开头,例如/example,则相当于给当前所有的action定义都加了一个前缀,那么假设我们当前例子的配置文件的package定义为: 重新发布项目后,我们访问Action的路径将会是: http: //127.0.0.1: 8080/sshwebcrm/webcrmUserInfo/userInfoAction! doUserLogin.action。 体验Struts2中Action类的多个业务处理方法的应用 1、如果需要自定义多个不同的业务调度方法(模拟Struts框架中的DisptachAction的功能) (1)在配置文件中不能再采用method属性的定义方式 在struts.xml中除掉method="doUserLogin"项目 xmlversion="1.0"encoding="UTF-8"? > DOCTYPEstrutsPUBLIC "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" "http: //struts.apache.org/dtds/struts-2.0.dtd"> method="doUserLogin"> (2)在Action类中再增加第2个自定义的方法 packagecom.px1987.sshwebcrm.action; importjava.text.DateFormat; importjava.util.Date; importcom.opensymphony.xwork2.ActionSupport; //publicclassUserInfoActionimplementsAction publicclassUserInfoActionextendsActionSupport{ publicStringdoUserLogin(){ resultMessage="您好! 采用自定义方法处理登陆功能! "; returnthis.SUCCESS; } publicStringdoUserRegister(){ resultMessage="您好! 这是在另一个自定义方法处理的注册功能! "; returnthis.SUCCESS; } publicStringexecute(){ resultMessage="您好! 您登陆成功! 时间为: "+ DateFormat.getInstance().format(newDate()); returnthis.SUCCESS; } privateStringresultMessage; publicStringgetResultMessage(){ returnresultMessage; } publicvoidsetResultMessage(StringresultMessage){ this.resultMessage=resultMessage; } publicUserInfoAction(){ } } (3)在userManager目录中再添加一个userRegister.jsp页面并增加下面的表单 <%@pagepageEncoding="gb2312"%> <%@taglibprefix="c"uri=" DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http: //www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> //www.w3.org/1999/xhtml"> urlvalue='/css/pageContentStyle.css'/>"rel="stylesheet"type="text/css"/> urlvalue='/javascript/commonJavaScript.js'/>" type="text/javascript"> includepage="/commonPage/pageHead.jsp"> include> includepage="/commonPage/navMenuBar.jsp"> include> doUserRegister.action"method="post"> 输入右面的认证码: 用户类型: 您的名称: 您的密码:
includepage="/commonPage/authorInfo.jsp">
include>