struts2为我们提供了一个很好的数据验证框架–validate,该框架可以很方便的实现服务端的数据验证。

 ActionSupport类提供了一个validate()方法,当我们需要在某一个action中进行数据验证时,可以重写这个方法。数据验证往往是在客户端向服务端提交表单信息时进行的,比如execute方法负责处理表单信息并返回相应的结果,在此之前,validate会先对提交的表单信息进行验证:

->验证通过:会执行execute的相应操作。

->验证失败:

–>定义了失败后的return结果:比如error,会在struts.xml中找到error对应的页面予以显示,并将错误信息按你写的方式展示。

–>未定义return结果,默认返回INPUT,你需要在struts.xml中定义input对应的页面,否则会报错。

 需要注意的是,validate会对所有方法都进行数据验证,为了针对某一个方法进行数据验证,可以定义一个方法,方法名为validate+需要验证的方法(首字母大写),比如validateExecute会验证提交给execute的表单数据,validateLogin会验证提交给login方法的表单数据。个人认为尽量不要重写validate方法,而是全部使用validate+方法名的方式来编程。

如果表单中的某个字段不合法,我们可以返回给客户端,这是要使用addFieldError(“字段name”,”错误信息”)方法来实现。

–> this.addFieldError(“name”,”昵称长度不得小于5”);

会将错误信息显示到name对应的文本框的上方

–> this.addFieldError(“”,”昵称长度不得小于5”);

不会显示错误信息,但是如果在页面上加入会显示在该标签的位置,小编测试发现如果把标签写在表单内部,错误信息将显示在整个表单的上方。

–>如果有多条信息

this.addFieldError(“name”,”昵称长度不得小于5”);

this.addFieldError(“password”,”密码长度不得小于12”);

或者

this.addFieldError(“”,”昵称长度不得小于5”);

this.addFieldError(“”,”密码长度不得小于12”);

也会全部显示的

下面是一个例子:

1.项目文件如下:



2.web.xml

<?xml version="1.0" encoding= "UTF-8"?>
<web-app version= "3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" >
< display-name></display-name > <!-- 配置过滤器类 -->
< filter>
<filter-name >struts2 </filter-name >
<!-- 从struts-2.1.3以后,org.apache.struts2.dispatcher.FileDispatcher值被标注为过时,现在是如下写法 -->
<filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class >
</filter >
<!-- 过滤器用来初始化struts2并处理所有web请求 -->
<filter-mapping >
<filter-name >struts2 </filter-name >
<url-pattern >/* </url-pattern >
</filter-mapping > < welcome-file-list>
<welcome-file >index.jsp </welcome-file >
</ welcome-file-list>
</web-app>

3.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>
<!-- struts基本配置内容 -->
<!--
package-name:用于区别不同的package;必须是唯一的、可用的变量名;用于其它package来继承;
package- namespace:用于减少重复代码(和struts1比较);是调用action时输入路径的组成部分;
package-extends:用于继承其它package以使用里面的过滤器等东东;
-->
<package name ="struts" namespace="" extends= "struts-default">
<!--
action-name:用于在一个package里区别不同的action;必须是唯一的、可用的变量名;是调用action时输入路径的组成部分;
action-class:action所在的路径(包名+类名);
action-method:action所调用的方法名; 默认执行execute,所以execute可以不写
-->
<action name ="login" class="action.LoginAction" method= "execute">
<result name ="success">/welcome.jsp</ result>
<result name ="index">/login.jsp</ result>
<result name ="input">/login.jsp</ result>
</action >
<action name ="index" class="action.LoginAction" method= "index">
<result name ="index">/login.jsp</ result>
</action >
</package > </struts>

4.UserBean.java

package bean;

public class UserBean {
//封装表单项,即表单中有的字段,且要相对应
private String name;
private String password;
//封装非表单项,即表单中没有该属性,此处info用来存放服务器返回给页面的信息
private String info; public String getName() {
return name;
}
public void setName(String name) {
this. name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this. password = password;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this. info = info;
} }

5.LoginAction.java

package action;

import bean.UserBean;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* Action 用来处理业务逻辑,根据分层的思想,实体对象的属性不宜放在Action中,所以将其封装为实体bean。
*
* 而要在action中使用该bean,就要使用ModelDriver(模型驱动),使用ModelDriver要继承ModelDriven类。
*
*
*/
public class LoginAction extends ActionSupport implements ModelDriven<UserBean>{ private UserBean model; @Override
public UserBean getModel() {
if(model == null){
model = new UserBean();
}
return model;
} public String index(){
return "index";
} public String execute(){
//会自动取出页面表单中的值
if("sa".equals(this.getModel().getName().trim())&&"aaaaaa".equals(this.getModel().getPassword().trim())){
this.getModel().setInfo("登陆成功");
return SUCCESS;
}else{
this.getModel().setInfo("登陆失败");
return "index"; }
} /**
* 在执行方法时,验证数据的合法性,方法名是validate+方法名(首字母大写)
* 直接写validate会对所有方法都验证
*/
public void validateExecute(){
if(this.getModel().getPassword().trim().length() == 0){
//返回错误信息
//*注意 : 如果验证有错且没有指定return字符串的话,默认返回的是INPUT //第一个参数可以为页面表单字段,比如model.password 这时会显示在文本框上部
//第一个参数如果为空 可在页面上通过<s:fielderror />标签来显示
this.addFieldError("", "密码不能为空");
this.addFieldError("", "密码不能为空");
}
} }

6.login.jsp

<%@ page language ="java" import="java.util.*" pageEncoding= "UTF-8"%>
<%@ taglib prefix ="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
< head>
<title >登录 </title >
</ head> < body> <!-- 要获取struts2的数据验证后返回的信息,必须使用struts2标签 -->
<s:form action ="login">
<s:textfield label ="登录名" name= "model.name"></s:textfield >
<s:textfield label ="密码" name= "model.password"></s:textfield >
<s:submit value ="登录"></ s:submit>
</s:form >
<!-- 用于显示服务器addFieldError方法返回的全部错误信息 -->
<s:fielderror />
</ body>
</html>

7.welcome.jsp

<%@ page language ="java" import="java.util.*" pageEncoding= "utf-8"%>
<%
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 >info </title > </ head> < body>
<!-- 写法一 从request取 -->
${request.model.name}<br />
${request.model.info}<br />
<!-- 写法二 从值栈取(值栈后边再细究) -->
${model.name}<br />
${model.info}<br />
<!-- 简写 -->
${name}<br />
${info}<br />
</ body>
</html>

版权声明:本文为博主原创文章,未经博主允许不得转载。

struts2(三)---struts2中的服务端数据验证框架validate的更多相关文章

  1. Unity中使用协程进行服务端数据验证手段

    近期在做项目中的个人中心的一些事情,用户头像上传,下载,本地缓存,二级缓存,压缩,这些都要做,麻雀虽小五脏俱全啊,也是写的浑浑噩噩的, 当我们在上传用户头像的时候,向服务端发送上传头像请求之前,一般都 ...

  2. Android BLE与终端通信(三)——客户端与服务端通信过程以及实现数据通信

    Android BLE与终端通信(三)--客户端与服务端通信过程以及实现数据通信 前面的终究只是小知识点,上不了台面,也只能算是起到一个科普的作用,而同步到实际的开发上去,今天就来延续前两篇实现蓝牙主 ...

  3. 教你如何在React及Redux项目中进行服务端渲染

    服务端渲染(SSR: Server Side Rendering)在React项目中有着广泛的应用场景 基于React虚拟DOM的特性,在浏览器端和服务端我们可以实现同构(可以使用同一份代码来实现多端 ...

  4. Android BLE与终端通信(三)——client与服务端通信过程以及实现数据通信

    Android BLE与终端通信(三)--client与服务端通信过程以及实现数据通信 前面的终究仅仅是小知识点.上不了台面,也仅仅能算是起到一个科普的作用.而同步到实际的开发上去,今天就来延续前两篇 ...

  5. 网站的优化----首页优化---app调取服务端数据

    高并发经常会发生在有大活跃用户量来访问网站的某个点,例如用户高聚集的业务场景中,如:抢购,促销等.为了让用户流畅的访问网站,来根据自己的业务设计适合系统的处理方案. //对于APP网站首页数据,通常是 ...

  6. AngularJS中实现服务端分页

    这个教程将介绍在AngularJS应用中的服务端分页处理.在任何涉及到列表或表格数据的应用中都可能会用到分页. 概念 当我们处理异步分页时,每次只从服务器上获取一页数据.也就是说当用户点击第二页,就只 ...

  7. android菜鸟学习笔记24----与服务器端交互(一)使用HttpURLConnection和HttpClient请求服务端数据

    主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: U ...

  8. [SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端

    原文:[SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端 之前开发基于WinForm监控的软件,服务端基于Wcf实现,里面涉及双工模式,在客户端里面,采用心跳包机制保持与服 ...

  9. 为什么express中打开服务端只用listen即可

    为什么express中打开服务端只用listen即可:http.createServer(app).listen()与app.listen()的区别 写法一:        

var app = r ...

随机推荐

  1. 关于通过ruby互联网同步时间的几个思路

    我开始的思路是通过ruby的网络抓包能力,直接从时间同步网页抓取时间.但实际操作中发现很多时间网页都用的是js脚本计算的时间,直接抓成html文件,本地打开后会发现时间显示处都是空白. 比如网上朋友帮 ...

  2. golang实现文字云算法

    golang实现文字云算法 项目链接 https://github.com/bangbaoshi/wordcloud 效果图 测试步骤如下 git clone https://github.com/b ...

  3. htmldom操作添加标签顺序

    <!DOCTYPE html> <html> <body> <div id="div1"> </div> <scr ...

  4. ORACLE数据库部分面试题目

    1. 解释冷备份和热备份的不同点以及各自的优点 解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份.而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库.热备份的优点在于当备份 ...

  5. access登录窗口校验代码一

    Private Sub login_Click()If IsNull(Me.username) ThenMsgBox "请输入用户名!", vbExclamationElseIf ...

  6. 详解URL的组成

    很久很久以来,我对浏览器地址栏的信息了解的甚少,只知道域名(估计不知道是这么叫).唉...真是很汗颜啊!在软件专业都混了两年了,还是个菜鸟.说真的,有的时候觉得计算机这个领域真的真的有太多的东西要学了 ...

  7. 【转】H.264RTP封包原理

    原文地址:H.264RTP封包原理   作者:cnp11 1.  引言  随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡到音频和视频,并越来越强调获取资源的实时性和互动性.但人们又面 ...

  8. Mybatis 系列6

    上篇系列5中 简单看了一下TypeHandler, 本次将结束对于mybatis的配置文件的学习, 本次涉及到剩下没提及到的几个节点的配置:objectFactory.databaseIdProvid ...

  9. RA layer request failed

    新整的Eclipse环境出现这个问题,细化内容是不能connect,后来想起切换Eclipse底层库的事情,然后打开Eclipse的SVN设置.把SVN Client借口由JavaHL改为PureJa ...

  10. Hadoop的Python框架指南

    http://www.oschina.NET/translate/a-guide-to-Python-frameworks-for-Hadoop 最近,我加入了Cloudera,在这之前,我在计算生物 ...