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
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(五)的更多相关文章
- Struts(五)之OGNL、contextMap
一.OGNL 1.1.定义 OGNL是Object-Graph Navigation Language的缩写,它是一个单独的开源项目. Struts2框架使用OGNL作为默认的表达式语言.它是一种功能 ...
- struts(五) 使用通配符 接收参数
1.使用通配符简化配置 约定优于配置 <action name="student*" class="com.gc.StudentAction" metho ...
- Struts2 整合Spring(Maven,注解版)
这两天正在试验Struts2与Spring框架的整合,和他们各自的“注解”.今天就总结一下这两个框架怎么用注解进行整合. 一,加入两者的依赖包,除了两者的必要依赖外,还需要导入struts2-spri ...
- Maven搭建SSH环境
一.新建maven项目 选中maven-aechetype-webapp group Id一般为公司域 :Artifact Id相当于项目名称 :version不需要更改:Package不使用默认,手 ...
- 我和Lua并非一见钟情,我们期待着日久生情(相遇篇)
Lua作为一款轻量级的脚本语言,由标准C编写而成,可被C/C++调用,也可调用C/C++的函数. 在目前的脚本引擎中,Lua的速度是最快的... Lua可直接在EditPlus文本处理器上开发,只需搭 ...
- struts2框架开发的第一个应用
写这篇博文,主要是帮助那些刚接触struts2框架开发而不知所措的人,希望批评指正 一.先建立一个web project,命名为struts2 二.在webroot/WEB-INF/lib目录下添加如 ...
- struts2知识点复习
一. MVC Model 1:将所有的程序代码,都写到JSP页面中. Model 2:JSP(流程控制.数据显示) + JavaBean 改进的Model2:Servlet(流程控制) + Jsp(数 ...
- Java EE之Struts2-2.5配置
开学以来,已经三周了.Java EE却不太走心,于是,这几日空杯心态,重新学习.复习了Java SE和Java Web开发技术,然后入手Struts2.为了使用最新版本的Structs2,我去官网下载 ...
- struts2基础---->第一个Struts2程序
学习struts2的第一个程序,这里只会涉及到简单的代码编写.有一个夜晚我烧毁了所有的记忆,从此我的梦就透明了:有一个早晨我扔掉了所有的昨天,从此我的脚步就轻盈了. Struts的项目
随机推荐
- 【C++】将调用第三方库的代码封装成动态库供上层调用
需求分析 Java应用中需要调用C++的程序,而这个C++的程序中需要引入一个第三方静态库.所以需要将该程序编译成一个动态库文件(.so)供Java调用. 步骤 使用CLion创建一个动态库的项目,会 ...
- 使用rapidjson把文本json数据解析到树状结构
一个递归搞定 无聊的时候练练手就写了一个 头文件什么的我就不贴了 demo程序是MFC写的 void ParseObject(rapidjson::Value dc, CTreeCtrl * pTre ...
- 在nginx里面部署node.js本地服务器
我一个前端,为啥要搞服务器呢?因为公司就招了一个后端啊,后端忙不过来,就叫我这个萌新前端去搞后端的东西,我太难了. 直接进入正题吧,因为公司需求,要我在nginx服务器上面搭一个node.js服务器, ...
- POJ2186 Popular Cows 题解 强连通分量
题目链接:http://poj.org/problem?id=2186 题目大意: 每头牛都想成为牛群中的红人. 给定N头牛的牛群和M个有序对(A, B),(A, B)表示牛A认为牛B是红人: 该关系 ...
- 1050 螺旋矩阵 (25 分)C语言
本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 ...
- 小小知识点(十八)U盘中病毒了,System Volume Information文件夹删除不掉
win+R调出命令窗口后搜索cmd,启用cmd命令编辑器,并输入以下命令: attrib "H:\System Volume Information" -s //这句话可以选择 ...
- Mysql中使用mysqldump进行导入导出sql文件
纪念工作中的第一次删库跑路的经历 今天接到一个任务,是将一个测试库数据导到另一个测试库,然而我们公司的数据库是不让直连的,所以只能通过远程连接进行导库操作. 老大布置任务的时候让用dump命令进行操作 ...
- 【设计模式】 (2)关于UML
UML -- Unified Modeling Lanaguage(统计建模语言),是一种软件系统分析和设计的语言工具,他用于帮助软件开发人员进行思考和记录思路的结果. UML本身是一套符号的规定,就 ...
- Graph Transformer Networks 论文分享
论文地址:https://arxiv.org/abs/1911.06455 实现代码地址:https://github.com/ seongjunyun/Graph_Transformer_Netwo ...
- 一次jvm调优过程
jvm调优实战 前端时间把公司的一个分布式定时调度的系统弄上了容器云,部署在kubernetes,在容器运行的动不动就出现问题,特别容易jvm溢出,导致程序不可用,终端无法进入,日志一直在刷错误,ku ...