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"> <! -- 定义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> <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”的错误信息。