zoukankan      html  css  js  c++  java
  • 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位于同一个包下

    实现数据验证流程图:


    ================================国际化和本土化==========================
    国际化(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.User

     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.UserAction

     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.xml

     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.xml

     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.jsp

      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.properties

    1 user.loginName.required=u7528u6237u540Du4E0Du80FDu4E3Au7A7AuFF01uFF01uFF01


    c.message_en_US.properties

    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%in;
        方法二:PATH:配置%JAVA_HOME%in;
        
    Q: s:debug 内容为空
    A:没有从业务层得到数据

    Q: s:debug 中parameters为空
    A: 地址?test,才能得到test

  • 相关阅读:
    每周总结8.18
    每周总结7.28
    每周总结8.25
    每周总结7.21
    每周总结8.11
    每周总结8.4
    大道至简 读后感
    递归进行回文的判断
    课后作业1
    GoodBlogs Websites
  • 原文地址:https://www.cnblogs.com/ivy-xu/p/5648395.html
Copyright © 2011-2022 走看看