struts2中配置Action的方法
1.Action是什么(原文链接:https://www.bbsmax.com/A/GBJrY6pKz0/)
在Struts2中,一个Action类代表一次请求或调用,每个请求的动作都对应于一个相应的Action类,一个Action类是一个独立的工作单元。也就是,用户的每次请求,都会转到一个相应的Action类里面,由这个Action类来进行处理,因此一个Action类代表了用户的一次请求或调用。简单来说,Action就是用来处理一次用户请求的对象。
2.Action有什么作用
public class HelloWorldAction implements Action { private String account; private String password; public String execute() throws Exception { System.out.println("用户输入的参数为===" + "account=" + account + ",password=" + password); return "toWelcome"; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
根据上面的Action实现,在Struts2里面,Action充当着MVC中模型的角色,也就是Action既封装了业务数据,又要处理业务功能。在实际的JavaEE开发中,逻辑部分会放到逻辑层去实现,这就变成Action只是去调用逻辑层来进行业务逻辑的处理,并不是真的在Action里面去实现业务逻辑的处理。上面Action的属性和属性对应的getter/setter方法,就是用来接收用户请求的数据,并把这些数据封装在Action中,在后续处理中可以访问这些数据。上面Action的实现中的execute方法的实现,你会发现execute方法里面实现的功能,正是前面学习的MVC的控制器部分的功能。从另外一个角度说,Struts2的Action也充当着MVC中控制器的角色。
3.Action的三种开发方式(原文链接:https://www.bbsmax.com/A/n2d9MlNgdD/)
(1)继承ActionSupport类:在Action类中需要用到Struts为我们提供的数据校验等Struts已经帮我们实现的功能,我们就继承着ActionSupport类
package com; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldAction extends ActionSupport{ private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String execute() { setMessage("我的第一个Struts2项目"); return "success"; } }
struts.xml的配置
<package name="hellworld" extends="struts-default"> <action name="HelloWorld" class="com.HelloWorldAction"> <result name="success">/HelloWorld.jsp</result> </action> </package>
(2)实现Action接口:ActionSuppot也继承着Action接口,所以ActionSuppot拥有Action接口的全部功能
(3)不继承任何类、不实现任何接口:一个普通的Java类
package com; public class UserAction { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String addUser() { if(this.getUsername()!=null&&this.getPassword()!=null) { return "ok"; } else { return "no"; } } public String updateUser() { if(this.getUsername()!=null&&this.getPassword()!=null) { return "ok"; } else { return "no"; } } public String deleteUser() { if(this.getUsername()!=null&&this.getPassword()!=null) { return "ok"; } else { return "no"; } } }
struts.xml的配置
<package name="usermanage" extends="struts-default"> <action name="user" class="com.UserAction" method="addUser"> <result name="ok">/success.jsp</result> <result name="no">/fail.jsp</result> </action> </package>
4.通配符(原文链接:https://www.bbsmax.com/A/n2d9MlNgdD/)
在讲解通配符之前,我们来看一下需求…..
现在我的Action中有两个方法,处理登陆和处理注册:
public class PrivilegeAction extends ActionSupport { public String login() { System.out.println("我是登陆"); return "success"; } public String register() { System.out.println("我是注册"); return "success"; } }
因此,我们就需要在struts.xml文件中配置两个action节点
<action name="login" class="privilegeaction.PrivilegeAction" method="login"> <result name="success">/index.jsp</result> </action> <action name="register" class="privilegeaction.PrivilegeAction" method="register"> <result name="success">/index.jsp</result> </action>
现在我们发现:它们仅仅只有访问路径和方法的名称是不一样的….但是这却要多配置一个action节点,会造成浪费!
使用通配符改造如下:
<package name="privilige" extends="struts-default"> <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}"> <result name="success">/index.jsp</result> </action> </package>
“privilege_*”表示:只要请求的Action以privilege开头,都将匹配。
"{1}"表示:请求到达Action类后,将执行通配符