零基础学Struts
上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">
                      <! -- 定义loginActin,其实现类为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>