Struts(五)

前端和後端驗證
    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

相關文章
相關標籤/搜索