业务控制器Action组件教学示例及课后练习参考资料Word文件下载.docx
《业务控制器Action组件教学示例及课后练习参考资料Word文件下载.docx》由会员分享,可在线阅读,更多相关《业务控制器Action组件教学示例及课后练习参考资料Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
而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、编程该类
importcom.opensymphony.xwork2.ActionSupport;
//publicclassUserInfoActionimplementsAction
publicclassUserInfoActionextendsActionSupport{
3、再执行本程序http:
8080/Struts2Web/userManage/userLogin.jsp
4、此时如果在Action类不重写execute方法
(1)此时没有语法错误——因为继承是“非强制性”、而实现接口“是强制性”
(2)执行的结果——出现下面的状况,出现了“逻辑性”的错误
(3)由于ActionSupport类不是抽象类
更好的设计,应该将ActionSupport类设计为抽象类,并且将execute()方法继续设计为抽象方法
publicStringexecute(){
return“”;
注意:
在继承ActionSupport类的同时,还必须要重写execute()方法。
体验自定义Action调用方法的实现示例
1、修改UserInfoAction类
publicStringdoUserLogin(){
采用自定义方法处理登陆功能!
Struts2的Action是基于Command模式的实现,在Struts2中,除了实现Action接口的execute()方法之外,Action还可以定义多个执行方法。
这些方法必须要是无方法参数,并且返回返回字符串的方法。
2、修改struts.xml配置文件中的项目
<
?
xmlversion="
1.0"
encoding="
UTF-8"
?
>
!
DOCTYPEstrutsPUBLIC"
-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"
//struts.apache.org/dtds/struts-2.1.dtd"
struts>
<
includefile="
struts-default.xml"
/>
packagename="
userInfoPackage"
extends="
struts-default"
>
actionmethod="
doUserLogin"
name="
userInfoAction"
class="
com.px1987.sshwebcrm.action.UserInfoAction"
resultname="
/userManage/loginSuccess.jsp<
/result>
/action>
/package>
/struts>
3、访问自定义的Action方法时
在表单中继续以http:
8080/sshwebcrm/userInfoAction.action标准的请求方式进行访问,将出现下面的结果。
注意
此时Strust2系统将找由“method="
”所定义的目标方法,而不再找标准的execute方法。
从结果来看是相同的,这主要是由于在配置文件中的method="
的设置所起的作用。
4、如果Action类中有多个不同的自定义方法时,刚才的实现方法不能满足要求
(1)此时可以采用在Action名后加上“!
xxx”(xxx为目标方法名)指定请求的目标方法
因此,该方法能够满足在Action类中有多个不同的处理器方法的应用要求。
(2)实现的方法
只需要在请求时指定目标方法名。
比如,修改userLogin.jsp页面的表单提交的action属性为下面的内容
formaction="
${pageContext.request.contextPath}/userInfoAction!
doUserLogin.action"
method="
post"
并且可以将“method="
”除掉,
再进行表单的提交,同样也将出现下面的结果
其中struts.xml文件中的<
package>
标签中namespace属性是对我们的action的访问路径有影响的。
它的出现可以让我们避免多个名字相同的action定义出现冲突。
它的默认值是””,也就是空字符串。
另外它还可以取值为根目录,也就是”/”,被称为RootNamespace,它对应着访问Web应用根目录的情况,对我们的例子来说就是在浏览器中访问/showDateAction。
其它的取值,一般来说以/开头,例如/example,则相当于给当前所有的action定义都加了一个前缀,那么假设我们当前例子的配置文件的package定义为:
namespace="
/webcrmUserInfo"
重新发布项目后,我们访问Action的路径将会是:
8080/sshwebcrm/webcrmUserInfo/userInfoAction!
doUserLogin.action。
体验Struts2中Action类的多个业务处理方法的应用
1、如果需要自定义多个不同的业务调度方法(模拟Struts框架中的DisptachAction的功能)
(1)在配置文件中不能再采用method属性的定义方式
在struts.xml中除掉method="
项目
DOCTYPEstrutsPUBLIC
//struts.apache.org/dtds/struts-2.0.dtd"
actionname="
class="
method="
/package>
(2)在Action类中再增加第2个自定义的方法
publicStringdoUserRegister(){
您好!
这是在另一个自定义方法处理的注册功能!
(3)在userManager目录中再添加一个userRegister.jsp页面并增加下面的表单
%@pagepageEncoding="
gb2312"
%>
%@taglibprefix="
c"
uri="
DOCTYPEhtmlPUBLIC"
-//W3C//DTDXHTML1.0Transitional//EN"
//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
htmlxmlns="
//www.w3.org/1999/xhtml"
head>
title>
蓝梦集团CRM系统在线用户注册功能页面<
/title>
linkhref="
c:
urlvalue='
/css/pageContentStyle.css'
rel="
stylesheet"
type="
text/css"
/>
scriptlanguage="
javascript"
src="
/javascript/commonJavaScript.js'
type="
text/javascript"
/script>
/head>
body>
jsp:
includepage="
/commonPage/pageHead.jsp"
/jsp:
include>
/commonPage/navMenuBar.jsp"
br/>
divid="
someOnePageContent"
doUserRegister.action"
输入右面的认证码:
inputtype="
text"
name="
verifyCodeDigit"
br/>
用户类型:
selectname="
type_User_Admin"
<
optionvalue="
1"
前台用户<
/option>
<
2"
后台管理员<
/select>
您的名称:
userName"
您的密码:
password"
userPassWord"
submit"
value="
提交"
submitButton"
onclick="
this.value='
正在提交请求,请稍候'
reset"
取消"
/form>
/div>
/commonPage/authorInfo.jsp"
/body>
/html>
同样对userLogin.jsp页面页采用相同的方法
(4)首先浏览首页http:
8080/sshwebcrm/index.jsp
ahref="
${pageContext.request.contextPath}/userManage/userRegister.jsp"
系统注册<
/a>
&
nbsp;
|&
${pageContext.request.contextPath}/userManage/userLogin.jsp"
系统登录<
&
(5)然后再对第二个表单(也就是注册表单)进行操作http:
8080/sshwebcrm/userManage/userRegister.jsp
提交后,将产生出下面的结果
同样对于用户登录功能实现的测试
这样将能够产生出原来的Struts中的DisptachAction的效果,而只需要在请求的URL中指示目标方法的名称。
同一个Action类可以定义为不同的“逻辑”(名称)
1、体验采用“!
”所带来的问题——很容易出现错误
${pageContext.request.contextPath}/userInfoAction.action!
2、在UserInfoAction类中再增加另外两个方法do