Every input is evil!

------------------------------华丽的分割线-----------------------------------

客户端提交的数据验证的方式有很多,可以在前段使用JS验证,可以在服务器端进行验证等,本文主要讲使用Struts2 Validation框架进行验证

假定已经存在一个ValidationAction接受前端数据

ValidationAction,代码如下:

package com.huohuo.action;

import com.opensymphony.xwork2.ActionSupport;

public class ValidationAction extends ActionSupport{
private String requiredString ;
private int num;
public int getNum() {
return num;
} public void setNum(int num) {
this.num = num;
} public String getRequiredString() {
return requiredString;
} public void setRequiredString(String requiredString) {
this.requiredString = requiredString;
} public String execute()
{
return SUCCESS;
}
}

显而易见,要验证核实前段提交的两个数据,num和requiredString.重点放在Validation的配置和使用

步骤一:在和ValidaitonAction同一个包下建立名为ValidationAction-validation.xml文件(默认起名为YourActionName-validation.xml,加载时会自动检测XMl)

注意dtd,老版本的会提示你找不到dtd,你要使用最新的dtd,

ValidationAction-validation.xml,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="requiredString"> <!--要验证的数据字段名字-->
<field-validator type="requiredstring"> <!--验证的类型-->
<message>This need a String!</message>
</field-validator>
</field>
<field name="num"> <!--要验证的数据字段名字-->
 <field-validator type="int">    <!--验证的类型-->
  <param name="min">5</param>   
  <param name="max">10</param>
  <message>betweend 5-10</message>
</field-validator>
</field>
</validators>

注意:如果要接受的参数是user.name,user.password,那么你需要在上面ValidationAction-validation.xml加入以下代码:

<field name="user">
  <field-validator type="visitor">
  <param name="context">visitorContext</param>
  <param name="appendPrefix"> true </param>
  <message>修改提示:</message>
  </field-validator>
</field>

需要在User的同一个包下建立一个xml文件,User-visitorContext-validation.xml,加入以下的代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"> <validators>
<field name="email">
<field-validator type="requiredstring">
<message>请输入合法的邮箱名</message>
</field-validator>
</field> <field name="name">
<field-validator type="requiredstring">
<message>用户名不能为空</message>
</field-validator>
</field> <field name="password">
<field-validator type="requiredstring">
<message>密码不能为空</message>
</field-validator>
</field> </validators>

亲测之后发现:

在User-visitorContext-validation.xml文件设定的email类型为type="email"的数据字段不会给我验证,倒腾了几个小时我才发现,要在User中设为requiredstring,同时还需要在ValidationAction-validation.xml文件中添加email这个field

<field name="user.email">
<field-validator type="email">
<message>请填写合法邮箱</message>
</field-validator>
</field>

这样,如果User-visitorContext-validation.xml设定的验证器不起作用,还可以触发ValidationAction-validation.xml设定的触发器,这两个要同时设定,如果只设定后者的不设定前者的还是不会触发。

这样改过就会验证里面的数据了,估计是个bug,没搞明白,搞的脑袋到都大了。

----第二天报错了----------------------

查到原因是因为我有3个ActionValidation.xml文件,里面都用到了user visitor,那么里面的参数 <param name="context">visitorContext</param>里面visitorContext名字要不一样,否则会出BUG

---------第三天报错了--------------

我在页面加入token之后,validation居然失效了,然后我又把每个XML配置文件的<param name="context">visitorContext</param>改成一致的就好使了,妈的,要怎样!

步骤二:

Struts2 Validation机制如果检测到输入不合法,那么会自动返回一个名为result名字为"input",供用户二次输入,所以你要设计好"input",result,本文设置这个JSP为Input.jsp.所以你需要在struts.xml配置这个Input.jsp文件

struts.xml代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" />
<!--Action配置 -->
<package name="default" namespace="/" extends="struts-default">
<action name="validationAction" class="com.huohuo.action.ValidationAction">
<result > /Output.jsp </result >
<result name ="input" > /Input.jsp </result > //如果检测到错误,validation将会返回这个jsp
<result name="fail">/fail.jsp</result>
</action>
</package>
<!-- Add packages here -->
</struts>

步骤三:

写你的Input.jsp文件进行测试,Struts2 validation要配合<s:form>标签,所以你要了解一下<s:form>标签的使用方法

Input.jsp代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<%@taglib prefix = "s" uri ="/struts-tags" %>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
   <s:head/> //这句代码是让出错的时候,message信息为红色的警告信息,如果不加,就是黑色的字体
</head> <body>
<s:form action="validationAction">
<s:textfield name ="requiredString" label ="Required String" />
<s:textfield name ="num" label ="Required Number" />
<s:submit /> </s:form>
</body>
</html>

为了测试,你可以再加一个Output.jsp,我put核心的显示代码如下,别忘了加<%@ s:tag blablabla%>那句话

Output.jsp

 Required String: <s:property value ="requiredString" />
Required number: <s:property value ="num" />

好了,结束,你可以使用Struts2 Validation framework进行输入测试了,是不是很简单,当然还有一些其他的验证类型,如email,date,double,url...查官方文档,穿一手鞋。

--------------------------华丽的分割线--------------------------------------------------------------------------------------------

使用Annotaion进行Validation注解

只需要在ValidationAction需要验证的参数的set方法上面加上一句注释就OK

像上面的例子,验证requiredString,只需要改为

 @RequiredStringValidator(message = "请输入关键字")

public void setRequiredString(String requiredString) {
this.requiredString = requiredString;
}
这样就可以直接使用Struts2 Validation了,不需要ValidationAction-validation.xml文件配置
Struts2提供了集中注解:
1.@RequiredFieldValidator
2.@RequiredStringValidator
3.@EmailValidator
4.@UrlValidator
5.@StringLengthFieldValidator
6.@IntRangeFieldValidator
7.@DateRangeFieldValidator
PS:在一个Action中被validation annotaion标注的属性,会被应用到每一个Action中的方法,如果不想让其他的方法被验证,需要在该方法名上加入@SkipValidation注释

Struts2 Validation学习的更多相关文章

  1. 尚硅谷STRUTS2视频学习笔记

    上一个月一直在学习STRUTS2,学习的是尚硅谷佟刚老师的视频,因为很喜欢佟刚老师的声音,而且他讲的很细,笔记做的也多,基本上是照着他的视频完整的敲了一遍代码,下面就把学习到的知识梳理一遍,最后把项目 ...

  2. Java之struts2框架学习

    Java之struts2框架学习 About Struts2 Struts也是一款MVC框架 , Struts2是Struts的下一代产品,是在Struts1和WebWork的技术基础上进行了合并的全 ...

  3. struts2源代码学习之初始化(一)

    看struts2源代码已有一段时日,从今天開始,就做一个总结吧. 首先,先看看怎么调试struts2源代码吧,主要是下面步骤: 使用Myeclipse创建一个webproject 导入struts2须 ...

  4. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  5. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  6. Struts2框架学习(一)

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

  7. Struts2进阶学习4

    Struts2进阶学习4 自定义拦截器的使用 核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <! ...

  8. Struts2进阶学习3

    Struts2进阶学习3 OGNL表达式与Struts2的整合 核心配置文件与页面 <?xml version="1.0" encoding="UTF-8" ...

  9. Struts2基础学习2

    Struts2基础学习2 项目结构,测试页面与实体类 <%@ page language="java" contentType="text/html; charse ...

随机推荐

  1. 【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    导出数据接口的作用 在数据集成系统项目中,要么是自已集成其他厂家的设备,要么是其他厂家集成自己 ...

  2. ZKUI中文编码以及以docker方式运行的问题

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  3. 滚动变色的文字js特效

    Js实现滚动变色的文字效果,在效果展示页面,可看到文字在交替变色显示,以吸引人的注意,效果真心不错哦,把代码拷贝到你的网站后,修改成想要的文字就OK了. 查看效果:http://keleyi.com/ ...

  4. SharePoint暂时禁用事件触发

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsof ...

  5. iOS开发之XCode设置--消除AFN的警告

    本篇是直接拷贝别人的博文,地址:http://blog.csdn.net/liyiyismile/article/details/50434844 在项目开发中导入第三方sdk后会提示很多这样的错误: ...

  6. React Native 红屏之Could not connect to development server.

    React Native 是目前最火的开发框架,其他不说了,上Bug. 按照  React Native iOS环境搭建 高级版 在mac上  搭建 React Native  环境,运行 项目 若出 ...

  7. Petya勒索木马

    同事小学妹神好奇心,在陌生群里下载了个软件,接下来就是自动重启无法开机. 找我一看,凭我专业帮妹纸装系统多年的经验,起初也不觉得有啥困难,兼容模式下重启,接下来出现这个: 按下any key后: 试了 ...

  8. rails中的session

    学rails toturial的时候,第八章一直觉得有点没吃透,后来看了两篇rails关于session和cookies源码分析的文章,cookie原理与实现(rails篇) 和session原理与实 ...

  9. Java暗箱操作之自动装箱与拆箱

    我以前在写Android项目的时候,估计写得最多最熟练的几句话就是: List<Integer> list = new ArrayList<Integer>(); list.a ...

  10. Windows on Device 项目实践 4 - 智能风扇制作

    在前面的文章中,我们已经学习并且利用Intel Galileo开发板和Windows on Device制作了火焰报警器.感光灯和PWM调光灯.在这个项目中,我们来利用温度传感器和直流电机,完成一个简 ...