В Struts2 я не могу использовать modeldriven с проверкой
В Struts.xml:
<action name="User_UserFormSubmit" class="actions.UserManager">
<result name="input" >/jsp/user_form.jsp</result>
<result name="success" type="redirectAction"> success_register</result>
</action>
Мои занятия:
public class UserManager extends ActionSupport implements ModelDriven<User>{
private User user = new User();
@Override
public User getModel() {
return user;
}
public String validate() {
addActionError("blabla");
}
public String execute() {
return SUCCESS;
} ...
затем в JSP:
<s:property value="getActionErrors()"/>
Я ожидаю во входном результате:
<li> blabla </li>
Я успешно прибыл в user_form.jsp, но ошибка actionError не появляется
Я пытался без "реализует ModelDriven", и это работает
Модель, управляемая стереть actionErrors (я полагаю)
Я хочу использовать validate и modeldriven, есть идеи?
2 ответа
Не большой поклонник управляемой модели... но вот пример.
Перед примером обратите внимание, что использование validate() не имеет большого смысла с точки зрения ModelDriven. Причина в том, что Модель следует использовать для нескольких действий, и поэтому валидация должна быть согласованной. Вы не используете модель, управляемую только для того, чтобы сделать имена свойств немного короче (для этого вы используете push-тег struts2). Такую проверку следует выполнять с помощью xml, поскольку модель больше, чем какое-либо одно действие. Каждое действие, которое использует эту модель, использует валидатор Visitor. Этот валидатор просто ищет файл валидации xml для модели. В следующем примере, однако, будет использоваться метод validate() в действии, чтобы сэкономить время.
В следующем примере будет использован плагин struts2-ventionstions-plugin для уменьшения размера примера (добавление его в ваш проект - просто добавление одного jar-файла).
создать: com.quaternion.action.AddUser
package com.quaternion.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class AddUser extends ActionSupport implements ModelDriven<User>{
User user = new User();
@Override
public User getModel() {
return user;
}
@Override
public void validate(){
if (user.age != 12) {
super.addActionError("bla bla bla");
}
}
}
создать: com.quaternion.action.User
package com.quaternion.action;
public class User {
public String name;
public int age;
}
создать: /WEB-INF/content/add-user-input.jsp
<%@taglib prefix="s" uri="/struts-tags"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Form</title>
</head>
<body>
<h1>Form</h1>
<s:actionerror/>
<s:form action="add-user">
<s:textfield name="name"/>
<s:textfield name="age"/>
<s:submit/>
</s:form>
</body>
</html>
создать: /WEB-INF/content/add-user-success.jsp
<%@taglib prefix="s" uri="/struts-tags"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Success</title>
</head>
<body>
<h1>Success</h1>
</body>
</html>
Для проверки:
Добавьте / add-user-input в качестве имени действия в вашем пути контекста. Если вы ввели 12 лет, вы получите страницу успеха, если вы введете что-либо еще, вы получите ошибку действия. Это было проверено на работу. Возможно, была сделана опечатка, но главное, что нужно убрать, - это ошибка в вашем приложении, при использовании обоих соглашений или xml не должно быть проблем с тем, что вы делаете.
Вы также можете проверить с помощью @validations
также у вас есть доступ к объекту, управляемому моделью, в валидаторе.
@Action(value = "save-user")
@Validations(
stringLengthFields = {
@StringLengthFieldValidator(fieldName = "name", trim = true, key = "validate.required.string.length"),
@StringLengthFieldValidator(fieldName = "age", trim = true, key = "validate.required.string.length"),
@StringLengthFieldValidator(fieldName = "address.addLine1", trim = true, key = "validate.required.string.length")
})
public String save() {