2008-12-12 3 views
5

J'utilise Spring, mais cette question s'applique à tous les types de contrôleurs JSP.Dans Spring/JSP, où le formatage doit-il être effectué?

La page JSP fait référence à des données (à l'aide de balises) renseignées par le contrôleur correspondant. Ma question est, où est l'endroit approprié pour effectuer le formatage, dans JSP ou le contrôleur?

Jusqu'ici, j'ai préparé les données en les formatant dans mon contrôleur.

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

Le fichier JSP ressemblerait à quelque chose comme:

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

Je sais que JSP a quelques dispositions pour la mise en forme,

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

Mais cela ne fonctionne qu'avec Java de java.util.Format. Que faire si j'ai besoin de valeurs plus complexes ou calculées? Dans un tel cas, mettre le code dans la JSP serait lourd (et moche).

Je suis curieux de savoir si cela suit l'esprit Spring/JSP/MVC. En d'autres termes, le contrôleur fait-il partie de la vue? Où est l'endroit préféré pour effectuer le formatage lié à la vue? Mon contrôleur doit-il simplement renvoyer l'objet (personne) au lieu d'une carte de valeurs formatées?

Répondre

5

JSPs n'ont généralement pas beaucoup (ou tout?) Le code en eux, afin que vos options seraient

  • contrôleur
  • bibliothèques de balises

je dirais qu'une bibliothèque de balises serait probablement ce que vous voulez pour la plupart des cas, parce que généralement la vue est le code qui se soucie de choses comme le formatage.

Si les bibliothèques de balises standard ne vous y parviennent pas, elles ne sont pas difficiles à créer, vous pouvez donc créer la vôtre.

1

Je fais généralement le formatage, etc. dans le bean ou une vue "helper". Cela présente plusieurs avantages dont les suivants:

  1. plus facile à tester
  2. flexibilité pour changer vos technologies de vue sans se soucier de portage ou la réécriture de ce que vous avez fait dans tablibs personnalisés.
  3. Nettoyer et gérer plus facilement le contrôleur et afficher le code.
0

La façon dont je le ferais est -

une instance de la classe personne serait le seul objet dans le modèle de la ModelAndView

Je propose la « logique de présentation » dans la personne classe lui-même. Par exemple,

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

Je pense que globalement cette approche: 1 - Renforce votre modèle de domaine. 2 - réduit la duplication de code (que se passe-t-il si vous souhaitez afficher l'emplacement dans une autre page JSP?Avec votre approche, vous auriez beaucoup de code dupliqué)

+1

Mais cela violerait le fait de garder la vue séparée du modèle. –

+0

C'est discutable. Vous obtenez une représentation sous forme de chaîne d'une propriété qui peut être utilisée n'importe où. Et surtout, vous obtenez moins de code, et c'est dans un endroit centralisé qui a du sens. – bpapa

+0

Je dirais qu'une véritable "violation" serait si getLocation renvoyait une chaîne qui contenait des balises HTML ou quelque chose. – bpapa

1

Je préfère envisager de formater une partie de la couche d'affichage, ce qui est fait dans la JSP. J'ai utilisé Velocity plus récemment, mais la même idée avec JSP: le contrôleur retourne un modèle de données, et la vue est responsable du rendu de ces données dans une représentation visible. Beaucoup de bibliothèques de balises JSP disponibles pour les besoins courants.

Vous indiquez des valeurs complexes ou calculées. Ceux-ci ressemblent à des éléments du modèle de données de résultats, ils devraient donc être faits dans le contrôleur, même s'ils peuvent en principe être déterminés par d'autres données, telles que sum, max et d'autres valeurs agrégées. En formatant dans la vue je veux dire des choses de base comme les formats de date et de nombre, la division de ligne, l'alignement. Bien sûr, la ligne exacte entre les données et la représentation formatée dépend de l'application, mais je pense que vous avez l'idée.