前端和後端驗證
1.前端:用戶體驗
2.保證程序的安全性
================================驗證框架==========================
登錄驗證:
1.繼承ActionSupport
2.調用validate()
3.配置struts.xml文件
validate() 有缺陷 --> 如,不能進行註冊的特有驗證
調用Action的任務方法時,validate()會默認執行,能夠驗證一些通用規則。
解決方案:
validateXxx():指定須要處理請求方法,【Xxx=指定處理請求的方法】
執行順序:(與代碼前後順序無關)
validateXxx() --> validate() --> 方法
validate()或者validateXxx() 存在不足 --> 驗證規則複雜,實現過程繁瑣;Action類代碼臃腫
解決方案:
使用Struts 2提供的驗證框架
1.集成平常開發經常使用的數據校驗功能
2.多種類型校驗器的集合
校驗器類型 校驗器名稱 說 明
必填校驗器 required 字段不能爲空
必填字符串校驗器 requiredstring 字段值不能爲空長度要大於0
整數校驗器 int 字段的整數值的範圍
字符串長度校驗器 stringlength 字段值的長度的範圍
正則表達式校驗器 regex 字段是否匹配一個正則表達式
字段表達式校驗器 fieldexpression 字段必須知足一個邏輯表達式
日期校驗器 date 日期輸入是否在指定的範圍內
雙精度校驗器 double 字段值必須是雙精度類型
3.步驟:
編寫Action --> 配置Action --> 編寫表單 --> 編寫驗證文件和校驗規則
驗證文件:
a.文件類型xml格式
b.命名規則:ClassName.validation(Action類名);ClassName.alias.validation(struts.xml中Action類名)
c.存放位置:與Action位於同一個包下
實現數據驗證流程圖:javascript
================================國際化和本土化==========================
國際化(Internationalization:I18N)
使程序在不作任何修改的狀況下,能夠在不一樣國家或地區以及不一樣語言環境下,按照當地的語言和格式習慣顯示字符
本地化(Localization:L10N)
一個國際化的程序,當它運行在本地機器時,可以根據本地機器的語言和地區設置顯示相應字符
實現國際化思路:
1.將程序中的提示信息、錯誤信息等放在資源文件中,爲不一樣國家和地區編寫對應資源文件
2.資源文件由不少key-value組成,key保持不變,value隨國家和地區不一樣而不一樣
3.這些資源文件使用共同的基名,經過在基名後面添加語言代碼、國家和地區代碼來進行區分
資源文件名 說 明
ApplicationResources_en.properties 全部英文語言的資源
ApplicationResources_zh.properties 全部的中文語言的資源
ApplicationResources_zh_CN.properties 針對中國大陸的、中文語言的資源
ApplicationResources_zh_HK.properties 針對中國香港的、中文語言的資源
ApplicationResources.properties 默認資源文件,若是請求的資源文件不存在,將調用它的資源進行顯示
資源文件的範圍:(查找順序:Action --> package --> 全局)
1.全局資源文件
a.全部包的全部Action類均可以訪問
b.致使資源文件變得很是龐大臃腫,不便於維護
2.包範圍資源文件
a.對應包下建立package_language_country.properties
b.處於該包及子包下的action才能夠訪問該文件
3.Action範圍資源文件
a.命名格式ActionClassName_language_country.properties
b.只有單個Action能夠訪問
範例:
1.entity包
a.Usercss
1 package com.Elastic.StrutsDemo5.ivy.entity; 2 public class User { 3 private String loginName; 4 private String loginPass; 5 private String userName; 6 private String identityCard; 7 8 public String getLoginName() { 9 return loginName; 10 } 11 public void setLoginName(String loginName) { 12 this.loginName = loginName; 13 } 14 public String getLoginPass() { 15 return loginPass; 16 } 17 public void setLoginPass(String loginPass) { 18 this.loginPass = loginPass; 19 } 20 public String getUserName() { 21 return userName; 22 } 23 public void setUserName(String userName) { 24 this.userName = userName; 25 } 26 public String getIdentityCard() { 27 return identityCard; 28 } 29 public void setIdentityCard(String identityCard) { 30 this.identityCard = identityCard; 31 } 32 }
2.action包
a.UserActionhtml
1 package com.Elastic.StrutsDemo5.ivy.action; 2 3 import com.Elastic.StrutsDemo5.ivy.entity.User; 4 import com.opensymphony.xwork2.ActionSupport; 5 public class UserAction extends ActionSupport { 6 private User user; 7 private String confirmPass; 8 9 public User getUser() { 10 return user; 11 } 12 13 public void setUser(User user) { 14 this.user = user; 15 } 16 17 public String getConfirmPass() { 18 return confirmPass; 19 } 20 21 public void setConfirmPass(String confirmPass) { 22 this.confirmPass = confirmPass; 23 } 24 25 public String reg() { 26 return SUCCESS; 27 } 28 }
b.UserAction-validation.xml前端
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd" > 3 <validators> 4 <field name="user.loginName"> 5 <field-validator type="requiredstring"> 6 <param name="trim">true</param> 7 <!-- <message>用戶名必填</message> --> 8 <!-- 使用驗證的資源文件信息 --> 9 <message key="user.loginName.required"></message> 10 </field-validator> 11 </field> 12 13 <field name="user.loginPass"> 14 <field-validator type="requiredstring"> 15 <!-- 空格爲合法字符 --> 16 <!-- <param name="trim">false</param> --> 17 <message>密碼必填</message> 18 </field-validator> 19 <field-validator type="stringlength"> 20 <param name="minLength">6</param> 21 <param name="maxLength">12</param> 22 <message>密碼長度必須在${minLength}到${maxLength}位之間</message> 23 </field-validator> 24 </field> 25 26 <field name="confirmPass"> 27 <field-validator type="fieldexpression"> 28 <!-- 屬性名字:屬性值比較 --> 29 <param name="expression">confirmPass==user.loginPass</param> 30 <message>兩次密碼必須一致</message> 31 </field-validator> 32 </field> 33 34 <field name="user.identityCard"> 35 <field-validator type="regex"> 36 <param name="regex">^\d{18}$</param> 37 <!-- <param name="regex"><![CDATA[^\d{18}$]]></param> --> 38 <message>身份證號碼必須是18位數字</message> 39 </field-validator> 40 </field> 41 </validators>
3.Struts配置文件 -- struts.xmljava
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" > 3 <struts> 4 5 <!-- 設置資源文件的基本前綴名稱 --> 6 <constant name="struts.custom.i18n.resources" value="message"></constant> 7 8 <package name="default" namespace="/" extends="struts-default"> 9 10 <action name="reg" class="com.Elastic.StrutsDemo5.ivy.action.UserAction" method="reg"> 11 <result name="success">/index.jsp</result> 12 <result name="input">/reg.jsp</result> 13 </action> 14 15 </package> 16 </struts>
4.web.xmljquery
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 3 <display-name>StrutsDemo5_ivy</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 13 <filter> 14 <filter-name>Struts2</filter-name> 15 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 16 </filter> 17 <filter-mapping> 18 <filter-name>Struts2</filter-name> 19 <url-pattern>/*</url-pattern> 20 </filter-mapping> 21 </web-app>
5.jsp
a.reg.jspweb
1 <%-- 引入JSP頁面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 3 <%-- 引入JSTL標籤指令 --%> 4 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 5 <%@taglib uri="/struts-tags" prefix="s" %> 6 <!DOCTYPE html> 7 <html language="zh-CN"> 8 9 <head> 10 <meta charset="utf-8" /> 11 <!--設置瀏覽器渲染的引擎--> 12 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 13 <!--設置支持移動設備--> 14 <meta name="viewport" content="width=device-width,initial-scale=1" /> 15 <title>註冊</title> 16 <!--引入bootstrap的樣式--> 17 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 18 </head> 19 <body> 20 <div class="container-fluid"> 21 22 <s:debug></s:debug> 23 24 <div class="panel panel-primary center-block"> 25 <div class="panel-heading">用戶註冊</div> 26 <div class="panel-body"> 27 <form class="form-horizontal" action="reg" method="post"> 28 <div class="form-group"> 29 <label class="col-md-3 control-label" for="loginName"> 30 <s:text name="regPage.form.loginName"></s:text> 31 </label> 32 <div class="col-md-6" > 33 <!-- value與默認轉發一塊兒用,纔會臨時保存數據 --> 34 <input class="form-control" id="loginName" name="user.loginName" value="${user.loginName }" type="text" autocomplete="off"/> 35 </div> 36 <div class="col-md-3"> 37 <s:fielderror fieldName="user.loginName"></s:fielderror> 38 </div> 39 </div> 40 <div class="form-group"> 41 <label class="col-md-3 control-label" for="loginPass"> 42 <s:text name="regPage.form.loginPass"></s:text> 43 </label> 44 <div class="col-md-6" > 45 <input class="form-control" id="loginPass" name="user.loginPass" value="${user.loginPass }" type="password"/> 46 <%-- <s:password name="user.loginPass" value="user.loginPass"></s:password> --%> 47 </div> 48 <div class="col-md-3"> 49 <s:fielderror fieldName="user.loginPass"></s:fielderror> 50 <s:property value="fieldErrors['user.loginPass'][0]"/> 51 ${fieldErrors['user.loginPass'][0] } 52 53 </div> 54 </div> 55 <div class="form-group"> 56 <label class="col-md-3 control-label" for="confirmPass"> 57 <s:text name="regPage.form.confirmpass"></s:text> 58 </label> 59 <div class="col-md-6" > 60 <input class="form-control" id="confirmPass" name="confirmPass" value="${confirmPass }" type="password"/> 61 </div> 62 <div class="col-md-3"> 63 <s:fielderror fieldName="confirmPass"></s:fielderror> 64 </div> 65 </div> 66 <div class="form-group"> 67 <label class="col-md-3 control-label" for="userName"> 68 <s:text name="regPage.form.userName"></s:text> 69 </label> 70 <div class="col-md-6" > 71 <input class="form-control" id="userName" name="user.userName" value="${user.userName }" type="text" autocomplete="off"/> 72 </div> 73 <div class="col-md-3"> 74 <s:fielderror fieldName="user.userName"></s:fielderror> 75 </div> 76 </div> 77 <div class="form-group"> 78 <label class="col-md-3 control-label" for="identityCard"> 79 <s:text name="regPage.form.identity"></s:text> 80 </label> 81 <div class="col-md-6" > 82 <input class="form-control" id="identityCard" name="user.identityCard" value="${user.identityCard }" type="text" autocomplete="off"/> 83 </div> 84 <div class="col-md-3"> 85 <s:fielderror fieldName="user.identityCard"></s:fielderror> 86 </div> 87 </div> 88 <div class="form-group"> 89 <div class="col-md-offset-3 col-md-6"> 90 <input class="btn btn-primary btn-block" type="submit" value="註冊" /> 91 </div> 92 </div> 93 </form> 94 </div> 95 </div> 96 </div> 97 98 <!--引入JS的樣式 --> 99 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 100 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 101 102 </body> 103 </html>
6.國際化配置文件
a.message.properties(默認)正則表達式
1 user.loginName.required=用戶名必填!! 2 #註冊頁面的顯示內容設置 3 regPage.form.loginName=帳號 4 regPage.form.loginPass=密碼 5 regPage.form.confirmpass=確認密碼 6 regPage.form.userName=姓名 7 regPage.form.identity=身份證
b.message_zh_CN.propertiesexpress
1 user.loginName.required=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\uFF01\uFF01\uFF01
c.message_en_US.propertiesapache
1 user.loginName.required=name is required! 2 #regPage sets 3 regPage.form.loginName=account 4 regPage.form.loginPass=password 5 regPage.form.confirmpass=confirmpass 6 regPage.form.userName=name 7 regPage.form.identity=IDCard
注意:
1.validate() 有缺陷
2.OGNL與EL不能混用
3.本地系統 + 瀏覽器決定默認語言
Q: cmd 不能轉碼???A:Java環境配置不成功 方法一:CLASSPATH:配置%JAVA_HOME%\bin; 方法二:PATH:配置%JAVA_HOME%\bin; Q: s:debug 內容爲空A:沒有從業務層獲得數據Q: s:debug 中parameters爲空A: 地址?test,才能獲得test