Struts 2 - Структура валидации

В этой главе мы более подробно рассмотрим структуру проверки Struts. В ядре Struts у нас есть структура проверки, которая помогает приложению запускать правила для выполнения проверки перед выполнением метода действия.

Проверка на стороне клиента обычно выполняется с помощью Javascript. Однако не следует полагаться только на проверку на стороне клиента. Лучшие практики предполагают, что проверку следует внедрить на всех уровнях инфраструктуры вашего приложения. Теперь давайте рассмотрим два способа добавления проверки в наш проект Struts.

Здесь мы рассмотрим пример Employee имя и возраст которого должны быть записаны с помощью простой страницы, и мы проведем эти две проверки, чтобы убедиться, что пользователь всегда вводит имя и возраст, которые должны быть в диапазоне от 28 до 65.

Начнем с главной страницы JSP примера.

Создать главную страницу

Напишем JSP файл главной страницы index.jsp, который будет использоваться для сбора упомянутой выше информации о сотрудниках.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Employee Form</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>

Index.jsp использует тег Struts, который мы еще не рассмотрели, но мы изучим их в главах, посвященных тегам. Но пока предположим, что тег s: textfield печатает поле ввода, а s: submit печатает кнопку отправки. Мы использовали свойство метки для каждого тега, которое создает метку для каждого тега.

Создать представления

Мы будем использовать файл JSP success.jsp, который будет вызываться, если определенное действие вернет SUCCESS.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Success</title>
   </head>
   
   <body>
      Employee Information is captured successfully.
   </body>
</html>

Создать действие

Итак, давайте определим небольшой класс действий Employee, а затем добавьте метод с именем validate() как показано ниже в Employee.javaфайл. Убедитесь, что ваш класс действий расширяетActionSupport class, иначе ваш метод проверки не будет выполнен.

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class Employee extends ActionSupport {
   private String name;
   private int age;
   
   public String execute() {
       return SUCCESS;
   }
   
   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;
   }

   public void validate() {
      if (name == null || name.trim().equals("")) {
         addFieldError("name","The name is required");
      }
      
      if (age < 28 || age > 65) {
         addFieldError("age","Age must be in between 28 and 65");
      }
   }
}

Как показано в приведенном выше примере, метод проверки проверяет, имеет ли поле «Имя» значение или нет. Если значение не указано, мы добавляем ошибку поля для поля «Имя» с настраиваемым сообщением об ошибке. Во-вторых, мы проверяем, находится ли введенное значение для поля «Возраст» от 28 до 65 или нет, если это условие не выполняется, мы добавляем ошибку над проверенным полем.

Файлы конфигурации

Наконец, давайте соберем все вместе, используя 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>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">

      <action name = "empinfo" 
         class = "com.tutorialspoint.struts2.Employee"
         method = "execute">
         <result name = "input">/index.jsp</result>
         <result name = "success">/success.jsp</result>
      </action>

   </package>
</struts>

Ниже приводится содержание web.xml файл -

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee"
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">

   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>

   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Теперь щелкните правой кнопкой мыши имя проекта и нажмите Export > WAR Fileдля создания файла War. Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресуhttp://localhost:8080/HelloWorldStruts2/index.jsp. Это создаст следующий экран -

Теперь не вводите никакой необходимой информации, просто нажмите на Submitкнопка. Вы увидите следующий результат -

Введите необходимую информацию, но введите неправильное поле «От», скажем, имя «тест», возраст 30 и, наконец, нажмите Submitкнопка. Вы увидите следующий результат -

Как работает эта проверка?

Когда пользователь нажимает кнопку отправки, Struts 2 автоматически выполняет метод проверки, и если любой из “if”утверждения, перечисленные внутри метода, истинны, Struts 2 вызовет свой метод addFieldError. Если были добавлены какие-либо ошибки, Struts 2 не перейдет к вызову метода execute. Вернется фреймворк Struts 2input в результате вызова действия.

Следовательно, когда проверка не выполняется и Struts 2 возвращает input, инфраструктура Struts 2 повторно отобразит файл index.jsp. Поскольку мы использовали теги формы Struts 2, Struts 2 автоматически добавит сообщения об ошибках непосредственно над заполненной формой.

Это те сообщения об ошибках, которые мы указали при вызове метода addFieldError. Метод addFieldError принимает два аргумента. Во-первых, этоform имя поля, к которому относится ошибка, а второе - это сообщение об ошибке, отображаемое над этим полем формы.

addFieldError("name","The name is required");

Для обработки возвращаемого значения input нам нужно добавить следующий результат к нашему узлу действия в struts.xml.

<result name = "input">/index.jsp</result>

Проверка на основе XML

Второй метод проверки - это размещение XML-файла рядом с классом действия. Проверка на основе XML в Struts2 предоставляет больше вариантов проверки, таких как проверка электронной почты, проверка целочисленного диапазона, поле проверки формы, проверка выражения, проверка регулярного выражения, требуемая проверка, проверка требуемой строки, проверка длины строки и т. Д.

Файл xml должен быть назван '[action-class]'-validation.xml. Итак, в нашем случае мы создаем файл с именемEmployee-validation.xml со следующим содержанием -

<!DOCTYPE validators PUBLIC 
   "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
   "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>
   <field name = "name">
      <field-validator type = "required">
         <message>
            The name is required.
         </message>
      </field-validator>
   </field>

   <field name = "age">
     <field-validator type = "int">
         <param name = "min">29</param>
         <param name = "max">64</param>
         <message>
            Age must be in between 28 and 65
         </message>
      </field-validator>
   </field>
</validators>

Вышеупомянутый XML-файл в идеале должен храниться в вашем CLASSPATH вместе с файлом класса. Пусть у нас будет класс действий Employee, как показано ниже, безvalidate() метод -

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class Employee extends ActionSupport{
   private String name;
   private int age;
   
   public String execute() {
       return SUCCESS;
   }
   
   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;
   }
}

Остальные настройки останутся такими же, как и в предыдущем примере. Теперь, если вы запустите приложение, оно даст тот же результат, что и в предыдущем примере.

Преимущество наличия XML-файла для хранения конфигурации позволяет отделить проверку от кода приложения. Вы можете попросить разработчика написать код, а бизнес-аналитика - создать XML-файлы для проверки. Еще стоит отметить типы валидаторов, которые доступны по умолчанию.

По умолчанию в Struts есть еще много валидаторов. Общие валидаторы включают валидатор даты, валидатор регулярных выражений и валидатор длины строки. Перейдите по следующей ссылке, чтобы получить более подробную информацию о Struts - валидаторы на основе XML .