2009-04-07 18 views

Respuesta

5

recomendaría implementar esto como una tabla hash en toda la sesión, con claves de cadena mapeo de objetos FlashItem personalizado. El FlashItem simplemente contendrá el objeto o la cadena que se está almacenando más un valor booleano, posiblemente llamado isNew, que debe tener el valor true cuando se inserta un nuevo elemento en la tabla hash.

En cada carga de la página, a continuación, iterar el HashTable, establezca ningún = true artículos isNew a falsa, y elimine los elementos donde isNew ya es falsa. Eso debería darle un trabajo similar a la función de flash de Rails.

0

Si no ha invertido una gran cantidad de trabajo en su aplicación de primavera de Java, puede consultar los carriles de ejecución en jruby. La belleza de ejecutar jRuby on Rails es que puedes mezclar y combinar ruby ​​gems y java libs.

Si ya ha puesto una buena cantidad de trabajo en su aplicación a continuación, esto es más que probable que no es una opción.

+3

Desafortunadamente estoy muy comprometido con la primavera. – wachunga

6

He hecho justamente eso en Spring MVC con una sesión de con alcance bean.

public class FlashImpl implements Flash, Serializable{ 

private static final long serialVersionUID = 1L; 

private static final String ERROR = "error"; 
private static final String WARNING = "warning"; 
private static final String NOTICE = "notice"; 

private String message; 
private String klass; 

public void message(String klass, String message) { 
    this.klass = klass; 
    this.message = message; 
} 

public void notice(String message) { 
    this.message(NOTICE, message); 
} 

public void warning(String message) { 
    this.message(WARNING, message); 
} 

public void error(String message) { 
    this.message(ERROR, message); 
} 

public boolean isEmptyMessage() { 
    return message == null; 
} 

public void clear() { 
    this.message = null; 
    this.klass = null; 
} 

public String getMessage() { 
    String msg = message; 
    this.clear(); 
    return msg; 
} 

public void setMessage(String message) { 
    this.message = message; 
} 

public String getKlass() { 
    return klass; 
} 

public void setKlass(String klass) { 
    this.klass = klass; 
}} 

El truco está en consumir el mensaje una vez que ha sido leído por primera vez. De esta manera puede sobrevivir a una redirección después de la publicación.

Estoy asumiendo que no habrá un solo tipo de mensaje para la petición !. Si no quieres esto, puedes crear un hashmap como ya se sugirió.

Inyerto este bean en mis controladores (en realidad lo inyecto en un controlador base heredado por todos los demás).

En su JSP se tienen que añadir algo de código como este:

<c:if test="${!flash.emptyMessage}" > 
    <div class="${flash.klass}">${fn:escapeXml(flash.message)}</div> 
</c:if> 
2

he utilizado ejemplo Manolo Santos con con Spring MVC de la siguiente manera:

Anotar la clase de Flash con @Component, y agregue una variable booleana para indicar si el mensaje debería vivir para una solicitud más.

 

@Component 
public class Flash { 

    private static final String INFO = "info"; 
    private static final String SUCCESS = "success"; 
    private static final String ERROR = "error"; 
    private static final String WARNING = "warning"; 
    private static final String NOTICE = "notice"; 

    private final Map msgs = new HashMap(); 

    private boolean isKept; // keep msg for one more request (when the controller method redirects to another) 

    private void message(String severity, String message) { 
     msgs.put(message, severity); 
    } 

    public void info(String message) { 
     this.message(INFO, message); 
    } 

    public void success(String message) { 
     this.message(SUCCESS, message); 
    } 

    public void notice(String message) { 
     this.message(NOTICE, message); 
    } 

    public void warning(String message) { 
     this.message(WARNING, message); 
    } 

    public void error(String message) { 
     this.message(ERROR, message); 
    } 

    public boolean isEmptyMessage() { 
     return msgs.isEmpty(); 
    } 

    public void clear() { 
     msgs.clear(); 
     isKept = false; 
    } 

    public Map getMessage() { 
     return msgs; 
    } 

    public boolean isKept() { 
     return isKept; 
    } 

    public void keep() { 
     isKept = true; 
    } 

    public void unKeep() { 
     isKept = false; 
    } 
} 

Utilice un interceptor para agregar el mensaje flash al objeto modelo.

 

public class FlashMessageInterceptor extends HandlerInterceptorAdapter { 

    @Resource 
    Flash flash; 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
     if (!flash.isKept()) { 
      modelAndView.addObject("flash", flash); 
     } 
    } 

    @Override 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
     if (flash.isKept()) { 
      flash.unKeep(); 
     } 
     else { 
      flash.clear(); 
     } 
    } 
} 

En su controlador, si tiene un método que redirecciona a otro método, puede simplemente decir; flush.keep(), para que se muestre el mensaje flash.

 

@Controller 
public class ComputerCampLove { 

    @Resource 
    private Flash flash; 

    @RequestMapping(method = RequestMethod.GET) 
    public String takeMeToAnotherPlace(Model model) { 

     flash.info("Fa-fa-fa!"); 
     flash.keep(); 

     return "redirect:somewhere"; 
    } 
} 
4

Esto ha sido añadido a Spring MVC 3.1.RC1:

3.1.15 Flash Attributes and RedirectAttributes

flash atributos ahora se puede almacenar en un FlashMap y se guarda en la sesión HTTP para sobrevivir a una redirección. Para obtener una descripción general de la compatibilidad general de los atributos de flash en Spring MVC, consulte Section 16.6, “Using flash attributes”.

En los controladores anotados, un método @RequestMapping puede agregar atributos flash al declarar un argumento de método de tipo RedirectAttributes. Este argumento de método ahora también se puede usar para obtener un control preciso sobre los atributos utilizados en un escenario de redirección. Vea Section 16.3.3.10, “Specifying redirect and flash attributes” para más detalles.

(JIRA: SPR-6464)

+0

En serio, pero eso es demasiado tarde. – momomo

+0

¡Excelente! Esto resolvió mis problemas descritos aquí: http://stackoverflow.com/questions/11216550/how-should-i-send-resourcebundle-messages-across-controllers-in-spring-mvc – Tommy

Cuestiones relacionadas