Struts2 onblur проверка на стороне сервера AJAX

Как мне реализовать проверку AJAX в struts2, которая позволяет узнать, доступно ли имя пользователя на blur? Это то, что мне удалось до сих пор, но документы не ясны:

JSP:

<%@ page
    language="java"
    contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib
    prefix="s"
    uri="/struts-tags"%>
<%@ taglib
    prefix="sj"
    uri="/struts-jquery-tags"%>

<!DOCTYPE html>
<html>
<head>
<sj:head jqueryui="true" />
<!-- Don't forget these 2 files!! -->
<script
    src="${pageContext.request.contextPath}/struts/utils.js"
    type="text/javascript"></script>
<script
    src="${pageContext.request.contextPath}/struts/css_xhtml/validation.js"
    type="text/javascript"></script>
<script
    type="text/javascript"
    src="js/register.js"></script>
<title>Register</title>
</head>

<s:url
    action="loginLink"
    var="loginHREF" />
<s:url
    action="forgotPasswordLink"
    var="forgotPasswordHREF" />
<s:url
    action="Register"
    var="registerHREF" />
<body>

    <s:form
        theme="css_xhtml"
        action="Register"
        onsubmit="return myValidate()">
        <s:textfield
            name="user.username"
            label="Username"
            id="uname"
            required="true"
            pattern="[a-zA-Z0-9_-]{5,12}"
            title="5-12 Alphanumeric characters required" />
        <s:textfield
            name="user.email"
            label="Email"
            required="true" />
        <s:password
            id="pass1"
            name="user.password"
            label="Password"
            required="true"
            pattern="{5,12}"
            title="5-12 characters" />
        <s:password
            id="pass2"
            label="Confirm Password"
            required="true"
            pattern="{5,12}" />
        <s:textfield
            name="user.firstName"
            label="First Name"
            required="true" />
        <s:textfield
            name="user.lastName"
            label="Last Name" />
        <sj:datepicker
            yearRange='-90:-3'
            changeYear="true"
            name="user.birthDate"
            readonly="true"
            label="Date of Birth" />
        <s:submit value="Register" />
    </s:form>
    <s:a href="%{loginHREF}">Login</s:a>
    <s:a href="%{forgotPasswordHREF}">Forgot Password</s:a>

    <script>
        $("#uname").blur(function() {

            var fieldData = $("#uname").serialize();
            fieldData = fieldData.slice(5);
            //do the POST thingies
            $.ajax({

                type : "POST",
                url : "ValidateUsername",
                cache : false,
                data : fieldData,
                dataType : "json",
                complete : function(request) {
                    alert("In complete");
                    var form = $('form');

                    //clear previous validation errors, if any
                    //StrutsUtils.clearValidationErrors(form);

                    //get errors from response
                    var text = request.responseText;
                    alert(text);
                    var errorsObject = StrutsUtils.getValidationErrors(text);

                    //show errors, if any
                    if (errorsObject.fieldErrors) {
                        StrutsUtils.showValidationErrors(form, errorsObject);
                    }

                }
            });

            return false;
        });
    </script>

</body>
</html>

Действие:

@Action("ValidateUsername")
@Results(value = { @Result(name = "success", type = "json"), @Result(name = "input", type = "json") })
@ParentPackage("default")
@InterceptorRef("jsonValidationWorkflowStack")
public class ValidateUsername extends ActionSupport {

    private String username;

    @Override
    public String execute() {
        return SUCCESS;
    }

    @Override
    public void validate() {
        UserService service = new UserService();
        User isTaken = service.findByUsername(username);
        service.close();
        if (isTaken != null)
            addFieldError("user.username", "That username is taken");
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

}

Документы создают впечатление, что struts2 справится с вами, если вы просто добавите перехватчик json и установите validate="true" в теге sx:submit. В register.js я проверяю, чтобы увидеть, что пароль и пароль подтверждения совпадают. По сути, я бы хотел, чтобы он был проверен еще до того, как нажата кнопка submit. Прямо сейчас при отправке он проверяет его как любую другую нормальную форму.

Изменить: Кроме того, есть ли рабочий метод, кроме использования додзё? Кажется, он блокирует всю мою проверку на стороне клиента, включая обязательные атрибуты, js и т. Д.

Edit2: я бросил плагин dojo, выучил некоторые js и сумел собрать то, что у меня есть сейчас. Теперь осталось только показать ошибку. При предупреждении текста ответа отображается строка json, содержащая только пару значений ключа имени пользователя. Должен ли я добавить другого участника к действию и обработать его для отображения сообщения об ошибке? потому что StrutsUtils JS не работает. addFieldError("user.username", "That username is taken");не изменяет результат json.

В основном, как я могу добавить fielderrors к моему ответу json?

Изменить: я получил мое действие, чтобы добавить мои полевые ошибки в ответ json, изменив аннотации следующим образом:

@Action("ValidateUsername")
@Results(value = {
        @Result(name = "success", type = "json"),
        @Result(name = "input", type = "json", params = { "ignoreHierarchy",
                "false", "includeProperties",
                "actionErrors.*,actionMessages.*,fieldErrors.*" }) })
@ParentPackage("default")
@InterceptorRef("jsonValidationWorkflowStack")

Теперь единственная проблема заключается в: // очистить предыдущие ошибки проверки, если таковые имеются

**//StrutsUtils.clearValidationErrors(form);**

                        //get errors from response
                        var text = request.responseText;
                        alert(text);
                        **var errorsObject = StrutsUtils.getValidationErrors(text);**

                        //show errors, if any
                        if (errorsObject.fieldErrors) {


StrutsUtils.showValidationErrors(form, errorsObject);
                        }

Ни одна из функций StrutsUtils не работает. Когда я раскомментирую clearValidationErrors, он ничего не делает и нарушает остальную часть кода js. errorsObject пусто, и showValidation ничего не делает, хотя при печати моего ответа jon я вижу ошибку поля с сообщением. Как мне заставить StrutsUtils работать?

Кроме того, есть ли лучший способ реализовать мой вариант использования? Я никогда не изучал jquery / ajax, и это мое первое приложение struts2.

1 ответ

Struts доступен на стороне сервера. Вы пытаетесь позвонить

var errorsObject = StrutsUtils.getValidationErrors(text); на стороне клиента.

StrutsUtils является классом и недоступен на стороне клиента /javascript.

Существуют различные способы отправки ошибок.

Пожалуйста, обратитесь к моему ответу в ссылке ниже, чтобы узнать, как обрабатывать ajax-запросы и ответы при использовании struts2.

Как получить ответ Ajax в Struts2

Другие вопросы по тегам