零基础学Struts
上QQ阅读APP看书,第一时间看更新

2.5 完成输入校验

在前面的项目中都没有使用输入校验,也就是说如果用户不输入用户名或密码,同样也可以提交。这样的设计显然不合理,下面简单介绍一下如何为该登录项目添加输入校验。这里只是做简单的介绍,在以后会作为一个专门的知识点进行详细地讲述。

2.5.1 使用Struts 2标签库简化表单

在介绍输入校验之前,首先简单介绍一下Struts 2的标签库。Struts 2框架提供了一组能进行控制流程、输出数据等操作的标签库。使用标签库,能大量地减少代码的编写,只需简单地输入一些参数就可以实现复杂的代码功能。标签库的知识也是非常重要的,这里也只是简单提及,在后面的章节也会作为一个专门的知识点进行详细地讲述。

下面先来看一系列与表单相关的UI表单,各标签名以及功能如下。

(1)form:表单标签,同HTML标签中的<form>。

(2)textfield:单行文本标签,同HTML标签中的<input type=“text”>。

(3)textarea:文本域标签,同HTML标签中的<textarea>。

(4)submit:提交按钮,同HTML标签中的<input type=“submit”>。

(5)select:下拉列表框,同HTML标签中的<select>。

(6)reset:重置按钮,同HTML标签中的<input type=“reset”>。

(7)radio:单选框,同HTML标签中的<input type=“radio”>。

(8)password:密码框,同HTML标签中的<input type=“password”>。

(9)checkbox:复选框,同HTML标签中的<input type=“checkbox”>。

如果要在JSP页面中使用Struts 2提供的标签库,首先必须在页面中使用taglib编译指令导入标签库,添加代码如下所示。

        <%@taglib prefix="s" uri="/struts-tags"%>

使用这些标签库非常简单,只需使用定义的标签库前缀(这里设定的标签库前缀为s),然后加上“:”,再加上使用标签的名称就可以了,如<s:form>。

下面通过Struts 2的表单标签来简化用户登录页“login.jsp”,修改代码如下。

        <%@page contentType="text/html; charset=gb2312"%>
        <%@taglib prefix="s" uri="/struts-tags"%>
        <html>
        <head>
            <title>用户登录</title>
        </head>
        <body>
        <center>
            <h2>用户登录</h2
            <%--登录表单--%>
            <s:form action="login">
                    <s:textfield name="uname" label="用户名"></s:textfield>
                    <s:password name="upassword" label="密码"></s: password >
                    <s:submit value="登录"></s:submit>
                    <s:reset value="重置"></s:reset>
              </s:form>
        </center>
        </body>
        </html>

其中<s:form>为表单标签,设置属性action为“login”,表示页面将提交到“login.action”页。比使用HTML中的<form>标签设置属性action为“login.action”要简单些。

<s:textfield>为单行文本框标签,其中的name属性表示该文本框的名称,同HTML中的<input>标签中的name属性相同。其中的label属性表示在该文本框之前显示的文本信息。

<s:password>为密码框标签,其中的name属性表示该文本框的名称,同HTML中的<input>标签中的name属性相同。其中的label属性表示在该文本框之前显示的文本信息。

<s:submit>为提交按钮标签,其中的value属性用来设置按钮上显示的文本信息。

<s:reset>为重置按钮标签,其中的value属性同<s:submit>一样,用来设置按钮上显示的文本信息。

部署项目,并打开Tomcat服务器。打开浏览器,访问登录页地址“http:// localhost: 8080/ Struts2Demo01/login.jsp”,页面显示效果如图2.11所示。

图2.11 用户登录页

2.5.2 继承ActionSupport完成输入校验

ActionSupport类已经实现了Action接口和Validatable等接口。可以通过继承ActionSupport类简化Action开发。Validatable接口中仅仅只定义了一个validata()方法,通过重写该方法,可以非常方便地实现校验功能。如在该方法中添加对用户输入的参数信息进行判断的功能,如用户名为空、密码为空等。如果要输出错误提示信息,则只需调用ActionSupport类中的addFieldErrors方法即可。

下面为LoginAction添加数据校验功能,修改代码如下。

        package net.hncu.struts2.action;
        import net.hncu.service.LoginCheck;
        import org.apache.struts2.ServletActionContext;
        import com.opensymphony.xwork2.ActionSupport;
        public class LoginAction 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", "username is required");
                      }
                      //如果密码为null,或者为空的话,那么提示错误信息
                      if(getUpassword() == null —— "".equals(getUpassword().trim())){
                              this.addFieldError("upassword", "password is required");
                      }
                }
                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;
                              }
                }
          }

从代码中可以看出,LoginAction类中重写了validate方法,该方法会在执行execute方法之前执行。在执行validate方法时,如果fieldError中已经包含了数据校验错误信息(如用户名没有填写,那么fieldError中添加一条“username is required”的错误提示信息),那么请求将会被转发到input逻辑视图对应的视图资源页面上。

因为在校验失败后,页面将跳转到input对应的视图资源页面。所以必须在“struts.xml”中配置input逻辑视图对应的视图资源为“login.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>
                        <result name="input">/login.jsp</result>
                    </action>
              </package>
        </struts>

部署项目,并打开Tomcat服务器。打开浏览器,访问登录页地址“http://localhost: 8080/Struts2Demo01/login.jsp”。不输入任何用户信息,直接单击“登录”按钮,页面显示效果如图2.12所示。

因为用户名和密码都为空,所以提示“username is required”和“password is required”的错误信息。如果输入用户名,不输入密码,单击“登录”按钮,页面显示效果如图2.13所示。

图2.12 提示错误信息(1)

图2.13 提示错误信息(2)

因为使用了Sturts 2标签库当中的表单标签,而不是单纯的HTML标签。所以在登录页“login.jsp”中并没有使用任何的代码来输出错误提示信息,这些错误提示信息将自动通过添加并显示,Sturts 2标签已经提供了这种输出校验错误的能力,因此不用去手动添加代码来显示校验错误信息。

其中LoginAction类中的addFieldError方法包含两个参数,第一个参数用来指定将在哪个标签上显示错误信息,第二个参数用来指定显示的错误信息。比如addFieldError(“uname”, “username is required”),表示在登录页面的表单中name属性为“uname”的表单元素上显示“username is required”的错误信息。