前端和后端验证
    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

 package com.Elastic.StrutsDemo5.ivy.entity;
public class User {
private String loginName;
private String loginPass;
private String userName;
private String identityCard; public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getLoginPass() {
return loginPass;
}
public void setLoginPass(String loginPass) {
this.loginPass = loginPass;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getIdentityCard() {
return identityCard;
}
public void setIdentityCard(String identityCard) {
this.identityCard = identityCard;
}
}

2.action包
a.UserAction

 package com.Elastic.StrutsDemo5.ivy.action;

 import com.Elastic.StrutsDemo5.ivy.entity.User;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private User user;
private String confirmPass; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public String getConfirmPass() {
return confirmPass;
} public void setConfirmPass(String confirmPass) {
this.confirmPass = confirmPass;
} public String reg() {
return SUCCESS;
}
}

b.UserAction-validation.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd" >
<validators>
<field name="user.loginName">
<field-validator type="requiredstring">
<param name="trim">true</param>
<!-- <message>用户名必填</message> -->
<!-- 使用验证的资源文件信息 -->
<message key="user.loginName.required"></message>
</field-validator>
</field> <field name="user.loginPass">
<field-validator type="requiredstring">
<!-- 空格为合法字符 -->
<!-- <param name="trim">false</param> -->
<message>密码必填</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">12</param>
<message>密码长度必须在${minLength}到${maxLength}位之间</message>
</field-validator>
</field> <field name="confirmPass">
<field-validator type="fieldexpression">
<!-- 属性名字:属性值比较 -->
<param name="expression">confirmPass==user.loginPass</param>
<message>两次密码必须一致</message>
</field-validator>
</field> <field name="user.identityCard">
<field-validator type="regex">
<param name="regex">^\d{18}$</param>
<!-- <param name="regex"><![CDATA[^\d{18}$]]></param> -->
<message>身份证号码必须是18位数字</message>
</field-validator>
</field>
</validators>

3.Struts配置文件 -- 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.custom.i18n.resources" value="message"></constant> <package name="default" namespace="/" extends="struts-default"> <action name="reg" class="com.Elastic.StrutsDemo5.ivy.action.UserAction" method="reg">
<result name="success">/index.jsp</result>
<result name="input">/reg.jsp</result>
</action> </package>
</struts>

4.web.xml

 <?xml version="1.0" encoding="UTF-8"?>
<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">
<display-name>StrutsDemo5_ivy</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <filter>
<filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

5.jsp
a.reg.jsp

 <%-- 引入JSP页面PAGE指令 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%-- 引入JSTL标签指令 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html language="zh-CN"> <head>
<meta charset="utf-8" />
<!--设置浏览器渲染的引擎-->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!--设置支持移动设备-->
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>注册</title>
<!--引入bootstrap的样式-->
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css">
</head>
<body>
<div class="container-fluid"> <s:debug></s:debug> <div class="panel panel-primary center-block">
<div class="panel-heading">用户注册</div>
<div class="panel-body">
<form class="form-horizontal" action="reg" method="post">
<div class="form-group">
<label class="col-md-3 control-label" for="loginName">
<s:text name="regPage.form.loginName"></s:text>
</label>
<div class="col-md-6" >
<!-- value与默认转发一起用,才会临时保存数据 -->
<input class="form-control" id="loginName" name="user.loginName" value="${user.loginName }" type="text" autocomplete="off"/>
</div>
<div class="col-md-3">
<s:fielderror fieldName="user.loginName"></s:fielderror>
</div>
</div>
<div class="form-group">
<label class="col-md-3 control-label" for="loginPass">
<s:text name="regPage.form.loginPass"></s:text>
</label>
<div class="col-md-6" >
<input class="form-control" id="loginPass" name="user.loginPass" value="${user.loginPass }" type="password"/>
<%-- <s:password name="user.loginPass" value="user.loginPass"></s:password> --%>
</div>
<div class="col-md-3">
<s:fielderror fieldName="user.loginPass"></s:fielderror>
<s:property value="fieldErrors['user.loginPass'][0]"/>
${fieldErrors['user.loginPass'][0] } </div>
</div>
<div class="form-group">
<label class="col-md-3 control-label" for="confirmPass">
<s:text name="regPage.form.confirmpass"></s:text>
</label>
<div class="col-md-6" >
<input class="form-control" id="confirmPass" name="confirmPass" value="${confirmPass }" type="password"/>
</div>
<div class="col-md-3">
<s:fielderror fieldName="confirmPass"></s:fielderror>
</div>
</div>
<div class="form-group">
<label class="col-md-3 control-label" for="userName">
<s:text name="regPage.form.userName"></s:text>
</label>
<div class="col-md-6" >
<input class="form-control" id="userName" name="user.userName" value="${user.userName }" type="text" autocomplete="off"/>
</div>
<div class="col-md-3">
<s:fielderror fieldName="user.userName"></s:fielderror>
</div>
</div>
<div class="form-group">
<label class="col-md-3 control-label" for="identityCard">
<s:text name="regPage.form.identity"></s:text>
</label>
<div class="col-md-6" >
<input class="form-control" id="identityCard" name="user.identityCard" value="${user.identityCard }" type="text" autocomplete="off"/>
</div>
<div class="col-md-3">
<s:fielderror fieldName="user.identityCard"></s:fielderror>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-3 col-md-6">
<input class="btn btn-primary btn-block" type="submit" value="注册" />
</div>
</div>
</form>
</div>
</div>
</div> <!--引入JS的样式 -->
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> </body>
</html>

6.国际化配置文件
a.message.properties(默认)

 user.loginName.required=用户名必填!!
#注册页面的显示内容设置
regPage.form.loginName=账号
regPage.form.loginPass=密码
regPage.form.confirmpass=确认密码
regPage.form.userName=姓名
regPage.form.identity=身份证

b.message_zh_CN.properties

 user.loginName.required=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\uFF01\uFF01\uFF01

c.message_en_US.properties

 user.loginName.required=name is required!
#regPage sets
regPage.form.loginName=account
regPage.form.loginPass=password
regPage.form.confirmpass=confirmpass
regPage.form.userName=name
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

Struts(五)的更多相关文章

  1. Struts(五)之OGNL、contextMap

    一.OGNL 1.1.定义 OGNL是Object-Graph Navigation Language的缩写,它是一个单独的开源项目. Struts2框架使用OGNL作为默认的表达式语言.它是一种功能 ...

  2. struts(五) 使用通配符 接收参数

    1.使用通配符简化配置 约定优于配置 <action name="student*" class="com.gc.StudentAction" metho ...

  3. Struts2 整合Spring(Maven,注解版)

    这两天正在试验Struts2与Spring框架的整合,和他们各自的“注解”.今天就总结一下这两个框架怎么用注解进行整合. 一,加入两者的依赖包,除了两者的必要依赖外,还需要导入struts2-spri ...

  4. Maven搭建SSH环境

    一.新建maven项目 选中maven-aechetype-webapp group Id一般为公司域 :Artifact Id相当于项目名称 :version不需要更改:Package不使用默认,手 ...

  5. 我和Lua并非一见钟情,我们期待着日久生情(相遇篇)

    Lua作为一款轻量级的脚本语言,由标准C编写而成,可被C/C++调用,也可调用C/C++的函数. 在目前的脚本引擎中,Lua的速度是最快的... Lua可直接在EditPlus文本处理器上开发,只需搭 ...

  6. struts2框架开发的第一个应用

    写这篇博文,主要是帮助那些刚接触struts2框架开发而不知所措的人,希望批评指正 一.先建立一个web project,命名为struts2 二.在webroot/WEB-INF/lib目录下添加如 ...

  7. struts2知识点复习

    一. MVC Model 1:将所有的程序代码,都写到JSP页面中. Model 2:JSP(流程控制.数据显示) + JavaBean 改进的Model2:Servlet(流程控制) + Jsp(数 ...

  8. Java EE之Struts2-2.5配置

    开学以来,已经三周了.Java EE却不太走心,于是,这几日空杯心态,重新学习.复习了Java SE和Java Web开发技术,然后入手Struts2.为了使用最新版本的Structs2,我去官网下载 ...

  9. struts2基础---->第一个Struts2程序

    学习struts2的第一个程序,这里只会涉及到简单的代码编写.有一个夜晚我烧毁了所有的记忆,从此我的梦就透明了:有一个早晨我扔掉了所有的昨天,从此我的脚步就轻盈了. Struts的项目

随机推荐

  1. Mysql 字段类型与约束条件

    一.数值类型 二.日期类型 三.枚举与集合 四.约束条件 五.设置严格模式 一.数值类型 1.1 整型 应用场景: id号.年龄... tinyint: 有符号:默认范围 -128, 127 无符号: ...

  2. AbstractFactoryPattern(抽象工厂模式)-----Java/.Net

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.

  3. The Annual Summary Of 2019

    Time is flying, it arrives at the end of year again. This is my first year working in PinDuoDuo inc ...

  4. The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone错误的解决办法【已解决】

    ---恢复内容开始--- The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time ...

  5. 1070 结绳 (25 分)C语言

    给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下图所示套接在一起.这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连.每次串连后,原来两段绳子的长度 ...

  6. spring boot 中AOP的使用

    一.AOP统一处理请求日志 也谈AOP 1.AOP是一种编程范式 2.与语言无关,是一种程序设计思想 面向切面(AOP)Aspect Oriented Programming 面向对象(OOP)Obj ...

  7. 来吧,一文彻底搞懂Java中的Comparable和Comparator

    大家好,我是沉默王二,今天在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:Java 的 Comparable 和 Comparator 是兄弟俩吗?像这类灵魂拷问 ...

  8. mybatis两种方式

    // 1.传统的使用 statementId方式 //获取详情 sysApiDocumentMode = template.selectOne("oaApiDocument.getProje ...

  9. oop(面向对象语言的三大特征):封装,继承,多态; (抽象),函数绑定

    封装/隐藏 : 通过类的访问限定符实现的   private    public 继承的意义之一:代码的复用 类的继承是指在一个现有类的基础上去构建一个新的类,构造出来的新类被称为派生类(子类),现有 ...

  10. Ceph日常运维管理和排错 -- <7>

    Ceph日常运维管理 集群监控管理 集群整体运行状态 [root@cephnode01 ~]# ceph -s cluster: id: 8230a918-a0de-4784-9ab8-cd2a2b8 ...