2008-12-12 14 views
5

Używam Spring, ale to pytanie dotyczy wszystkich projektów typu kontrolera JSP.W Spring/JSP, gdzie należy przeprowadzić formatowanie?

Strona JSP odwołuje się do danych (przy użyciu znaczników), które są wypełniane przez odpowiedni kontroler. Moje pytanie brzmi, gdzie jest odpowiednie miejsce do formatowania, w JSP lub kontroler?

Do tej pory przygotowywałam dane, formatując je w moim kontrolerze.

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

Plik JSP będzie wyglądać mniej więcej tak:

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

wiem, że JSP ma pewne przepisy dotyczące formatowania

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

Ale to działa tylko z Java java.util.Format. Co jeśli potrzebuję bardziej złożonych lub wyliczonych wartości. W takim przypadku umieszczenie kodu na stronie JSP byłoby uciążliwe (i nieprzyjemne).

Jestem ciekawy, czy jest to zgodne z duchem Spring/JSP/MVC. Innymi słowy, czy kontroler jest częścią widoku? Gdzie jest preferowane miejsce do formatowania związanego z wyświetlaniem? Czy mój kontroler powinien zwrócić obiekt (osobę) zamiast mapy sformatowanych wartości?

Odpowiedz

5

JSP zwykle nie mają wiele (lub jakieś?) Kodu w nich, więc opcje byłoby

  • kontroler
  • biblioteki znaczników

Powiedziałbym, że biblioteka tag prawdopodobnie będzie to, co chcesz w większości przypadków, ponieważ zazwyczaj widok jest kod, który dba o takie rzeczy jak formatowanie.

Jeśli nie są dostępne standardowe biblioteki znaczników, nie są trudne do stworzenia, więc można je samemu rozwinąć.

1

Zwykle formatuję itp. W komponencie bean lub widoku "helper". Ma to kilka zalet w tym następujące:

  1. Łatwiejsze do testowania
  2. elastyczność, aby zmienić widok technologii bez martwienia się o przenoszeniu lub przepisanie co zrobiłeś w niestandardowych tablibs.
  3. Czystsze i łatwiejsze w obsłudze kontroler i przeglądanie kodu.
0

Sposób zrobiłbym to jest -

instancją klasy osoba będzie jedynym obiektem w modelu ModelAndView

Chciałbym przenieść „Logika prezentacji” do osoby klasa sama w sobie. Na przykład,

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

myślę ogólnie tego podejścia: 1 - wzmacnia swój model domeny. 2 - ogranicza powielanie kodu (co jeśli chcesz pokazać lokalizację na innym JSP?Z twoim podejściem miałbyś powielony duży kod)

+1

Ale to naruszyłoby trzymanie widoku oddzielnie od modelu. –

+0

To dyskusyjne. Otrzymujesz ciąg znaków reprezentujący właściwość, którą można użyć w dowolnym miejscu. A co najważniejsze, dostajesz mniej kodu, a to w scentralizowanym miejscu, które ma sens. – bpapa

+0

Powiedziałbym, że prawdziwe "naruszenie" byłoby, gdyby getLocation zwrócił ciąg znaków, który zawierał znaczniki HTML lub coś takiego. – bpapa

1

Wolę rozważać formatowanie części warstwy wyświetlania, a więc zrobić to na stronie JSP. Użyłem ostatnio Velocity, ale ten sam pomysł z JSP: kontroler zwraca model danych, a widok jest odpowiedzialny za renderowanie tych danych do widocznej reprezentacji. Mnóstwo bibliotek znaczników JSP dla wspólnych potrzeb.

Podajesz wartości złożone lub obliczone. Brzmią one jak elementy modelu danych wyników, więc należy to zrobić w kontrolerze, nawet jeśli mogą one w zasadzie zostać określone przez inne dane, takie jak suma, max i inne wartości zagregowane. Przez formatowanie w widoku mam na myśli podstawowe rzeczy, takie jak format daty i liczby, podział linii, wyrównanie. Oczywiście dokładna granica między danymi a sformatowaną reprezentacją zależy od aplikacji, ale myślę, że masz pomysł.