zoukankan      html  css  js  c++  java
  • 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>
    

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

  • 相关阅读:
    JVM类加载器
    Java类加载过程
    进程间8种通信方式详解
    SpringCloud教程(Finchley版本)-00:什么是SpringCloud
    pyinstaller打包web项目
    Type javax.xml.bind.JAXBContext not present
    Cannot execute request on any known server
    websocket原理
    falsk模板jinja2与Vue冲突解决方案
    关于springboot Error resolving template之类问题
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4931736.html
Copyright © 2011-2022 走看看