2012-04-05 3 views
2

я есть метод проверки и коррекции ошибок с помощью добавленных addFieldError("test", "test print");распорки значения ошибки 2 поля не отображаются

и в JSP используется <s:fielderror />

но ошибки не отображаются в Input.jsp.

Кроме того, мой тип JSP содержание <%@ page contentType="text/html; charset=UTF-8"%>

Мой struts.xml похож

  <action name="test" class="ListInfo"> 
       <result>/input.jsp</result> 
      </action> 

    <action name="Proceed" class="Details"> 
    <interceptor-ref name="defaultStack"/> 
      <interceptor-ref name="execAndWait"> 
       <param name="delay">100</param> 
      </interceptor-ref> 
      <result name="wait">Wait.jsp</result> 
     <result name="success">/Summary.jsp</result> 
     <result name="input" type="chain">test</result> 
     <result name="failure" type="chain">test</result> 
    </action> 
+0

Вы можете показать свою страницу jsp? –

+1

Я не помню, если в течение цепочки по умолчанию сохраняются ошибки действий. Цепочка почти всегда плохая, кстати. –

+0

@DaveNewton: хорошая точка, я полностью пропустил это :) –

ответ

3

Оказывается, что ошибки (поле и действия не поддерживается по всей цепи.

После доказывает это (предполагается, что struts2-conventions-plugin-VERSION):

Действие foo всегда привязывает к панели действий (так что мы LY нужен вид на панели действий)

Действие Foo

package com.quaternion.action; 

import com.opensymphony.xwork2.ActionSupport; 
import org.apache.struts2.convention.annotation.Result; 

/** #1 SOMETHING WILL BE ADDED HERE TO FIX THE ISSUE**/ 

@Result(name="input", type="chain", location="bar") 
public class Foo extends ActionSupport{ 
    private String name; 

    @Override 
    public void validate(){ 
     super.addActionError("Just an action error"); 
     super.addFieldError("name", "Name is all ways wrong... for no good reason."); 
    } 

    public String getName(){ 
     return name; 
    } 

    public void setName(String name){ 
     this.name = name; 
    } 
} 

Действие бар

package com.quaternion.action; 

import com.opensymphony.xwork2.ActionSupport; 

/** #2 SOMETHING WILL BE ADDED HERE TO FIX THE ISSUE**/ 

public class Bar extends ActionSupport{ 
} 

вид для бара: /WEB-INF/content/bar.jsp

<%@taglib prefix="s" uri="/struts-tags"%> 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE html> 
<html> 
    <body> 
     <h1>Action Bar</h1> 
     <s:actionerror/> 
     <s:fielderror name="name"/> 
    </body> 
</html> 

Тестирование выше, мы ничего не видим в ошибках.

Чтобы устранить проблему мы используем магазин перехватчик: http://struts.apache.org/2.0.14/struts2-core/apidocs/org/apache/struts2/interceptor/MessageStoreInterceptor.html

В первом действии (# 1) нам нужно будет добавлять аннотации и импорт, чтобы поддержать их:

import org.apache.struts2.convention.annotation.InterceptorRef; 
import org.apache.struts2.convention.annotation.InterceptorRefs; 

@InterceptorRefs({ 
    @InterceptorRef(value = "store", params = {"operationMode","STORE"}), 
    @InterceptorRef("defaultStack"), 
}) 

В второе действие (№ 2), мы должны будем добавить аннотации и импорт для их поддержки:

import org.apache.struts2.convention.annotation.InterceptorRef; 
import org.apache.struts2.convention.annotation.InterceptorRefs; 

@InterceptorRefs({ 
    @InterceptorRef(value = "store", params = {"operationMode","RETRIEVE"}), 
    @InterceptorRef("defaultStack"), 
}) 

И теперь это важно кс.

+0

HI я изменил мою struts.xml следующим образом ' <имя действия = класс "Тест"= ""> ListInfo <-перехватчик исх имя = "магазин"> <парам имя = "operationMode"> ПОЛУЧИТЬ <-перехватчик исх имя = "defaultStack" /> /input.jsp <действие имя = "Продолжить" класс = "подробности"> \t \t \t <перехватчик-исх имя = «магазин»> МАГАЗИН <перехватчик-исх название = "defaultStack" /> <имя Результат = "Успех">/Summary.jsp <имя Результат = "вход" Тип = "цепь"> Тест \t \t \t ' , но он перенаправляется должным образом, но все еще не показывает ошибок. – saket

+0

в методе валидации 'addFieldError ("Описание", "Ошибка должна быть напечатана");' в JSP '' – saket

+0

спасибо работает .. Я попробовал его с простой пример .. , но он не работает, когда я включаю заголовок .jsp. может предоставить любой намек на то, что может произойти неправильно. – saket

2

Если вы собираетесь использовать цепочку действий в любом случае (что ИМО почти никогда не требуется, почти никогда не бывает хорошей идеей и почти всегда приводит к непреднамеренной связи между действиями), используйте то, что уже предлагает chaining interceptor, и не позволяйте ничего конфигурировать «цепь».

В соответствии с Документами:

  • struts.xwork.chaining.copyErrors - установлен верно для копирования ОШИБКИ Экшн
  • struts.xwork.chaining.copyFieldErrors - установлен верно для копирования полевых ошибок
  • struts.xwork.chaining.copyMessages - установлен верно для копирования действий Сообщения
+0

Я установил struts.xwork.chaining.copyErrors, чтобы быть истинным в моем приложении, а затем всякий раз, когда я добавляю некоторые ошибки через addActionError(), Struts2 будет искать «ввод» вместо результата, возвращаемого методом действия. Есть идеи? – Will

+1

@Will Перехватчик рабочего потока по умолчанию, IIRC, перейдет к результату '' input '', если есть ошибки. Таким образом, это работает по дизайну. (Справедливости ради, я, возможно, не помню правильно.) –

Смежные вопросы