Pregunta

Estoy creando una aplicación web Spring MVC con Tiles/JSP como tecnología de visualización.Anteriormente almacené las rutas a imágenes comunes en la clase Común:

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

Luego usaría esta clase en jsp para obtener la imagen src como

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

Me gustaría deshacerme de los scriptlets en mi código jsp y usar jstl, etc.en cambio.¿Cuál es la mejor manera de almacenar este tipo de información?¿Son paquetes de recursos?¿Cómo has solucionado esto?

¿Fue útil?

Solución

Al final he utilizado la ayuda del tema de la primavera para conseguir lo que quería. En mi código de la vista utilizo la etiqueta <spring:theme code=""/> para obtener la ruta al archivo de imagen:

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

Esta etiqueta se comporta como cualquier etiqueta o <fmt:message> <spring:message>, pero tiene sus propios mensajes "paquetes". Las configuraciones necesarias en mi applicationContext son:

 <!-- 
    ========================================================= 
    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" />    

Todos los temas de mi aplicación se almacenan en /WEB-INF/classes/themes/. Las propiedades del tema por defecto están en /WEB-INF/classes/themes/default.properties Se ve así:

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

Para cambiar el tema (y los iconos) de mi aplicación utilizo un ThemeChangeInterceptor (en applicationContext)

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

Esto permite al usuario cambiar el tema a través de un parámetro o "&theme=themes.default" "&theme=themes.alternative" petición.

Una parte clave de mi configuración es la @contextPath@ en el archivo de propiedades del tema. Esta es sustituido durante el proceso de construcción Ant con la ruta de contexto correcto para el entorno de desarrollo / pruebas / producción. La parte clave de mi build.xml es:

    <!-- 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>

Espero que esto le da un "comienzo corriente" en temas de aplicación web de la primavera. En mi opinión esta configuración hace que sea muy fácil de alterar la apariencia de una aplicación.

Referencias:

Otros consejos

Utilice un grano de configuración en el ámbito de aplicación, por lo que puede escribir algo como

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

No consumo primavera, pero es probable que pueda usar la inyección de dependencias para hacer algo similar a lo que hacemos en JBoss Seam y.

Básicamente, tenemos una clase POJO nombre Configuración cuyas propiedades son parámetros de configuración de la aplicación, cargadas desde una configuración XML (en realidad un MBean JBoss, pero eso es fuera de tema). En este ejemplo, nuestro grano tendría un método getImagePath().

Seam se hará cargo de instanciar una instancia única de la haba de configuración de alcance 'aplicación', de modo que siempre está disponible para utilizar en expresiones, como la de arriba.

¿No sería más sólido utilizar una clase que determinara el tema en función de una base de datos?¿Esto permitiría a los usuarios administrar temas e incluso implementar temas según el tiempo o el agente de usuario?

¿Sería posible hacer esto y usar temas de primavera al mismo tiempo para guardar el tema en la sesión de los usuarios?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top