English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Struts2Explicação Detalhada do Tutorial de Validação de Entrada de Dados

Primeiro, introdução

1.1O que é a verificação de entrada? Por que precisamos de verificação de entrada?

No artigo anterior, aprendemos sobre a conversão de tipos de dados, mencionamos os dois métodos de processamento de dados de representação e também mencionamos que os dados de entrada do usuário precisam ser convertidos para tipos de dados para obter os dados que queremos. Então, como podemos determinar que os dados convertidos são os dados que queremos? Isso é um pouco complicado. Você pode pensar assim: A idade de um homem adulto é18anos, agora você quer obter18Esses dados, mas, a entrada do usuário32Após a conversão de tipo também está correto, mas os dados não são os que você deseja. Neste caso, o que devemos fazer? Portanto, a verificação de entrada é útil aqui.

A relação entre a conversão de tipo e a verificação de entrada é que a conversão de tipo é o pré-requisito da verificação de entrada. Se a conversão de tipo falhar, não há necessidade de realizar a verificação de entrada. No entanto, muitas vezes, a conversão de tipo e a verificação de entrada são realizadas ao mesmo tempo.

Existem dois tipos de verificação de entrada:

1Verificação no lado do cliente;

2Verificação no lado do servidor. Aqui, vamos explicar principalmente a verificação no lado do servidor (reescrever o método ValidateXxx e a verificação do arquivo de configuração xml)

1.2Reescrever o fluxo de verificação do método ValidateXxx

1O conversor de tipo é responsável por converter os parâmetros de solicitação de string e definir esses valores como atributos da Action

2、Pode ocorrer exceções durante a conversão de tipo, se ocorrerem exceções, as informações de exceção serão automaticamente salvas no ActionContext, o interceptador conversionError é responsável por encapsulá-lo em fieldError

3、Chamar o método ValidateXxx() através de reflexão, onde Xxx é o nome do método de lógica de processamento de solicitação do usuário que será executado

4、Chamar o método Validate da classe Action

5、Se os passos acima não apresentarem fieldError, será chamado o método de processamento de solicitação do usuário do Action, se apresentarem fieldError, o sistema passará para a vista de lógica de entrada especificada.

Segundo, validação de entrada

2.1、Aqui explicamos dois métodos de validação de entrada:

1、Sobrescrever o método Validate ou criar um método ValidateXxx personalizado (onde Xxx é o nome definido por você, o método será executado antes do Validate)

2、Criar um xml para validação

2.2、Sobrescrever o método Validate

Em frameworks MVC, são fornecidas partes de validação de dados padronizadas, Struts2Aqui fornecemos um método Validate, podemos sobrescrever o método Validate para realizar a validação de entrada, mas, ao sobrescrever o método Validate, há dois pontos a saber:1、O método Validate é executado antes do método execute;2、O método Validate realiza a validação das regras para todos os Action, para distinguir um Action específico, podemos usar o método ValidateXxx.

Atenção: Os exemplos a seguir são exemplos de uso conjunto de conversão de tipo local e validação de entrada.

Exemplo simples de validação de registro:

Criar a classe de entidade User:

 User

Criar uma vista: Register.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8>
<title>Registrar usuário</title>
</head>
<body>
  <h2>Validar usando o método validateXXX</h2>
  <form action="register_test">
    Usuário: <input type="text" name="user"><br/>
    Senha: <input type="password" name="user"><br/>
    Senha: <input type="password" name="user"><br/>
    <input type="submit" value="Enviar">
  </form> 
</body>
</html>

Criar a classe RegisterAction herdando de ActionSupport

package com.validatexxx;
import com.opensymphony.xwork2.ActionSupport;
//Sobrescrever o método validate() e o método validateXXX específico para validação
/*
 * Na configuração do struts.xml, definindo o método method como test(), será chamado primeiro o método ValidateTest(),
 * Em seguida, chama-se o método validate
 * Após a chamada do método test
 * */
public class RegisterAction extends ActionSupport {}
  private User user;
  public User getUser() {
    return user;
  }
  public void setUser(User user) {
    this.user = user;
  }
  //2
  @Override 
  public void validate(){   
   System.out.println("Reescrever método Validate");
   if (null == user.getPassword() || "".equals(user.getPassword()) || null == user.getRepassword() || "".equals(user.getRepassword())) { 
       this.addFieldError("repassword", "repassword deve ser igual à senha"); 
      return; 
     } 
   if (!user.getPassword().equals(user.getRepassword())) { 
     //Quando houver dados no FieldError, o servidor nos ajudará automaticamente a saltar para a visão lógica input
     this.addFieldError("repassword", "repassword deve ser igual à senha"); 
     } 
  }
  //1
  public void validateTest(){
    System.out.println("Método de validação personalizado: ValidateTest");
  }
  //3
  public String test(){
    System.out.println("test: método");
    return SUCCESS;
  }
}

Atenção: aqui a propriedade é User, então o nome do parâmetro na sua página JSP deve ser o nome da instância user, além disso, você ainda precisa criar um conversor de tipo que retorne uma classe preenchida com dados

Novo arquivo struts.xml, salve-o no diretório WEB-INF/classes/struts.xml

Atenção: aqui o método deve ser o seu método ValudateXxx() que você definiu, neste exemplo do autor é test. Usar*em seguida, struts2ainda é necessário configurar strict-method-invocation="false", dizem que é devido à versão ser muito alta, sua segurança foi aumentada, então é necessário adicioná-lo para que ele possa ser usado*

Novo classe Usertypeconverter herdando StrutsTypeConverter (criar um conversor de tipo)

package com.validatexxx;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
//Classe de conversão de tipo
public class Usertypeconverter extends StrutsTypeConverter {
  @Override
  public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
    System.out.println("Usertypeconverter:类型转换!");
    User user = new User();
    user.setUsername(arg1[0]);
    user.setPassword(arg1[1]);
    user.setRepassword(arg1[2]);
    return user;
  }
  @Override
  public String convertToString(Map arg0, Object arg1) {
    User u = (User)arg1;
    return u.getUsername()+"!";
  }
}

Atenção: após a criação do conversor de tipo, ainda é necessário criar um RegisterAction-conversion.properties, colocado na mesma pasta

O conteúdo do arquivo é o seguinte:

O que está à frente é o nome do atributo no RegisterAction, e o caminho específico do conversor de tipo atrás dele.

 Novo vista de sucesso: success.jsp

 success.jsp

Novo vista de erro: input.jsp

 input.jsp

O efeito de sucesso da execução do código é o seguinte:

Página Register.jsp 

A página de sucesso saltada com sucesso é: success.jsp

Resultado do teste no console:

Os dados são encaminhados para Usertypeconverter para a conversão de tipo, em seguida, são encaminhados para RegisterAction, executando o método ValidateTest() e Validate, retornando SUCCESS, em seguida, executando a vista result.

Vamos ver a ordem de execução do código que falhou:

Página Register.jsp

Página input.jsp

Efeito de teste no console:

No método Validate, o código do autor é: this.addFieldError(), como já foi mencionado anteriormente, se adicionarmos um erro, o servidor nos ajudará automaticamente a saltar para a interface de erro. Ele retornará input, e input está configurado no struts.xml, retornando para a interface input.jsp.

2.3、新建xml进行输入验证

新建视图界面:Test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8>
<title>使用XML校验</title>
</head>
<body>
  <s:form action="empinfo" method="post">
   <s:textfield name="name" label="Name" size="20" />
   <s:textfield name="age" label="Age" size="20" />
   <s:submit name="submit" label="Submit" align="center" />
  </s:form> 
</body>
</html>

新建Employee类继承ActionSupport

该类有使用重写Validate方法和Xml配置,我们可以选择其中一种进行验证就可以

package com.validatexxx;
import com.opensymphony.xwork2.ActionSupport;
//使用validate()方法验证,这是服务端验证!
public class Employee extends ActionSupport {
  private String name;
  private int age;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  //Segundo, execute este método
  public String execute(){
    System.out.println("execute:"+this.age);
    return SUCCESS;
  }
/*  Use a validação do lado do servidor: rewrite o método validate();
  //Primeiro, execute este método
  //A rewriting do método validate tem falhas: é usado o método validate sempre, causando um grande desperdício de recursos.
  public void validate(){
    System.out.println("validate");
     if (name == null || name.trim().equals(""))
     {
       //Quando dados são adicionados a este método, o servidor retornará input e logo após, será redirecionado para a página input.jsp.
       addFieldError("name","O nome é obrigatório");
     } 
     if (idade < 28 || idade > 65)
     {
       addFieldError("age","A idade deve estar entre 28 e 65");
      }
  }
*/
}

Configure em Struts.xml:

Aqui, success.jsp e input.jsp ainda usam o acima.

Depois precisamos criar o Employee-validation.xml, o caminho deve estar na mesma pasta que o Employee, atenção:-validation.xml é fixo e inalterável

O conteúdo é:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
    "-//Apache Struts//XWork Validator 1.0.3//EN" 
    "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
 <validators>
  <field name="name">
   <field-validator type="required">
     <message>
      O nome é obrigatório.
     </message>
   </field-validator>
  </field>
  <field name="age">
   <field-validator type="int">
     <param name="min">29</param>
     <param name="max">64</param>
     <message>
      A idade deve estar entre 28 e 65
     </message>
   </field-validator>
  </field>
</validators>

Ponto principal: a restrição dtd do arquivo deve existir, caso contrário, será retornado um erro:

ERRO DefaultDispatcherErrorHandler Ocorreu uma exceção durante o processamento da solicitação: [Conexão expirada: conectar - [local desconhecido], null]


A seguir, usaremoshttp://localhost:8080/LearStruts2/ValidateJSP/Test.jspacessar.

Sucesso de teste:

Interface Test.jsp:

success.jsp

Exemplo de falha de teste:

Interface input.jsp:

O exemplo de explicação é correto.

Na verdade, no Struts2Há muitos validadores integrados: validador obrigatório, validador de string obrigatória, validador de inteiro, validador de data, validador de expressão, validador de comprimento de caractere, validador de expressão regular, etc. Se necessário, o autor descreverá um a um.

O que estou apresentando aos amigos é o Struts2Explicação detalhada da validação de entrada de dados, esperando ajudar a todos. Se você tiver alguma dúvida, por favor, deixe um comentário, o editor responderá a todos a tempo. Agradecemos também o apoio ao site Tutorial Yell.

Declaração: o conteúdo deste artigo é extraído da Internet, pertence ao respectivo detentor dos direitos autorais, fornecido pelos usuários da Internet, auto-publicado, o site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidades legais relevantes. Se você encontrar conteúdo suspeito de violar direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Atingido, o site deletará imediatamente o conteúdo suspeito de infringir direitos autorais.)

Você Também Pode Gostar