2008-12-12 12 views
5

Estoy usando Spring, pero esta pregunta se aplica a todos los diseños de tipo de controlador JSP.En Spring/JSP, ¿dónde debería formatearse?

La página JSP hace referencia a datos (usando etiquetas) que se completan con el controlador correspondiente. Mi pregunta es, ¿dónde está el lugar apropiado para realizar el formateo, en JSP o en el controlador?

Hasta ahora he estado preparando los datos formateándolos en mi controlador.

public class ViewPersonController extends org.springframework.web.servlet.mvc.AbstractController 
{ 
    private static final Format MY_DATE_FORMAT = new SimpleDateFormat(...); 
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) 
    { 
     Person person = get person from backing service layer or database 
     Map properties = new HashMap(); 

     // No formatting required, name is a String 
     properties.put("name", person.getName()); 

     // getBirthDate() returns Date and is formatted by a Format 
     properties.put("birthDate", MY_DATE_FORMAT.format(person.getBirthDate())); 

     // latitude and longitude are separate fields in Person, but in the UI it's one field 
     properties.put("location", person.getLatitude() + ", " + person.getLongitude()); 

     return new ModelAndView("viewPerson", "person", properties); 
    } 
} 

El archivo JSP sería algo como:

Name = <c:out value="${person. name}" /><br> 
Birth Date = <c:out value="${person. birthDate}" /><br> 
Location = <c:out value="${person. location}" /><br> 

Sé que JSP tiene algunas disposiciones para el formato,

<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %> 
<fmt:formatDate type="date" value="${person. birthDate}" /> 

Pero esto sólo funciona con Java de java.util.Format. ¿Qué pasa si necesito valores más complejos o computados? En tal caso, poner el código en el JSP sería engorroso (y feo).

Tengo curiosidad si esto sigue el espíritu Spring/JSP/MVC. En otras palabras, ¿el controlador es parte de la vista? ¿Dónde está el lugar preferido para realizar el formato relacionado con la vista? ¿Mi controlador debería devolver el objeto (Persona) en lugar de un Mapa de valores formateados?

Respuesta

5

JSP normalmente no tienen mucho (o cualquier?) De código en ellos, por lo que sus opciones serían

  • controlador
  • bibliotecas de etiquetas

diría que una biblioteca de etiquetas probablemente sea lo que quieras para la mayoría de los casos, porque típicamente la vista es el código que se preocupa por cosas como el formateo.

Si las bibliotecas de etiquetas estándar no te llevan hasta allí, no son difíciles de crear, por lo que puedes hacer las tuyas propias.

1

Normalmente hago formateo, etc. en el bean o en una vista "helper". Esto tiene varias ventajas incluyendo las siguientes:

  1. fácil poner a prueba
  2. flexibilidad para cambiar sus tecnologías de visión sin preocuparse por portar o reescribir lo que has hecho en tablibs personalizados.
  3. Controlador más limpio y fácil de mantener y código de vista.
0

La forma en que lo haría es -

una instancia de la clase Person sería el único objeto en el modelo de la ModelAndView

Me mueve la "lógica de presentación" en la Persona clase en sí. Por ejemplo,

public class Person { 
    public String getLocation() { 
     return this.latitude.concat(", ").concat(this.longitude); 
    } 
} 

Creo que en general este enfoque: 1 - fortalece el modelo de dominio. 2 - reduce la duplicación de código (¿qué pasaría si quisiera mostrar la ubicación en otro JSP?Con su enfoque, tendría una gran cantidad de código duplicado)

+1

Pero esto violaría mantener la vista separada del modelo. –

+0

Eso es discutible. Obtendrá una representación de cadena de una propiedad que se puede usar en cualquier lugar. Y lo más importante es que obtiene menos código, y está en un lugar centralizado que tiene sentido. – bpapa

+0

Diría que una verdadera "violación" sería si getLocation devolviera una cadena que tuviera etiquetas HTML o algo así. – bpapa

1

Prefiero considerar el formateo de parte de la capa de visualización, así se hace en el JSP. Usé Velocity más recientemente, pero la misma idea con JSP: el controlador devuelve un modelo de datos, y la vista es responsable de representar esos datos en una representación visible. Un montón de bibliotecas de etiquetas JSP para necesidades comunes.

Menciona valores complejos o calculados. Aquellos me parecen elementos del modelo de datos de resultados, por lo que debería hacerse en el controlador, incluso si en principio pueden ser determinados por otros datos, como suma, máximo y otros valores agregados. Al formatear en la vista quiero decir cosas básicas como formatos de fecha y número, división de línea, alineación. Por supuesto, la línea exacta entre los datos y la representación formateada depende de la aplicación, pero creo que entiendes la idea.

Cuestiones relacionadas