上QQ阅读APP看书,第一时间看更新
2.4 改进控制器
在前面的应用中,Action代码都是直接返回字符串。下面介绍通过实现Action接口来改进Action类,并利用该接口的优势。
2.4.1 实现Action接口
通过前面的介绍,知道了如何完成简单的Struts 2的基本应用。下面介绍如何改进控制器Action。
在前面的应用中,Action代码都是直接返回字符串。不过有时候会输入错误,如把“success”输入成了“succeess”,这样项目就无法找到对应的视图资源了。要找出这类的错误也是非常麻烦的。因此Struts 2提供了一个Action接口,通过该接口就可以很好地避免这类问题了。Action接口的源代码如下。
public interface Action { //定义了5个字符串常量 public static String SUCCESS = "success"; public static String NONE = "none"; public static String ERROR = "error"; public static String INPUT = "input"; public static String LOGIN = "login"; //定义抽象方法execute,用来处理请求 public String execute() throws Exception; }
从Action的源代码可以看出,Action接口只是简单地提供了5个字符串常量和一个抽象方法execute,实现这个接口有如下优势。
(1)可以直接返回SUCCESS常量,而不是返回success字符串,可以起到规范代码的作用,而且也可以避免出现错误。
(2)实现Action接口就必须实现Action接口中的execute方法,从而避免了开发人员忘记定义execute方法,或者由于拼写错误而带来的错误。
下面通过实现该Action接口,将原有的Action类代码修改如下。
package net.hncu.struts2.action; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.Action; import net.hncu.service.LoginCheck; public class LoginAction 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())){ //如果为合法用户,在request范围中添加属性login,其属性值为true, ServletActionContext.getRequest().setAttribute("login", "true"); return SUCCESS; }else{ return ERROR; } } }
2.4.2 配置Action
Action接口中并没有提供“failure”字符串常量,不过可以选择ERROR常量来替代。这时需要更改“struts.xml”文件、Action处理结果和视图资源的映射关系。改变“login_failure.jsp”所对应的Action处理结果为“error”,这样如果Action返回的结果为“error”字符串,那么页面将跳转到“login_failure.jsp”。修改代码如下。
<! -- struts为配置文件根元素--> <struts> <! -- Action必须放在指定的包名空间中--> <package name="struts2" extends="struts-default"> <! -- 定义login的Actin,其实现类为net.hncu.struts2.action.LoginAction--> <action name="login" class="net.hncu.struts2.action.LoginAction"> <! -- 定义处理结果与视图资源之间的关系--> <result name="success">/login_success.jsp</result> <result name="error">/login_failure.jsp</result> </action> </package> </struts>