Domanda

Sto costruendo una primavera applicazione web MVC con le mattonelle / JSP come tecnologia per la vista. In precedenza ho memorizzato i percorsi per immagini comuni in classe comune:

 public final static String IMG_BREADCRUMBS_NEXT = "/shared/images/famfam/bullet_arrow_right.png";

Poi vorrei utilizzare questa classe in jsp per ottenere l'immagine src come

 <img src="<%= Common.IMG_BREADCRUMBS_NEXT %>"/>

Vorrei sbarazzarsi di scriptlet nel mio codice JSP e utilizzare JSTL ecc invece. Qual è il modo migliore per conservare questo tipo di informazioni? E 'pacchetti di risorse? Come avete risolto questo?

È stato utile?

Soluzione

Alla fine ho usato il supporto di tema di primavera per ottenere quello che volevo. Nel mio codice della vista io uso il tag <spring:theme code=""/> per ottenere il percorso del file immagine:

 <img src="<spring:theme code="theme.images.actions.edit.link"/>" />

Questo tag si comporta come un qualsiasi tag <fmt:message> o <spring:message>, ma ha i suoi propri "bundle di messaggi". Le configurazioni necessarie nella mia applicationContext sono:

 <!-- 
    ========================================================= 
    Themes
    =========================================================
  -->
<bean id="themeResolver" class="org.springframework.web.servlet.theme.SessionThemeResolver">
    <property name="defaultThemeName" value="themes.default"/>
</bean>
<bean id="themeSource" class="org.springframework.ui.context.support.ResourceBundleThemeSource" />    

Tutti i temi della mia applicazione sono memorizzati sotto /WEB-INF/classes/themes/. Le proprietà del tema predefinito sono in /WEB-INF/classes/themes/default.properties Ecco come si presenta:

 ...
 theme.images.actions.show.link=/@contextPath@/shared/images/famfam/zoom.png
 theme.images.actions.delete.link=/@contextPath@/shared/images/famfam/cross.png
 ...

Per cambiare il tema (e icone) della mia app uso un ThemeChangeInterceptor (in applicationContext)

<!--
========================================================= 
Theme resolving
=========================================================
--> 
<bean id="themeChangeInterceptor" class="org.springframework.web.servlet.theme.ThemeChangeInterceptor">
    <property name="paramName" value ="theme" />
</bean>

Questo permette all'utente di cambiare il tema tramite un parametro "&theme=themes.default" o "&theme=themes.alternative" richiesta.

Una parte fondamentale del mio setup è il @contextPath@ nel file delle proprietà a tema. Questo viene sostituito durante il processo di compilazione Ant con il percorso di contesto corretto per l'ambiente di sviluppo / testing / produzione. La parte fondamentale del mio build.xml è:

    <!-- copy all common themes to classes -->
    <copy todir="${build.war}/WEB-INF/classes/themes" overwrite="true" filtering="true">
        <fileset dir="resources/themes" includes="**/*.properties" />
        <filterchain>
           <replacetokens>
                <token key="contextPath" value="${setup.contextPath}"/>
            </replacetokens>
        </filterchain>
    </copy>

Spero che questo ti dà una "rincorsa" sulla Primavera temi web app. A mio parere questa configurazione rende molto facile di modificare il look and feel di un'applicazione.

References:

Altri suggerimenti

Utilizzare un fagiolo di configurazione in ambito di applicazione, in modo da poter scrivere qualcosa di simile

<img src="${configuration.imagePath}/icon.png">

Non faccio uso di Primavera, ma probabilmente si può usare l'iniezione di dipendenza di fare qualcosa di simile a ciò che facciamo in JBoss Seam e.

In sostanza, abbiamo una classe POJO chiamato Configuration le cui proprietà sono parametri di configurazione dell'applicazione, caricati da una configurazione XML (in realtà un JBoss MBean, ma questo è off-topic). In questo esempio, il nostro fagiolo avrebbe un metodo di getImagePath().

Seam avrà cura di istanziare una singola istanza del bean configurazione in ambito 'applicazione', in modo che sia sempre disponibile per l'utilizzo nelle espressioni, come quello di cui sopra.

Non sarebbe più robusto di utilizzare una classe che ha determinato il tema sulla base di un database. Ciò permetterebbe agli utenti di amministrare i temi e anche implementare i temi in base al tempo o l'user-agent?

Sarebbe possibile fare questo e utilizzare i temi della molla, allo stesso tempo, per salvare il tema nella sessione di utenti?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top