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.