2012-03-19 3 views
2

В struts.xml:В Struts2 я не могу использовать modeldriven с Validate

<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; 
} ... 

затем в СПЯ:

<s:property value="getActionErrors()"/> 

Я ожидаю во входном результате:

<li> blabla </li> 

Я succefully прибыл в user_form.jsp, но actionError не появляется

Я попробовал без «реализует ModelDriven» и работать

Модель приводится Сотрите actionErrors (я должен)

Я хочу использовать validate и modeldriven ¿любую идею?

+0

Определенный тип результата ввода? Вы получаете какое-либо исключение? –

+0

Я определил «вход типа результата», и у меня нет никаких исключений. Я успешно попал в jsp, но ActionErrors, где стерта моделью (я полагаю) – Troncador

+1

Можете ли вы предоставить файл конфигурации struts.xml? –

ответ

2

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

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

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

создать: 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/содержание /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> 

Чтобы проверить:

Добавить /надстройку ввод пользователя как имя действия на ваш контекстный путь. Если вы введете возраст 12 лет, вы получите страницу успеха, если вы введете что-нибудь еще, вы получите сообщение об ошибке. Это было проверено на работу. Возможно, была напечатана опечатка, но главное убрать - есть ли ошибка в вашем приложении, используя обе соглашения или xml, не должно быть никаких проблем с тем, что вы делаете.

0

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

Если вы используете этот способ, вам придется повторять каждую проверку для каждого метода, который вы хотите проверить, пожалуйста, проверьте, как проверить свою модель/бонусную сторону. – imarban

+0

да! Но насколько я нахожу, я не могу использовать апробации валидации (например, @Required), когда я использую validate, пожалуйста, исправьте меня! –

+0

Вы можете использовать аннотацию @VisitorFieldValidator для вашего метода getModel(), используя его. ValidationInterceptor ищет проверки внутри клана вашей модели. На стороне модели вы можете добавить аннотацию «@RequiredStringValidator» (например) или любую другую аннотация, предоставленная ядром Struts. – imarban