2015-04-07 18 views
6

Ho un progetto Spring MVC che utilizza le piastrelle Apache. Ho implementato in modo che i titoli possono essere letti da una fonte messaggio come questo:Supporto di titoli dinamici e tradotti in piastrelle Apache

<tiles-definitions>  
    <definition name="some-definition" extends="public.base"> 
     <put-attribute name="title" value="some-definition.title" cascade="true" /> 
    </definition> 
</tiles-definitions> 

E nel mio file di modello (definito da public.base), faccio la seguente:

<title><spring:message text="" code="${title}" /></title> 

Ora questo grandi opere per titoli con traduzione statica, ma voglio anche supportare titoli dinamici, ad es per la visualizzazione di un nome di società. Ho potuto fare in questo modo:

<tiles-definitions>  
    <definition name="some-definition" extends="public.base"> 
     <put-attribute name="title" expression="${company.name}" /> 
    </definition> 
</tiles-definitions> 

E poi semplicemente uscita il titolo nel mio modello come questo: <c:out value="${title}" />. Tuttavia, il problema è che il mio codice si interrompe perché il valore dell'attributo title non è più una chiave di messaggio. Voglio essere in grado di supportare i seguenti scenari:

  1. Titoli statici, ad es. "Chi siamo"
  2. Titoli puramente dinamici, ad es. "$ {company.name}"
  3. Titoli dinamici con contenuto tradotto, ad es. "Benvenuto in $ {company.name}"

Idealmente, potrei usare il linguaggio delle espressioni all'interno della mia fonte di messaggi, ma non ho potuto farlo funzionare. Ho sperimentato parecchie soluzioni, ma non riesco a trovarne una decente. Se potessi usare il linguaggio delle espressioni all'interno della mia fonte di messaggi, sarebbe facile. Ad esempio, sarebbe possibile fare in qualche modo quanto segue?

some-definition.title = Hello there, ${company.name} 

E nel mio modello:

<spring:message text="" code="some-definition.title" var="test" /> 
<c:out value="${test}" /> 

È possibile che questo non funziona, in quanto emette ${company.name} piuttosto che il contenuto effettivo della variabile. C'è un modo per fare qualcosa come questo lavoro? O ci sono altri modi in cui posso supportare gli scenari che ho elencato sopra?

Ho pensato di creare un tag JSTL personalizzato in cui vorrei analizzare un'espressione di stringa in codice Java semplice (la stringa che è stata tradotta), ma ho capito che probabilmente avrei dovuto specificare esplicitamente l'oggetto radice per la "variabile" sostituzione "per funzionare, as documented here. Quindi non sembra una soluzione così dinamica.

Esiste un modo per eseguire questo compito? Ogni aiuto è molto apprezzato!

+0

Ciao Andy, ho usato Thymeleaf (con Piastrelle) e la tua domanda mi ricorda la prima volta che devo trattare con i messaggi: http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf. html # messaggi –

+0

Grazie per il link, @PatrickLC. Hai ragione che è così che lo fai in genere, e l'ho fatto in passato. Tuttavia, non sono ancora sicuro di come farlo nel mio particolare caso d'uso senza dover passare esplicitamente i parametri durante la traduzione del testo. Potrebbe anche non essere possibile fare ciò che voglio, non sono sicuro. – Andy0708

risposta

0

la localizzazione delle definizioni delle tessere potrebbe aiutare? rif http://tiles.apache.org/framework/tutorial/advanced/l10n.html

altrimenti guarderei in un ViewPreparer che espande i messaggi primaverili per voi.

+1

Le definizioni di tile localizzate aiutano se i miei titoli non contengono contenuti dinamici. Stavo pensando di provare a implementare un ViewPreparer prima, e potrebbe essere la strada da percorrere. Grazie per i vostri suggerimenti! – Andy0708

0

Una definizione di tile può definire un attributo chiamato "controllerClass". Questa classe dovrebbe implementare l'interfaccia org.apache.struts.tiles.Controller e il suo metodo execute() sottoposto a override viene chiamato prima che venga resa la definizione di tile.

Il metodo di esecuzione ha accesso in lettura/scrittura alle coppie nome-valore dell'attributo tile e anche all'oggetto HttpServletRequest.È possibile cercare il proprio attributo e modificare i valori in modo dinamico oppure sostituirlo con un valore semi-statico da un file di proprietà.

<definition name="some-definition" extends="public.base" controllerClass="pkgName.CustomController"> 
     <put-attribute name="title" expression="${company.name}" /> 
    </definition> 

E poi nella classe CustomController, è possibile modificare gli attributi

public class CustomController implements Controller{ 
     public void execute(ComponentContext tileContext, 
      HttpServletRequest request, HttpServletResponse response, 
      ServletContext servletContext) throws ServletException, IOException {  
      String attrName = (String)tileContext.getAttribute("title"); 
      String attrVal = request.getAttribute("pageTitle"); //get a dynamic value or else retrieve from a resource bundle 
      tileContext.putAttribute(attrName,attrVal); 
    } 

    public void perform(ComponentContext tileContext, 
      HttpServletRequest request, HttpServletResponse response, 
      ServletContext servletContext) throws ServletException, IOException { 
     execute(tileContext, request, response, servletContext); 
    } 
} 
0

E 'vietato utilizzare Tiles per questo, juste tuo Primavera-Modello:

In regolatore:

@RequestMapping(value = { "/page1" }, method = RequestMethod.GET) 
public String page1() { 
    model.addAttribute("titre_page", messageSource.getMessage("home.hello", null,null) 
} 

In layout.jsp:

... 
<title>${titre_page}</title> 
... 
<tiles:insertAttribute name="body" /> 
....