В Struts2 я не могу использовать modeldriven с проверкой - PullRequest
2 голосов
/ 19 марта 2012

В 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 ]

2 голосов
/ 20 марта 2012

Не большой поклонник управляемой моделью ... но вот пример.

Перед примером обратите внимание, что использование validate () не имеет большого смысла с точки зрения ModelDriven.Причина в том, что Модель следует использовать для нескольких действий, и поэтому валидация, вероятно, должна быть последовательной.Вы не используете модель, управляемую только для того, чтобы сделать имена свойств немного короче (для этого вы используете push-тег struts2).Такую проверку следует выполнять с xml, поскольку модель больше, чем какое-либо одно действие.Каждое действие, которое использует эту модель, использует валидатор Visitor.Этот валидатор просто ищет файл валидации xml для модели.В следующем примере, однако, будет использоваться метод validate () в действии, чтобы сэкономить время.

В следующем примере будет использоваться плагин struts2 -ventionstions для уменьшения размера примера (добавление его в проект просто вопросдобавления одной банки).

создать : 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 не должно быть проблем с тем, что вы делаете.

0 голосов
/ 12 декабря 2013

Вы также можете проверить с помощью @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()  {
...