Struts2的输入校验

在我们项目实际开发中在数据校验时,分为两种,一种是前端校验,一种是服务器校验:

客户端校验:主要是通过jsp写js脚本,它的优点很明显,就是输入错误的话提醒比较及时,能够减轻服务器的负担,但是客户端校验并不是安全的,简单来讲就是防君子防不了小人。

服务器端校验:最大特点就是数据安全,但是如果只有服务器端校验,会大大增加服务器端的负担。

所以一般在我们开发中,是客户端和服务器端校验相结合作用的。

那这篇文章,我只讲服务器端校验,在Struts2支持两种校验方式:

代码校验 :在服务器通过编辑java代码完成数据校验

配置校验: xml配置校验 通过xml配置文件完成数据的校验

(1)代码校验:

代码校验分为三个步骤:

步骤一、封装数据

步骤二、实现要校验的Action  必须继承ActionSupport

步骤三、覆盖Validate方法  然后完成业务逻辑数据的校验

用户界面 register.jsp

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
<head>
<title>用户注册</title>
</head>
<body style="text-align: center;">
<table align="center" width="50%">
<tr>
<td style="color: red">
<!-- <s:fielderror></s:fielderror> --> <!-- 这里是显示错误的地方 -->
</td>
</tr>
</table> <form action="${pageContext.request.contextPath }/login" method="post" > 用户名:<input type="text" name="username"><br><br>
密 码:<input type="text" name="password"><br><br>
确认密码:<input type="text" name="password2"><br><br>
<input type="reset" value="清空">
<input type="submit" value="注册"> </form>
</body>
</html>

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.devMode" value="true"></constant> <package name="struts2" extends="struts-default" >
<action name="login" class="com.study.Login.RegisterAction">
<result name="success">/success.jsp</result>
<!-- 在input视图中可以通过<s:fielderror/>显示失败信息 -->
<result name="input">/register.jsp</result>
</action>
</package>
</struts>
RegisterAction.java
 import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport{ private String username;
private String password;
private String password2;
//这里我通过set方法封装数据
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setPassword2(String password2) {
this.password2 = password2;
} @Override
public String execute() throws Exception {
return NONE;
} //在服务器端需要完成对数据的校验
@Override
public void validate() {
//测试是否得到属性值,证实已经得到
System.out.println(username+"---"+password+"---"+password2);
if(username==null || username.length()<6 || username.length()>20){
//把错误信息保存到字段中
this.addFieldError("username", "有户名输入不合法");
} if(password==null || password.length()<6 || password.length()>20){
//把错误信息保存到字段中
this.addFieldError("password", "密码输入不合法");
}else if( password2==null || password2.length()<6 || password2.length()>20){
this.addFieldError("password2", "密码输入不合法");
}else if(!password.equals(password2)){
this.addFieldError("password2", " 两次密码不一致");
} super.validate();
}
}
运行结果:

 (2)框架校验

框架校验也就是通过XML配置方式进行数据校验 ,这也是我们在企业开发的主流校验。

XML校验原理: 将很多规则代码已经写好只需要在xml文件中定义需要使用的校验规则即可。,所以大大减少了我们的开发时间。

我先把步骤写一下:

步骤一:编写JSP

步骤二:编写Action 继承ActionSupport或者Validateable接口

 步骤三:封装请求参数

   步骤四:编写xml校验规则文件

Xml校验文件的命名规则:   Action类名-validation.xml 对Action中所有的方法都执行校验

举例命名规则RegisterAction-validation.xml

同时要满足:Xml校验文件和Action类要在同一包下

步骤一: register.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户注册</title>
</head> <body style="text-align: center;">
<table align="center" width="50%">
<tr>
<td style="color: red">
<s:fielderror></s:fielderror>
</td>
</tr> </table> <form action="${pageContext.request.contextPath }/login.action" method="post" >
<table width="60%" >
<tr>
<td>用户名</td>
<td>
<input type="text" name="username" >
</td>
</tr> <tr>
<td>密码</td>
<td>
<input type="password" name="password" >
</td>
</tr> <tr>
<td>确认密码</td>
<td>
<input type="password" name="password2" >
</td>
</tr> <tr>
<td>年龄</td>
<td>
<input type="text" name="age" >
</td>
</tr> <tr>
<td>邮箱</td>
<td>
<input type="text" name="email" >
</td>
</tr> <tr>
<td>生日</td>
<td>
<input type="text" name="birthday" >
</td>
</tr> <tr>
<td>毕业日期</td>
<td>
<input type="text" name="graduation" >
</td>
</tr> <tr>
<td>
<input type="reset" value="清空">
</td>
<td>
<input type="submit" value="注册">
</td>
</tr> </table>
</form> </body>
</html>

register.jsp

步骤二:RegisterAction.java

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class RegisterAction extends ActionSupport implements ModelDriven<User>{ //手动创建一个对象
private User user =new User(); @Override
public String execute() throws Exception {
return NONE;
} public User getModel() {
return user;
}
}

步骤三:封装请求参数

上面手动校验的案例我是用set方法封装数据,那这里我采用的是使用ModelDriven接口,对请求数据进行封装,

在之前我讲过封装数据的三种方法不清楚的可以看下这篇文章:Struts框架(6)---action接收请求参数

User.java

 import java.util.Date;
public class User { private String username;
private String password;
private String password2;
private Integer age;
private String email;
private Date birthday;
private Date graduation; /*
* 给属性提供get和set方法
*/
}

步骤四:RegisterAction-validation.xml

<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<!--dtd约束在xwork-core-**.jar包中 -->
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户民不能为空</message>
</field-validator> <field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">15</param>
<message>有户名长度必须在 ${minLength} 和 ${maxLength}之间 </message>
</field-validator>
</field> <field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空</message>
</field-validator> <field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">15</param>
<message>密码必须在 ${minLength}和${maxLength}之间 </message>
</field-validator>
</field> <field name="password2">
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[password==password2]]></param>
<message>两次密码不一致</message>
</field-validator>
</field> <field name="age">
<field-validator type="required">
<param name="trim">true</param>
<message>年龄不能为空</message>
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年龄必须在 ${min} 和 ${max}之间</message>
</field-validator> </field> <field name="email">
<field-validator type="email">
<message>不是一个合法的邮箱地址</message>
</field-validator>
</field> <field name="birthday">
<field-validator type="date">
<param name="min">2001-01-01</param>
<param name="max">2003-12-31</param>
<message>生日必须在 ${min} 和${max}之间</message>
</field-validator>
</field> </validators>

struts.xml不需要任何改变,和之前一样就可以了

运行结果:

如果你觉得提示错误的位置有点丑,那你可以运用Struts2的<s:form>标签,效果会更好

现在两种方式都讲了,现在对xml配置的要点一些知识要点进行归纳。

xml校验文件详解:

<validators>: 根元素

<field>:指定action中要校验的属性,name属性指定将被验证的表单字段的名字

<field-validator>:指定校验器, type 指定验证规则

上面指定的校验器requiredstring是由系统提供的,系统提供了能满足大部分验证需求

的校验器,这些校验器的定义可以在xwork-2.x.jar中的

com.opensymphony.xwork2.validator.validators下的default.xml中找到。

<param>:子元素可以向验证程序传递参数

<message>:子元素为校验失败后的提示信息,如果需要国际化,可以为message

指定key属性,key的值为属性文件中的key。

struts2校验规则:

系统提供的校验器如下:

required (必填校验器,要求被校验的属性值不能为null)

requiredstring (必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)

stringlength(字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)

regex(正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)

int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)

double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)

fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)

email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址)

url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址)

date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)

conversion(转换校验器,指定在类型转换失败时,提示的错误信息)

visitor(用于校验action中复合类型的属性,它指定一个校验文件用于校验复合类型属性中的属性)

expression(OGNL表达式校验器,它是一个非字段校验器, expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)

最后讲一个细节:

编写校验文件时,不能出现帮助信息

在编写ActionClassName-validation.xml校验文件时,如果出现不了帮助信息,可以按下面方式解决:

windwos->preferences->myeclipse->files and editors->xml->xmlcatalog

点“add”,在出现的窗口中的location中选“File system”,然后在xwork-2.1.2解压目录的src\java目录中选择xwork-validator-1.0.3.dtd,

回到设置窗口的时候不要急着关闭窗口,应把窗口中的Key Type改为URI 。Key改为http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd

本文章就讲到这里,有不足之处,欢迎大家留言指点,谢谢!

Struts2框架(8)---Struts2的输入校验的更多相关文章

  1. struts2(四)之输入校验

    前言 这个本来是昨天就写好的,但是不知道为什么没有保存成功!但是今天起来再写一遍就当巩固一下知识吧. 一.输入校验概述 在以前我们写一个登录页面时,并没有限制用户的输入,不管用户输入什么,我们都存入数 ...

  2. struts2框架(1)---struts2入门

    struts2框架 如果你之前在MVC模式的时候一直都是通过servlet,获取和返回数据,那么现在开始学习struts2框架, Struts是一个实现MVC设计模式的优秀的框架.它的许多优点我就不说 ...

  3. Struts2框架之-Struts2的标签

    Struts2包含哪些标签? 解答: A: <s:a href=”"></s:a>—–超链接,类似于html里的<a></a> <s:a ...

  4. Struts2框架07 Struts2 + Spring + Mybatis 整合

    1 导包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.o ...

  5. JavaWeb框架_Struts2_(六)----->Struts2的输入校验

    1. 输入校验章节目录 输入校验概述 客户端校验 服务器端校验 手动编程校验 重写validate方法 重写validateXxx()方法 输入校验流程 校验框架校验 Struts2 内置的校验器 常 ...

  6. Struts2输入校验(XML方式)

    本章主要介绍struts2的XML配置方式输入校验.以下将结合一个实例程序进行说明. 代码结构: 关键代码: RegistAction.javapackage com.alfred.regist.ac ...

  7. struts2框架

    详细教程 参考struts教程https://www.w3cschool.cn/struts_2/struts_configuration.html Struts2 基于MVC设计模式的web应用程序 ...

  8. 经典MVC框架技术-struts2基础知识

    Struts2框架简介 struts2框架是在struts1和webwork技术的基础上,进行合并的全新框架,struts2以Webwork为核心,采用拦截器来处理用户的请求,这样的设计使得业务逻辑控 ...

  9. Struts2框架学习(一)

    Struts2框架学习(一) 1,Struts2框架介绍 Struts2框架是MVC流程框架,适合分层开发.框架应用实现不依赖于Servlet,使用大量的拦截器来处理用户请求,属于无侵入式的设计. 2 ...

随机推荐

  1. EL表达式 requestScope initParam用法

    EL表达式 requestScope initParam用法: servlet: package com.stono.servlet; import java.io.IOException; impo ...

  2. 利用谷歌开源工具cAdvisor 结合influxdb存储+Grafana前端展示进行Docker容器的监控

    一.Docker 监控方式 1.利用docker 的 docker stats API 命令: docker stats [容器ID/容器名称] [root@docker ~]# docker sta ...

  3. 部署AlwaysOn第一步:搭建Windows服务器故障转移集群

    在Windows Server 2012 R2 DataCenter 环境中搭建集群之前,首先要对Windows服务器故障转移集群(Windows Server Failover Cluster,简称 ...

  4. java原装代码完成pdf在线预览和pdf打印及下载

    这是我在工作中,遇到这样需求,完成需求后,总结的成果,就当做是工作笔记,以免日后忘记,当然,能帮助到别人是最好的啦! 下面进入正题: 前提准备: 1. 项目中至少需要引入的jar包,注意版本: a)  ...

  5. Express之get,pos请求参数的获取

    Express的版本4.X Get query参数的获取 url假设:http://localhost:3000/users/zqzjs?name=zhaoqize&word=cool& ...

  6. iOS WebViewJavascriptBridge初步尝试与图文详细讲解

    JS和OC的交互这是个永恒话题,使用场景也是越来越多,如今一些reactnative.vue框架等,都是在重点结合原生与H5的混合使用. 那么,如何快捷方便的使用两者交互是一个很重要的关键点. 1.传 ...

  7. NSDictionary 总结 -iOS

    总结:字典分NSDictionary(不可变,只能查询)和NSMutableDictionary(可变.能增删改查)两种,形式是key-value,key是不可重复的,value可以重复 1.初始化字 ...

  8. java byte【】数组与文件读写(增加新功能)

    今天在测试直接写的文章: java byte[]数组与文件读写 时,想调用FileHelper类对字节数组以追加的方式写文件,结果无论怎样竟然数据录入不全,重新看了下文件的追加模式,提供了两种方式: ...

  9. phpcms如何做企业站--> 替换首页最初操作

    首先用一个静态首页的模板,通过cms进行替换做成一个有后台的 首页的替换流程首先要先把静态网页做出来,拿这个页面去替换 页面所有的文件都在这,做静态页面的文件 现在要做的是把这些文件复制一下拿到php ...

  10. 远程线程注入方法CreateRemoteThread

    最近在整理学习Windows注入方面的知识,这个远程注入前面早写过,现在看看人家博客的理解整理,整理, 需要源码的可以到我的github上下载. 链接是  https://github.com/Ars ...