10.1用户输入验证介绍

         我们每 天上网时常会遇到当需要用户输入或者选择一些信息时,你所填写或选择的内容与系统预期不同,此时系统会提示你错误信息。常见的如“用户名不能为空”,“密 码长度不正确”等信息,我们把这类校验称之为用户输入验证。这类错误校验十分必要,如果没有进行用户输入验证将给系统造成极大的隐患,造成系统异常甚至系 统崩溃。
         用户输 入校验具体在编码完成时分为客户端验证和服务器端验证两类。客户端验证,即该校验代码是在客户端完成,该请求并没有提交到服务器,如果出现错误立刻响应给 客户。服务器端验证,即客户将请求提交到服务器端,由服务器端代码进行校验,如果出现错误将错误信息返回给客户。客户端验证的优势在于执行效率高,能够有 效地降低服务器端负载。但是,熟悉编程人都知道用户完全可以绕过客户端验证直接提交到服务器端。因此,用户输入验证仅仅通过客户端验证安全性无法得到保 证。服务器端验证的优势在于安全性高,该代码是部署到服务器端,能够有效地阻止与系统预期不一致的输入。但是,所有的请求都提交到服务器端,服务器的负载 过重,效率低下,影响用户感受。因此正确的用户输入验证应该兼有客户端验证和服务器端验证。
         基于MVC模式下编程时,客户端验证在代码实现上位于视图层,大多数是通过Javascript语言来实现。服务器端验证在代码实现上,应在进行业务处理之前进行验证。这类验证在代码中的控制器(C)层进行。
基于Struts2框架编写的代码时,用户输入验证服务器端验证的代码是在Action中完成,Struts2框架除了提供编码方式实现用户输入验证,还提供了配置方式,即基于校验框架完成用户输入验证。本章就是通过编码方式和配置方式两方面对用户输入验证进行讲解。该框架同时兼顾了客户端验证,这类代码可以由框架基于配置信息直接生成。

10.2编程方式下实现用户输入验证

10.2.1 最简单的用户输入验证实现方式

         如果在编写用户登陆功能时,添加用户输入验证。该验证内容包含:用户名不能为空;密码不能为空;密码长度必须在612位之间。如果用户输入验证错误,则在原页面上显示错误信息,如果用户输入验证正确,则跳转到登陆成功页面,并显示“xxx,您好”的信息,其中xxx为用户输入的用户名。
         该功能执行图示:
1)当用户名和密码都没有输入时
   
Struts2用户输入验证(1)_系统
 
Struts2用户输入验证(1)_信息_02
 
图10-2 用户登陆功非空验证错误  
2)当用户名和密码输入1122
Struts2用户输入验证(1)_系统_03   
图10-2 用户登陆功密码长度验证错误 
3)当用户名和密码输入唐琳和1234567
   
Struts2用户输入验证(1)_信息_04
 
图10-2 用户登陆功验证正确
         该功能在代码实现上代码结构跟以前是以一样的。则在前面所学知识基础上仅仅需要修改Action类,无须增加其它的文件。以下为【用户登陆功能】实现的代码结构:

Struts2用户输入验证(1)_用户名_05
图10-1 用户登陆功能代码结构
         编写该功能时用户需要编写和创建的文件:
文件名
说明
备注
Login.jsp
用户登陆页面
视图
LoginSuccess.jsp
用户登陆成功页面
视图
LoginAction
Action
控制器
struts.xml
Struts2框架的配置文件
配置文件
web.xml
项目的部署描述文件
配置文件
由于篇幅的关系,以下仅列出LoginAction类,Login.jspstruts.xml文件的部分代码。其它代码参考光盘中Unit10文件夹下01的项目代码。
在完成该功能时最重要的就是Action类的编写,本功能基于读者以前的编程习惯编写实现,因此将输入验证部分的代码编写到execute方法内。代码如下所示:
package com.study.erp.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport{
    privateString username;
    privateString password;
    //此处省略属性对应的getset方法
    ….
    publicString execute(){
        //用户输入验证
        if(username== null || username.trim().equals("")){
            addFieldError("username","用户名不能为空.");
        }
        if(password== null || password.trim().equals("")){
            addFieldError("password","密码不能为空.");         
        }elseif(password.length()<6 || password.length()>12){
            addFieldError("password","密码长度应在612位之间.");  
        }
        //如果用户输入验证包含错误信息,则跳转到input视图,否则转向“success”视图
        if(hasFieldErrors()){
            return"input";
        }else{     
            return"success";
        }
    }
}
代码10-1 用户登陆功能LoginAction
由于LoginAction继承了ActionSupport类,因此上述代码中直接调用了两个方法分别是addFieldErrorhasFieldErrors
addFieldError方法: public void addFieldError(String fieldName,StringerrorMessage)
该方法将错误信息添加到框架的FieldError中,与页面的Struts2表单标记紧密结合使用。方法包含两个参数:1. String fieldname参数用于指定该错误信息对应到页面中哪个表单组件,该属性值必须与页面中表单组件的name属性值一致。2. String errorMessage参数用于指定显示到页面上的错误信息的具体内容。
hasFieldErrors方法:public boolean hasFieldErrors ()
该方法用来判断框架的FieldError中是否包含错误信息。如果包含错误信息则返回值为true,否则为false.
上面代码加粗的部分为用户输入验证的相关代码,根据预先的计划分别判断了用户名是否为空,密码是否为空,密码长度是否与预期一致三项。在验证过程发现错误时,则调用addFieldError方法将错误信息添加到框架中的FieldError中,编码时务必注意该方法的第一个参数值必须于表单组件的名字相同,名字的大小写也是敏感的。而Action中的属性也必须与表单组件的名字相同。因此,编程时可以参照属性进行检查。例如:addFieldError("username", "用户名不能为空.");中的username与本类中的属性username必须一致。当完成所有的用户输入验证时,判断框架中的FieldError中是否包含错误信息。如果包含错误信息则跳转到“input”对应的视图中,否则跳转到“success”对应的视图中。
         用户登陆页面显示包括两种情况:1.用户初次访问登陆页面时,该页面需要显示登陆的组件信息。2.当用户输入校验出现错误时,显示登陆页面。该页面除了正常显示登陆的组件信息外还需要显示用户输入校验的错误信息。读者在编码时不必担心如果显示校验的错误信息,在Struts2的标记中已经封装了该功能。用户在编写登陆页面代码时,只需要使用框架标记进行编码实现即可。登陆页面的代码如下所示:
<%@ page language="java"contentType="text/html; charset=utf-8"   pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags"prefix="s" %>
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>用户登陆页面</title>
</head>
<body>
    <h1>用户登陆</h1>
    <hr>
    <s:form action="login.action">
       <s:textfield name="username" label="用户名"></s:textfield>
       <s:password name="password" label="密码"></s:password>
       <s:submit  name="login"value="登陆"/>
    </s:form>
</body>
</html>
代码10-2 用户登陆页面Login.jsp
struts.xml文件对于该功能的配置,需要配置两个结果信息,分别是nameinputsuccess的两个视图结果。具体配置代码如下所示:
<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTDStruts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="default"namespace="/" extends="struts-default">
       <action name="login"class="com.study.erp.action.LoginAction">
           <result name="input">/Login.jsp</result>
            <result name="success">/LoginSuccess.jsp</result>
       </action>
    </package>
</struts>
代码10-3 用户登陆功能struts.xml文件