struts2(三)---struts2中的服务端数据验证框架validate

2024-06-24 01:18

本文主要是介绍struts2(三)---struts2中的服务端数据验证框架validate,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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/javaeehttp://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;@Overridepublic 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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088784

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

pandas数据过滤

Pandas 数据过滤方法 Pandas 提供了多种方法来过滤数据,可以根据不同的条件进行筛选。以下是一些常见的 Pandas 数据过滤方法,结合实例进行讲解,希望能帮你快速理解。 1. 基于条件筛选行 可以使用布尔索引来根据条件过滤行。 import pandas as pd# 创建示例数据data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dav