Валидаторы Struts2 с конфигурацией xml не работают

Я новичок в Struts2. Когда я попытался использовать инфраструктуру проверки для проверки входных данных из формы, я столкнулся с проблемой: валидаторы вообще не работают. Я могу получить страницу, которая должна быть возвращена, когда вы проходите проверку, ничего не вводя.

Ниже приведен мой код и пакет, я искал его в StackOverFlow, но не нашел решения, которое решило бы мою проблему.

Структура проекта

Регистрация.java

package validation;
/**
 * Created by xiangang.wei on 2016/10/26.
 */
public class Register {
    private String userName;
    private String password;
    private String rpassword;
    private int age;
    private int phone;
    private String email;

    public String getRpassword() {
        return rpassword;
    }

    public void setRpassword(String rpassword) {
        this.rpassword = rpassword;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setPhone(int phone) {
        this.phone = phone;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getUserName() {

        return userName;
    }

    public String getPassword() {
        return password;
    }

    public int getAge() {
        return age;
    }

    public int getPhone() {
        return phone;
    }

    public String getEmail() {
        return email;
    }

    public String execute(){
        return "success";
    }
}

Регистрация-валидация.xml

<?xml version="1.0" encoding="UTF-8"?>

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


 <validators>
    <validator type="stringlength" >
        <param name="fieldName">userName</param>
        <param name="maxLength">10</param>
        <param name="minLength">1</param>
        <message>The length is wrong!</message>
    </validator>
    <validator type="fieldexpression">
        <param name="fieldName">password</param>
        <param name="expression">![CDATA[password == rpassword]]</param>
        <message>The password is not the same!</message>
    </validator>
    <validator type="int">
        <param name="fieldName">age</param>
        <param name="max">130</param>
        <param name="min">1</param>
        <message>The age must be 1 - 130</message>
    </validator>
    <validator type="email">
        <param name="fieldName">email</param>
        <message> Please enter a valid email address!</message>
    </validator>
</validators>

struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="register" extends="struts-default" namespace="/">
    <action name="register" class="validation.Register">
        <result name="success">/register-view/register-success.jsp</result>
        <result name="input">/index.jsp</result>
    </action>
</package>
</struts>

веб.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">


    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

build.gradle

group 'xiangang.wei'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'war'

sourceCompatibility = 1.8

repositories {
    jcenter()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile 'org.apache.struts:struts2-core:2.5'
}

index.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
  Created by IntelliJ IDEA.
  User: xiangang.wei
  Date: 2016/10/26
  Time: 11:19
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>User Register!</title>
</head>
<body>
<s:form action="register" method="POST">
    <table>
        <tr>
            <td><s:textfield label="Name" name="userName"/></td>
        </tr>
        <tr>
            <td><s:password label="Password" name="password"/></td>
        </tr>
        <tr>
            <td><s:password label="Confirm Password" name="rpassword"/></td>
        </tr>
        <tr>
            <td><s:textfield label="age" name="age"/></td>
        </tr>
        <tr>
            <td><s:textfield label="Phone" name="phone"/></td>
        </tr>
        <tr>
            <td><s:textfield label="Email" name="email"/></td>
        </tr>
        <tr>
            <td>
                <s:submit value="Submit"/>
            </td>
            <td>
                <s:reset value="Reset"/>
            </td>
        </tr>
    </table>
</s:form>
</body>
</html>

регистрация-success.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
  Created by IntelliJ IDEA.
  User: xiangang.wei
  Date: 2016/10/26
  Time: 13:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册成功!</title>
</head>
<body>
<h3>Congratulation!</h3>
<hr/>
<h5>Here is your registering info:</h5>
Name:<s:property value="userName"/>
Password:<s:property value="password"/>
Age:<s:property value="age"/>
E-mail:<s:property value="email"/>
Phone Number:<s:property value="phone"/>
</body>
</html>

person xiangang wei    schedule 26.10.2016    source источник
comment
@Roman C Спасибо за ответ на мой вопрос, я прочитал ваш ответ на другой вопрос, и это хороший ответ, он объясняет, как использовать валидатор. Но я думаю, что это все еще не решает мою проблему. хотя я расширяю класс ActionSupport, как сказала Андреа Лигиос, валидатор все еще мертв! это просто не работает вообще.   -  person xiangang wei    schedule 28.10.2016
comment
Честно говоря, что вы сделали до сих пор, чтобы решить вашу проблему? Вы должны знать, что SO не оказывает помощь и не решает ваши проблемы. Это сайт вопросов и ответов, где люди задают хорошие вопросы и получают хорошие ответы, так что всем нравится читать. Такие вопросы, как ваш, являются исключительно частными, если у вас есть проблемы с программированием или недостаток знаний в определенной области, вы должны изучать это вне SO. SO не может вам помочь, если вы не понимаете тему вопроса.   -  person Roman C    schedule 28.10.2016


Ответы (1)


Проверка выполняется перехватчиком проверки. Из его документов:

Этот перехватчик запускает действие через стандартную структуру проверки, которая, в свою очередь, проверяет действие на соответствие любым правилам проверки (найденным в таких файлах, как ActionClass-validation.xml) и добавляет сообщения об ошибках на уровне полей и действий (при условии, что действие реализует ValidationAware).

Ваше действие не расширяет ActionSupport (который, среди прочего, реализует ValidationAware), и не реализует ValidationAware вручную.

Вы просто не дали указание фреймворку проверить ваши действия.

Золотое правило: всегда делайте так, чтобы ваши действия расширяли ActionSupport.

Еще лучше создать BaseAction, который расширяет ActionSupport, куда вы поместите общую логику и настройки, например. Locale/TimeZone, формат синтаксического анализа даты и т. д., а затем сделайте так, чтобы ваши действия расширяли BaseAction.


РЕДАКТИРОВАТЬ

В последних версиях Struts2 DTD изменился; заменить это

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

с этим

<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
                            "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

как описано в документации.

person Andrea Ligios    schedule 26.10.2016
comment
Это сработало? Пожалуйста, не забудьте принять ответ, если он сработал - person Andrea Ligios; 27.10.2016
comment
Привет, вы правы в том, что я не расширил класс ActionSupport. Итак, я расширяю класс ActionSupport, но, похоже, это не работает! Проверка по-прежнему не работает. - person xiangang wei; 28.10.2016
comment
Я использую Struts 2.5.1, и мне пришлось преобразовать DTD в validators.xml в 1.0 вместо 1.0.3, чтобы он работал! Может быть полезно для тех, кто проверил только одну версию - person Dangerous Hamster; 28.07.2017