Struts2的輸入校驗實例代碼
在我們項目實際開發(fā)中在數(shù)據(jù)校驗時,分為兩種,一種是前端校驗,一種是服務器校驗:
客戶端校驗:主要是通過jsp寫js腳本,它的優(yōu)點很明顯,就是輸入錯誤的話提醒比較及時,能夠減輕服務器的負擔,但是客戶端校驗并不是安全的,簡單來講就是防君子防不了小人。
服務器端校驗:最大特點就是數(shù)據(jù)安全,但是如果只有服務器端校驗,會大大增加服務器端的負擔。
所以一般在我們開發(fā)中,是客戶端和服務器端校驗相結合作用的。
那這篇文章,我只講服務器端校驗,在Struts2支持兩種校驗方式:
代碼校驗 :在服務器通過編輯java代碼完成數(shù)據(jù)校驗
配置校驗: xml配置校驗 通過xml配置文件完成數(shù)據(jù)的校驗
(1)代碼校驗:
代碼校驗分為三個步驟:
步驟一、封裝數(shù)據(jù)
步驟二、實現(xiàn)要校驗的Action 必須繼承ActionSupport
步驟三、覆蓋Validate方法 然后完成業(yè)務邏輯數(shù)據(jù)的校驗
用戶界面 register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
<head>
<title>用戶注冊</title>
</head>
<body style="text-align: center;">
<table align="center" width="50%">
<tr>
<td style="color: red">
<!-- <s:fielderror></s:fielderror> --> <!-- 這里是顯示錯誤的地方 -->
</td>
</tr>
</table>
<form action="${pageContext.request.contextPath }/login" method="post" >
用戶名:<input type="text" name="username"><br><br>
密 碼:<input type="text" name="password"><br><br>
確認密碼:<input type="text" name="password2"><br><br>
<input type="reset" value="清空">
<input type="submit" value="注冊">
</form>
</body>
</html>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 配置常量信息 --> <constant name="struts.devMode" value="true"></constant> <package name="struts2" extends="struts-default" > <action name="login" class="com.study.Login.RegisterAction"> <result name="success">/success.jsp</result> <!-- 在input視圖中可以通過<s:fielderror/>顯示失敗信息 --> <result name="input">/register.jsp</result> </action> </package> </struts>
RegisterAction.java
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport{
private String username;
private String password;
private String password2;
//這里我通過set方法封裝數(shù)據(jù)
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setPassword2(String password2) {
this.password2 = password2;
}
@Override
public String execute() throws Exception {
return NONE;
}
//在服務器端需要完成對數(shù)據(jù)的校驗
@Override
public void validate() {
//測試是否得到屬性值,證實已經(jīng)得到
System.out.println(username+"---"+password+"---"+password2);
if(username==null || username.length()<6 || username.length()>20){
//把錯誤信息保存到字段中
this.addFieldError("username", "有戶名輸入不合法");
}
if(password==null || password.length()<6 || password.length()>20){
//把錯誤信息保存到字段中
this.addFieldError("password", "密碼輸入不合法");
}else if( password2==null || password2.length()<6 || password2.length()>20){
this.addFieldError("password2", "密碼輸入不合法");
}else if(!password.equals(password2)){
this.addFieldError("password2", " 兩次密碼不一致");
}
super.validate();
}
}
運行結果:

(2)框架校驗
框架校驗也就是通過XML配置方式進行數(shù)據(jù)校驗 ,這也是我們在企業(yè)開發(fā)的主流校驗。
XML校驗原理: 將很多規(guī)則代碼已經(jīng)寫好只需要在xml文件中定義需要使用的校驗規(guī)則即可。,所以大大減少了我們的開發(fā)時間。
我先把步驟寫一下:
步驟一:編寫JSP
步驟二:編寫Action 繼承ActionSupport或者Validateable接口
步驟三:封裝請求參數(shù)
步驟四:編寫xml校驗規(guī)則文件
Xml校驗文件的命名規(guī)則: Action類名-validation.xml 對Action中所有的方法都執(zhí)行校驗
舉例命名規(guī)則RegisterAction-validation.xml
同時要滿足:Xml校驗文件和Action類要在同一包下
步驟一: register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用戶注冊</title>
</head>
<body style="text-align: center;">
<table align="center" width="50%">
<tr>
<td style="color: red">
<s:fielderror></s:fielderror>
</td>
</tr>
</table>
<form action="${pageContext.request.contextPath }/login.action" method="post" >
<table width="60%" >
<tr>
<td>用戶名</td>
<td>
<input type="text" name="username" >
</td>
</tr>
<tr>
<td>密碼</td>
<td>
<input type="password" name="password" >
</td>
</tr>
<tr>
<td>確認密碼</td>
<td>
<input type="password" name="password2" >
</td>
</tr>
<tr>
<td>年齡</td>
<td>
<input type="text" name="age" >
</td>
</tr>
<tr>
<td>郵箱</td>
<td>
<input type="text" name="email" >
</td>
</tr>
<tr>
<td>生日</td>
<td>
<input type="text" name="birthday" >
</td>
</tr>
<tr>
<td>畢業(yè)日期</td>
<td>
<input type="text" name="graduation" >
</td>
</tr>
<tr>
<td>
<input type="reset" value="清空">
</td>
<td>
<input type="submit" value="注冊">
</td>
</tr>
</table>
</form>
</body>
</html>
步驟二:RegisterAction.java
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class RegisterAction extends ActionSupport implements ModelDriven<User>{
//手動創(chuàng)建一個對象
private User user =new User();
@Override
public String execute() throws Exception {
return NONE;
}
public User getModel() {
return user;
}
}
步驟三:封裝請求參數(shù)
上面手動校驗的案例我是用set方法封裝數(shù)據(jù),那這里我采用的是使用ModelDriven接口,對請求數(shù)據(jù)進行封裝,
在之前我講過封裝數(shù)據(jù)的三種方法不清楚的可以看下這篇文章:Struts框架(6)---action接收請求參數(shù)
User.java
import java.util.Date;
public class User {
private String username;
private String password;
private String password2;
private Integer age;
private String email;
private Date birthday;
private Date graduation;
/*
* 給屬性提供get和set方法
*/
}
步驟四:RegisterAction-validation.xml
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<!--dtd約束在xwork-core-**.jar包中 -->
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用戶民不能為空</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">15</param>
<message>有戶名長度必須在 ${minLength} 和 ${maxLength}之間 </message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密碼不能為空</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">15</param>
<message>密碼必須在 ${minLength}和${maxLength}之間 </message>
</field-validator>
</field>
<field name="password2">
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[password==password2]]></param>
<message>兩次密碼不一致</message>
</field-validator>
</field>
<field name="age">
<field-validator type="required">
<param name="trim">true</param>
<message>年齡不能為空</message>
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年齡必須在 ${min} 和 ${max}之間</message>
</field-validator>
</field>
<field name="email">
<field-validator type="email">
<message>不是一個合法的郵箱地址</message>
</field-validator>
</field>
<field name="birthday">
<field-validator type="date">
<param name="min">2001-01-01</param>
<param name="max">2003-12-31</param>
<message>生日必須在 ${min} 和${max}之間</message>
</field-validator>
</field>
</validators>
struts.xml不需要任何改變,和之前一樣就可以了
運行結果:

如果你覺得提示錯誤的位置有點丑,那你可以運用Struts2的<s:form>標簽,效果會更好
現(xiàn)在兩種方式都講了,現(xiàn)在對xml配置的要點一些知識要點進行歸納。
xml校驗文件詳解:
<validators>: 根元素
<field>:指定action中要校驗的屬性,name屬性指定將被驗證的表單字段的名字
<field-validator>:指定校驗器, type 指定驗證規(guī)則
上面指定的校驗器requiredstring是由系統(tǒng)提供的,系統(tǒng)提供了能滿足大部分驗證需求
的校驗器,這些校驗器的定義可以在xwork-2.x.jar中的
com.opensymphony.xwork2.validator.validators下的default.xml中找到。
<param>:子元素可以向驗證程序傳遞參數(shù)
<message>:子元素為校驗失敗后的提示信息,如果需要國際化,可以為message
指定key屬性,key的值為屬性文件中的key。
struts2校驗規(guī)則:
系統(tǒng)提供的校驗器如下:
required (必填校驗器,要求被校驗的屬性值不能為null)
requiredstring (必填字符串校驗器,要求被校驗的屬性值不能為null,并且長度大于0,默認情況下會對字符串去前后空格)
stringlength(字符串長度校驗器,要求被校驗的屬性值必須在指定的范圍內(nèi),否則校驗失敗,minLength參數(shù)指定最小長度,maxLength參數(shù)指定最大長度,trim參數(shù)指定校驗field之前是否去除字符串前后的空格)
regex(正則表達式校驗器,檢查被校驗的屬性值是否匹配一個正則表達式,expression參數(shù)指定正則表達式,caseSensitive參數(shù)指定進行正則表達式匹配時,是否區(qū)分大小寫,默認值為true)
int(整數(shù)校驗器,要求field的整數(shù)值必須在指定范圍內(nèi),min指定最小值,max指定最大值)
double(雙精度浮點數(shù)校驗器,要求field的雙精度浮點數(shù)必須在指定范圍內(nèi),min指定最小值,max指定最大值)
fieldexpression(字段OGNL表達式校驗器,要求field滿足一個ognl表達式,expression參數(shù)指定ognl表達式,該邏輯表達式基于ValueStack進行求值,返回true時校驗通過,否則不通過)
email(郵件地址校驗器,要求如果被校驗的屬性值非空,則必須是合法的郵件地址)
url(網(wǎng)址校驗器,要求如果被校驗的屬性值非空,則必須是合法的url地址)
date(日期校驗器,要求field的日期值必須在指定范圍內(nèi),min指定最小值,max指定最大值)
conversion(轉換校驗器,指定在類型轉換失敗時,提示的錯誤信息)
visitor(用于校驗action中復合類型的屬性,它指定一個校驗文件用于校驗復合類型屬性中的屬性)
expression(OGNL表達式校驗器,它是一個非字段校驗器, expression參數(shù)指定ognl表達式,該邏輯表達式基于ValueStack進行求值,返回true時校驗通過,否則不通過,該校驗器不可用在字段校驗器風格的配置中)
最后講一個細節(jié):
編寫校驗文件時,不能出現(xiàn)幫助信息
在編寫ActionClassName-validation.xml校驗文件時,如果出現(xiàn)不了幫助信息,可以按下面方式解決:
windwos->preferences->myeclipse->files and editors->xml->xmlcatalog
點“add”,在出現(xiàn)的窗口中的location中選“File system”,然后在xwork-2.1.2解壓目錄的src\java目錄中選擇xwork-validator-1.0.3.dtd,
回到設置窗口的時候不要急著關閉窗口,應把窗口中的Key Type改為URI 。Key改為http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd
以上所述是小編給大家介紹的Struts2的輸入校驗實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
IDEA的Mybatis Log Plugin插件配置和使用詳解
這篇文章主要介紹了IDEA的Mybatis Log Plugin插件配置和使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
Java編程使用Runtime和Process類運行外部程序的方法
這篇文章主要介紹了Java編程使用Runtime和Process類運行外部程序的方法,結合實例形式分析了java使用Runtime.getRuntime().exec()方法運行外部程序的常見情況與操作技巧,需要的朋友可以參考下2017-08-08
Fluent Mybatis如何做到代碼邏輯和sql邏輯的合一
對比原生Mybatis, Mybatis Plus或者其他框架,F(xiàn)luentMybatis提供了哪些便利呢?很多朋友對這一問題不是很清楚,今天小編給大家?guī)硪黄坛剃P于Fluent Mybatis如何做到代碼邏輯和sql邏輯的合一,一起看看吧2021-08-08
SpringBoot 整合 JMSTemplate的示例代碼
這篇文章主要介紹了SpringBoot 整合 JMSTemplate的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08

