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/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>

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

时间: 2024-10-16 17:50:10

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

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

近期在做项目中的个人中心的一些事情,用户头像上传,下载,本地缓存,二级缓存,压缩,这些都要做,麻雀虽小五脏俱全啊,也是写的浑浑噩噩的, 当我们在上传用户头像的时候,向服务端发送上传头像请求之前,一般都会做一次验证,向服务端获取token验证信息,来确保非法上传,如果不做这个那么会有非法用户上传非法图像,使你的服务器 带来未知的灾难. 而验证的逻辑很好写,并没有什么难度,比如: Server.SendMessage("获取token"); Client.Receive(string to

LigerUI中通过加载服务端数据进行表格的分页显示

前言:我的这一篇文章是紧接着上一篇关于LigerUI的文章(http://www.zifangsky.cn/379.html)写的,因此在这里我就省略了相关的环境搭建,直接进入正题 一 介绍 在LigerUI中显示表格是用的ligerGrid,同时我们可以通过配置url参数就可以加载远程数据并显示成表格形式.不仅如此,ligerGrid还可以进行数据的排序和分页显示: (1)排序:需要用到"sortname"和"sortorder"这两个参数,分别表示按哪个字段排序

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

Android BLE与终端通信(三)--client与服务端通信过程以及实现数据通信 前面的终究仅仅是小知识点.上不了台面,也仅仅能算是起到一个科普的作用.而同步到实际的开发上去,今天就来延续前两篇实现蓝牙主从关系的client和服务端了.本文相关链接须要去google的API上查看,须要FQ的 Bluetooth Low Energy:http://developer.android.com/guide/topics/connectivity/bluetooth-le.html 可是我们依旧

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

高并发经常会发生在有大活跃用户量来访问网站的某个点,例如用户高聚集的业务场景中,如:抢购,促销等.为了让用户流畅的访问网站,来根据自己的业务设计适合系统的处理方案. //对于APP网站首页数据,通常是有APP请求服务端数据在本机进行绘制.APP越少的请求服务端的,就会减少服务器压力:资源和带宽. 1.服务端给APP下发的数据越少,减少无用字段的下发.就是APP需要什么,服务端下发什么. 2.APP每次请求服务端数据,服务端下发最新数据和数据版本号,APP可以缓存到本地,每次接口请求数据的时候,上

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

主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: URL url = new URL(http://10.0.2.2/index.php); openConnection()方法返回一个对指定url的资源的连接.返回类型是URLConnection,但是,由于这里我们一般用的是http协议,所以返回的实际是HttpURLConnection对象,故一

python的flex服务端数据接口开发

python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted有很好的异步机制. 下面的我写的一个简单的验证用户的python服务端: ______________________________DBServer.py # Copyright (c) 2009-2010 The Newjh Project."""@author: Roy@s

MVC系列学习(十二)-服务端的验证

在前一讲,提到过,客户端的东西永远可以造假,所以我们还要在服务端进行验证 1.视图与Model中的代码如下 2.一张图,来记忆,服务器端验证,为我们做了什么,原理发现多了一步 2.1情况一:客户端直接就不满足条件,那么就没有机会进行服务器端验证了 2.2情况二:客户端通过了浏览器端的验证,那么就要进行服务器端验证了

google支付服务端订单验证PHP代码

之前有转发一则关于google支付服务端验证的文章,今天把之前研究出得服务端订单支付验证代码(PHP版本)贴出来大家分享 在进行服务端交易验证之前,需要到google api consle后台https://console.developers.google.com开通google play developer api并获取请求api证书priket.p12文件: 交易状态API官方文档:https://developers.google.com/android-publisher/api-re

flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识

flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识 flask中的CBV写法 后端代码 # 导入views from flask import Flask, render_template, views, request app = Flask(__name__) # CBV写法 class Login(views.MethodView):       # 定义一个类,不用装饰器,继承了Method