一、Struts2的控制器有三种形式:Struts2的Action包含了多个属性来封装用户请求的参数,这一点与Struts1的ActionForm非常类似,同时还包含一个execute方法,用来调用业务逻辑组件进行判断,并返回字符串,通过返回的字符串,Struts2会跳转到指定的视图资源。
下面以登录处理为例对Struts2的Action各种形式进行讲解:
1、普通的POJO类。
package action;
import com.LoginCheck;
import com.opensymphony.xwork2.ActionContext;
public class LoginAction {
private String uname;
private String upassword;
//获得uname值
public String getUname() {
return uname;
}
//设置uname值
public void setUname(String uname) {
this.uname = uname;
}
//获得password值
public String getUpassword() {
return upassword;
}
//设置password值
public void setUpassword(String upassword) {
this.upassword = upassword;
}
public String execute() throws Exception {
//new一个LoginCheck对象
LoginCheck lc = new LoginCheck();
//调用业务逻辑组件的判断功能来判断
if(lc.isLogin(getUname(),getUpassword())){
//如果为合法用户,在session范围中添加属性login,其属性值为true,
ActionContext.getContext().getSession().put("login", "true");
return "success";
}else{
return "failure";
}
}
}
对应的LoginCheck为登录验证类。后面几个Action都是运用这个登录验证进行处理。
LoginCheck.java
package com;
public class LoginCheck {
//判断是否为合法用户
public boolean isLogin(String name,String password){
if("admin".equals(name)&&"admin".equals(password)){
return true;
}else{
return false;
}
}
}
这里只是验证用户名和密码都为admin即为合法用户。实际运用中这里都是进行数据库验证。
配置Action:struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <!-- struts为配置文件根元素--> <struts> <!-- Action必须放在指定的包名空间中--> <package name="struts2" extends="struts-default"> <!-- 定义login的Action,其实现类为action.LoginAction2--> <action name="login" class="action.LoginAction"> <!-- 定义处理结果与视图资源之间的关系--> <result name="success">/login_success.jsp</result> <result name="error">/login_failure.jsp</result> </action> </package> </struts>
2、实现Action接口:com.opensymphony.xwoek2.Action.
Action接口源码:Action.java
package com.opensymphony.xwork2;
public interface Action{
//定义了5个字符串常量
public static String SUCCESS ="success";
public static String ERROR ="error";
public static String NONE="none";
public static String INPUT ="input";
public static String LOGIN ="login";
//定义抽象方法execute,用来处理请求
pubilc String execute() throws Exception;
}
这里定义的5个字符串常量和一个抽象方法execute有以下两个优点:1是可以直接返回SUCCESS等常量,不是返回success字符串,可以起到规范代码的作用,而且可以避免出现拼写错误。2是实现Action接口,就必须实现Action接口中的execute方法,从而避免了开发人员忘记定义execute方法,或者由于拼写错误带来的麻烦。
实现Action接口类:LoginAction2.java
package action;
import com.LoginCheck;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
public class LoginAction2 implements Action{
private String uname;
private String upassword;
//获得uname值
public String getUname() {
return uname;
}
//设置uname值
public void setUname(String uname) {
this.uname = uname;
}
//获得password值
public String getUpassword() {
return upassword;
}
//设置password值
public void setUpassword(String upassword) {
this.upassword = upassword;
}
public String execute() throws Exception {
//new一个LoginCheck对象
LoginCheck lc = new LoginCheck();
//调用业务逻辑组件的判断功能来判断
if(lc.isLogin(getUname(),getUpassword())){
//如果为合法用户,在session范围中添加属性login,其属性值为true,
ActionContext.getContext().getSession().put("login", "true");
return SUCCESS;
}else{
return ERROR;
}
}
}
同理:Action配置只需在上面的struts.xml中修改action标记中的class属性值为LoginAction2的全名。
3、继承ActionSupport类:ActionSupport类定义了相应的方法。我们可以直接使用或者重载ActionSupport中的相应方法来完成更多的功能实现。如输入校验public void validate()等。
实现输入校验的Action:LoginAction3.java
package action;
import com.LoginCheck;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction3 extends ActionSupport {
private String uname;
private String upassword;
//获得uname值
public String getUname() {
return uname;
}
//设置uname值
public void setUname(String uname) {
this.uname = uname;
}
//获得password值
public String getUpassword() {
return upassword;
}
//设置password值
public void setUpassword(String upassword) {
this.upassword = upassword;
}
//执行输入校验
public void validate() {
//如果用户名为null,或者为空的话,那么提示错误信息
if(getUname() == null || "".equals(getUname().trim())){
this.addFieldError("uname", this.getText("username.required"));
}
//如果密码为null,或者为空的话,那么提示错误信息
if(getUpassword() == null || "".equals(getUpassword().trim())){
this.addFieldError("upassword", this.getText("password.required"));
}
}
public String execute() throws Exception {
//new一个LoginCheck对象
LoginCheck lc = new LoginCheck();
//调用业务逻辑组件的判断功能来判断
if(lc.isLogin(getUname(),getUpassword())){
//如果为合法用户,在session范围中添加属性login,其属性值为true,
ActionContext.getContext().getSession().put("login", "true");
return "success";
}else{
return "failure";
}
}
}
我们重载了validate方法来进行输入校验。因为校验失败后,页面将跳转到input对应的视图资源页面,所以必须在struts.xml中配置input逻辑视图对应的视图资源(一般为登录页面login.jsp)
struts.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <!-- struts为配置文件根元素--> <struts> <!-- Action必须放在指定的包名空间中--> <package name="struts2" extends="struts-default"> <action name="login" class="action.LoginAction3"> <!-- 定义处理结果与视图资源之间的关系--> <result name="success">/login_success.jsp</result> <result name="error">/login_failure.jsp</result> <result name="input">/login.jsp</result> </action> </package> </struts>