使用Struts2实现数据校验

为什么需要数据校验呢?答案很简单,假如当你登录想要京东,这时就需要数据校验了如果不输入用户名的话,那么就不会登陆成功,并且会提示出"请输入用户名"的字样

那么,在Struts2中实现数据校验的方法有哪些呢?接下来我们探讨一下。

实现数据校验有四种方法:


1.用execute()方法实现数据校验

 编写一个Action,继承ActionSupport类,重写execute()

步骤1:在Web项目的cn.happy.action下创建一个ExecuteAction(UserInfo为用户实体,其中有username和password属性,并且封装)

  1. public class ExecuteAction extends ActionSupport {
  2. private UserInfo info;
  3. // 确认密码
  4. private String okpwd;
  5.  
  6. @Override
  7. public String execute() throws Exception {
  8. if (info.getUsername().length() == 0) {
  9. addFieldError("username", "用户名不能为空");
  10. }
  11.  
  12. if (info.getPassword().length() == 0) {
  13. addFieldError("pwd", "密码不能为空");
  14. }
  15.  
  16. if (!info.getPassword().equals(okpwd)) {
  17. addFieldError("pwd", "两次密码必须一致");
  18. }
         //判定FieldError对象中是否有错误信息
  19. //若有错误信息 则返回input
  20. if(this.hasErrors()){
  21. return INPUT;
  22. }
  23. return SUCCESS;
  24. }

步骤2:创建struts.xml文件,引用ExecuteAction类

  1. <struts>
  2. <!-- 修改文件 tomact不用重启 -->
  3. <constant name="struts.devMode" value="true" />
  4.  
  5. <package name="default" namespace="/" extends="struts-default">
  6. <!-- 测试execute方法 -->
  7. <action name="execute" class="cn.happy.action.ExecuteAction">
  8. <result name="success">success.jsp</result>
  9. <result name="input">regist.jsp</result>
  10. </action>
  11. </struts>

步骤3.准备前段注册页面regist.jsp和成功页面success.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <%@ taglib uri="/struts-tags" prefix="s"%>
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11. <title>注册页面</title>
  12. </head>
  13. <body>
  14. <h2>用户注册</h2>
  15. <!-- 取出所有错误信息 -->
  16. <s:fielderror></s:fielderror>
  17. <s:form action="ValidateXxx" method="post">
  18. <s:textfield name="info.username" label="用户名"></s:textfield>
  19. <br/>
  20. <s:textfield name="info.password" label="密码"></s:textfield>
  21. <br/>
  22. <s:textfield name="okpwd" label="确认密码"></s:textfield>
  23. <br/>
  24. <s:submit value="注册"></s:submit>
  25. </s:form>
  26. </body>
  27. </html>
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6.  
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11. <title>成功页面</title>
  12. </head>
  13. <body>
  14. 欢迎您!${info.username }
  15. </body>
  16. </html>

我们来看一下假如用户名和密码都不输入时的效果

我们来看一下假如用户名和密码都输入时的效果

我们来看一下假如用户名和密码还有确认密码都输入时的效果,并且密码和确认密码都相同时

那么,它会进入到success.jsp页面


 2.使用validate()实现数据校验

 继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Action类中重写validate()方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出

步骤1:创建ValidateAction类(UserInfo同样为UserInfo实体类)

  1. public class ValidateAction extends ActionSupport{
  2.  
  3. private UserInfo info;
  4. //确认密码
  5. private String okpwd;
  6.  
  7. @Override
  8. public String execute() throws Exception{
  9. return SUCCESS;
  10. }
  11.  
  12. //实现数据校验
  13. @Override
  14. public void validate() {
  15. if(info.getUsername().length()==0){
  16. addFieldError("username", "用户名不能为空");
  17. }
  18.  
  19. if(info.getPassword().length()==0){
  20. addFieldError("pwd", "密码不能为空");
  21. }
  22.  
  23. if(!info.getPassword().equals(okpwd)){
  24. addFieldError("pwd", "两次密码必须一致");
  25. }
  26. }
  27.  
  28. public UserInfo getInfo() {
  29. return info;
  30. }
  31. public void setInfo(UserInfo info) {
  32. this.info = info;
  33. }
  34. public String getOkpwd() {
  35. return okpwd;
  36. }
  37. public void setOkpwd(String okpwd) {
  38. this.okpwd = okpwd;
  39. }
  40. }

步骤2:在struts.xml文件中再配置一个action

  1.     <!-- 测试validate方法 -->
  2. <action name="Validate" class="cn.happy.action.ValidateAction">
  3. <result name="success">success.jsp</result>
  4. <result name="input">regist.jsp</result>
  5. </action>

步骤三和上面第一种方法一样,同样是两个jsp页面,只是把<s:form action="execute" method="post">的execute改为validate就可以了。

我们来看一下假如用户名和密码都不输入时的效果

我们来看一下假如用户名和密码都输入时的效果

我们来看一下假如用户名和密码还有确认密码都输入时的效果,并且密码和确认密码都相同时

那么,它会进入到success.jsp页面


3.使用ValidateXxx方法实现数据校验

  在validate()方法中对数据验证是可以工作的,如果在字段非常多的情况下,而且每个字段又有很复杂的验证,那么我们的validate方法中的代码会越来越多。  针对特定的方法输入的数据的验证我们把他放到validateXxx方法中,Xxx是方法名的首字母大写形式

步骤1:在Web项目的cn.happy.action下创建一个ValidateXxxAction(UserInfo为用户实体,其中有username和password属性,并且封装)    

标注黄颜色背景处的代码需要注意一下

  1.  

public class ValidateXxxAction extends ActionSupport{
  private UserInfo info;
  //确认密码
  private String okpwd;

  public void validateRegist(){
    if(info.getUsername().length()<6){
      addFieldError("username", "用户名长度不能小于6位");
  }
  }
  
  public String regist(){
    return SUCCESS;
  }

  @Override
  public String execute() throws Exception{
    return SUCCESS;
  }

  //实现数据校验
  @Override
  public void validate() {
    if(info.getUsername().length()==0){
      addFieldError("username", "用户名不能为空");
  }

    if(info.getPassword().length()==0){
      addFieldError("pwd", "密码不能为空");
  }

    if(!info.getPassword().equals(okpwd)){
      addFieldError("pwd", "两次密码必须一致");
  }
}

  public UserInfo getInfo() {
    return info;
  }
  public void setInfo(UserInfo info) {
    this.info = info;
  }
  public String getOkpwd() {
    return okpwd;
  }
  public void setOkpwd(String okpwd) {
    this.okpwd = okpwd;
  }
  }

步骤2:创建struts.xml文件,引用ValidateXxxAction类(这里加多了一个method属性,用来指定实现的方法)

  1. <struts>
  2. <!-- 修改文件 tomact不用重启 -->
  3. <constant name="struts.devMode" value="true" />
  4.  
  5. <package name="default" namespace="/" extends="struts-default">
  6. <!-- 测试ValidateXxx方法 -->
  7. <action name="ValidateXxx" class="cn.happy.action.ValidateXxxAction" method="regist">
  8. <result name="success">success.jsp</result>
  9. <result name="input">regist.jsp</result>
  10. </action>
  11. </struts>

步骤3.准备前段注册页面regist.jsp和成功页面success.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <%@ taglib uri="/struts-tags" prefix="s"%>
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11. <title>注册页面</title>
  12. </head>
  13. <body>
  14. <h2>用户注册</h2>
  15. <!-- 取出所有错误信息 -->
  16. <s:fielderror></s:fielderror>
  17. <s:form action="ValidateXxx" method="post">
  18. <s:textfield name="info.username" label="用户名"></s:textfield>
  19. <br/>
  20. <s:textfield name="info.password" label="密码"></s:textfield>
  21. <br/>
  22. <s:textfield name="okpwd" label="确认密码"></s:textfield>
  23. <br/>
  24. <s:submit value="注册"></s:submit>
  25. </s:form>
  26. </body>
  27. </html>
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6.  
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11. <title>成功页面</title>
  12. </head>
  13. <body>
  14. 欢迎您!${info.username }
  15. </body>
  16. </html>

我们来看一下假如用户名和密码都不输入时的效果

我们来看一下假如用户名输入小于6位的效果

我们来看一下假如用户名和密码都输入时的效果

我们来看一下假如用户名和密码还有确认密码都输入时的效果,并且密码和确认密码都相同时

那么,它会进入到success.jsp页面


4、用struts2的验证框架实现数据校验(这里将不再Action中进行数据校验,而是在cn.happy.action下创建一个ActionName-validation.xml的文件,在这个文件中进行数据校验

① 为什么要用验证框架:

当验证规则比较复杂时,Action类的代码将变得很繁琐,假如我们要对电话号码的格式进行验证,是非常麻烦的

②验证框架的优点:

Struts2中内置了一个验证框架,将常用的验证规则进行了编码实现,使用验证框架时,用户无需再进行编码,只要在外部配置文件中指定某个字段需要进行的验证类型,并提供出错误信息即可,从而大大减轻了开发者的负担,提高开发效率

③命名规范:

1、文件的命名规则:

  ActionName-validation.xml,ActionName为需要校验的Action类名,如:UserAction-validation.xml

 2、文件存放路径:

 该文件与Action类的class文件位于同一个路径下

3、文件格式:包括如下3个配置元素

   <field>: 为每一个需要校验的字段添加一个验证元素<field>,name属性表示要校验的字段名。

       <field-validator>: 使用该元素来指定校验规则,type属性为校验规则名

       <message>: 使用该元素来指定校验出错时要显示的标签,key属性指向资源文件中的标签名

步骤1:在Web项目的cn.happy.action下创建一个ValidateXxxAction(UserInfo为用户实体,其中有username和password属性,并且封装)

  1. public class UserAction extends ActionSupport{
  2.  
  3. private UserInfo info;
  4. private String okpwd;
  5.  
  6. @Override
  7. public String execute() throws Exception {
  8. return SUCCESS;
  9. }
  10.  
  11. public UserInfo getInfo() {
  12. return info;
  13. }
  14. public void setInfo(UserInfo info) {
  15. this.info = info;
  16. }
  17. public String getOkpwd() {
  18. return okpwd;
  19. }
  20. public void setOkpwd(String okpwd) {
  21. this.okpwd = okpwd;
  22. }
  23. }

步骤2.在cn.happy.action下创建UserAction-validation.xml进行数据校验

  1. <!DOCTYPE validators PUBLIC
  2. "-//Apache Struts//XWork Validator 1.0.3//EN"
  3. "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
  4.  
  5. <validators>
  6.  
  7. <!-- 用户名:不能为空 长度在6-10之间 -->
  8. <field name="info.username">
  9. <field-validator type="requiredstring">
  10. <param name="trim">true</param>
  11. <message>用户名不能为空</message>
  12. </field-validator>
  13.  
  14. <field-validator type="stringlength">
  15. <param name="maxLength">10</param>
  16. <param name="minLength">6</param>
  17. <message>用户名长度必须在${minLength}和${maxLength}之间</message>
  18. </field-validator>
  19.  
  20. </field>
  21.  
  22. <!-- 验证密码-->
  23. <field name="info.password">
  24. <field-validator type="requiredstring">
  25. <message>密码不能为空</message>
  26. </field-validator>
  27. </field>
  28.  
  29. <!-- 确认密码 -->
  30.  
  31. <field name="okpwd">
  32. <field-validator type="fieldexpression">
  33. <param name="expression">info.password==okpwd</param>
  34. <message>密码和确认密码必须一致</message>
  35. </field-validator>
  36. </field>
  37.  
  38. <!-- 验证电话号码 -->
  39.  
  40. <field name="info.phone">
  41. <field-validator type="requiredstring">
  42. <message>电话号码不能为空</message>
  43. </field-validator>
  44. </field>
  45.  
  46. <field name="info.phone">
  47. <field-validator type="regex">
  48. <param name="regex">^(\d{3,4}-){0,1}(\d{7,8})$</param>
  49. <message>电话号码格式不正确</message>
  50. </field-validator>
  51. </field>
  52. </validators>

步骤3.创建struts.xml

  1. <!DOCTYPE struts PUBLIC
  2. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  3. "http://struts.apache.org/dtds/struts-2.3.dtd">
  4. <struts>
  5. <!-- 修改文件 tomact不用重启 -->
  6. <constant name="struts.devMode" value="true" />
  7. <package name="default" namespace="/" extends="struts-default">
  8. <action name="regist" class="cn.happy.action.UserAction">
  9. <result name="success">success.jsp</result>
  10. <result name="input">regist.jsp</result>
  11. </action>
  12. </package>
  13. </struts>

步骤4.准备前段注册页面regist.jsp和成功页面success.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <%@ taglib uri="/struts-tags" prefix="s"%>
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11.  
  12. <title>注册页面</title>
  13.  
  14. </head>
  15.  
  16. <body>
  17. <h2>用户注册</h2>
  18.  
  19. <s:form action="regist" method="post">
  20. <s:textfield name="info.username" label="用户名"></s:textfield>
  21. <br/>
  22.  
  23. <s:textfield name="info.phone" label="电话号码"></s:textfield>
  24. <br/>
  25.  
  26. <s:textfield name="info.password" label="密码"></s:textfield>
  27. <br/>
  28.  
  29. <s:textfield name="okpwd" label="确认密码"></s:textfield>
  30. <br/>
  31.  
  32. <s:submit value="注册"></s:submit>
  33.  
  34. </s:form>
  35.  
  36. </body>
  37. </html>
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6.  
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11.  
  12. <title>成功页面</title>
  13.  
  14. </head>
  15.  
  16. <body>
  17. 欢迎您!${info.username }
  18. </body>
  19. </html>

我们来看一下假如用户名和密码都不输入时的效果

我们来看一下假如用户名输入小于6位的效果

我们来看一下假如用户名和密码都输入时的效果

我们来看一下假如用户名和密码还有确认密码都输入时的效果,并且密码和确认密码都相同时

那么,它会进入到success.jsp页面


Struts2的几种数据校验方式就演示到这里了,希望对前来阅读的读者有帮助!

使用Struts2实现数据校验的更多相关文章

  1. (转)struts2:数据校验,通过XWork校验框架实现(validation.xml)

    转载自:http://www.cnblogs.com/nayitian/p/3475661.html struts2:数据校验,通过XWork校验框架实现(validation.xml)   根据输入 ...

  2. struts2:数据校验,通过XWork校验框架实现(validation.xml)

    根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种.服务器端验证目前有两种方式: 第一种: 参考:struts2:数据校验,通过Action中的validate()方法实现校 ...

  3. struts2:数据校验,通过Action中的validate()方法实现校验,图解

    根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种.服务器端验证目前有两种方式: 第一种 Struts2中提供了一个com.opensymphony.xwork2.Valid ...

  4. struts2:数据校验,通过Action中的validate()方法实现校验(续:多业务方法时的不同验证处理)

    前文:struts2:数据校验,通过Action中的validate()方法实现校验,图解 如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑可能需要不同的校验规则,在这种情况下,就需要通 ...

  5. Struts2(五)数据校验

    一.概述 在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验. 下面通过两种方式来阐述Stru ...

  6. struts2之数据校验

    概述 在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验. 下面通过四种方式来阐述Struts ...

  7. Struts2学习笔记(九)——数据校验

    Struts2的数据校验属于服务器端校验,Struts2 支持校验方式 : 手动校验(代码校验) :在服务器端通过编写java代码,完成数据校验 自动校验(配置校验) :XML配置校验(主流) 和 注 ...

  8. Struts2中validate数据校验的两种常用方法

    本文主要介绍Struts2中validate数据校验的两种方法及Struts2常用校验器.  1.Action中的validate()方法 Struts2提供了一个Validateable接口,这个接 ...

  9. Struts2学习第三天——保存登陆信息及数据校验

    在JSP中服务器端保存数据的作用域通常有request.session.application,它们对应的Servlet API分别是HttpServletRquerst.HttpSession.Se ...

随机推荐

  1. js中XMLHttpRequest对象实现GET、POST异步传输

    js中XMLHttpRequest对象实现GET.POST异步传输 /* * 统一XHR接口 */ function createXHR() { // IE7+,Firefox, Opera, Chr ...

  2. SQL性能优化常见措施(Lock wait timeout exceeded)

    SQL性能优化常见措施 目 录 1.mysql中explain命令使用 2.mysql中mysqldumpslow的使用 3.mysql中修改my.ini配置文件记录日志 4.mysql中如何加索引 ...

  3. 转:Java Web应用中调优线程池的重要性

    不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文主要介绍Java线程池的使用和如何正确的配置线程 ...

  4. iOS多线程简介

    1.进程 什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开迅雷.Xcode,系统就会分别启动2个进程 2.线程 什么是 ...

  5. IOS开发基础知识--碎片30

    1:ios 相册操作 ALAssetsLibrary 知识点 a ALAssetsLibrary 实例为我们提供了获取相册(照片app)中的图片和视频的功能.在ios8 photos framewor ...

  6. Android编码规范01

    目标: 掌握Java & Android命名规范 在研究Android源代码的基础上改进命名规范 考核内容 说出四种常用的命名法 比较java和C#的命名规范的不同点 总结: 读不同程序员写的 ...

  7. 如何设置TextView控件的背景透明度和字体透明度

    如何设置TextView控件的背景透明度和字体透明度 设计师给的标注都是类似这样的: 字号:26 颜色:#000000 透明度:80% 其实,程序上只要需要一个色值就OK了,那么这个色值我如何计算呢? ...

  8. setOnLongClickListener中return值

    今天在做一个按钮的长按事件,长按的时候弹出一个Dialog弹出框,点击则是进入到下一个界面. 在我调试的时候,发现长按确实弹出了一个Dialog,但是同事他还跳转到下一个界面了. 这么说,就是在我长按 ...

  9. 基于Server-Sent Event的简单在线聊天室

    Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览知乎时 ...

  10. 第一课 ionic 日志输出

    写程序的首要问题就是要打印日志,因为只有将日志输出才能真正了解程序的运行状态. 日志输出有两种方式 1.console输出 console.log("测试一下") console. ...