Pergunta

Estou construindo uma aplicação web Spring MVC com Tiles / JSP como a tecnologia de exibição. Antigamente eu armazenados os caminhos para imagens comuns em sala de aula comum:

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

Então eu iria usar essa classe em jsp para obter a imagem src como

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

Eu gostaria de se livrar de scriptlets no meu código jsp e usar JSTL etc. vez. Qual é a melhor maneira de armazenar esse tipo de informação? Trata-se de recursos pacotes? Como você resolveu isso?

Foi útil?

Solução

No final, eu utilizado suporte a temas de Primavera para conseguir o que eu queria. No meu código vista que eu use a tag <spring:theme code=""/> para obter o caminho para arquivo de imagem:

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

Esta tag se comporta como qualquer <fmt:message> ou <spring:message> tag, mas tem suas próprias "pacotes de mensagens". As configurações necessárias em minha applicationContext são:

 <!-- 
    ========================================================= 
    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 os temas do meu aplicativo são armazenados sob /WEB-INF/classes/themes/. As propriedades do tema padrão estão em /WEB-INF/classes/themes/default.properties Parece que este:

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

Para alterar o tema (e ícones) do meu aplicativo eu uso um ThemeChangeInterceptor (em applicationContext)

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

Isso permite que o usuário alterne o tema através de um parâmetro "&theme=themes.default" ou pedido "&theme=themes.alternative".

Uma parte fundamental da minha configuração é a @contextPath@ no arquivo de propriedades do tema. Este é substituído durante o processo de construção Ant com o caminho do contexto correcto para o ambiente de desenvolvimento / teste / produção. A parte fundamental do meu 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>

Espero que isso lhe dá uma "começar a correr" na Primavera temas de aplicativos web. Na minha opinião esta configuração faz com que seja muito fácil para alterar a aparência de um aplicativo.

Referências:

Outras dicas

Use um feijão de configuração no escopo do aplicativo, assim você pode escrever algo como

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

Não uso Spring, mas provavelmente você pode usar injeção de dependência para fazer algo semelhante ao que fazemos no JBoss Seam e.

Basicamente, temos uma classe POJO chamado Configuração cujas propriedades são parâmetros de configuração do aplicativo, carregados a partir de uma configuração XML (na verdade um JBoss MBean, mas isso é off-topic). Neste exemplo, o nosso feijão teria um método getImagePath().

Seam vai cuidar de instanciar uma única instância do bean de configuração no escopo 'aplicação', de modo que está sempre disponível para usar em expressões, como o descrito acima.

Não seria mais robusta para usar uma classe que determinou o tema com base em um banco de dados. Isso permitiria que os usuários temas administrar e até mesmo implementar temas com base no tempo ou o agente de usuário?

Seria possível fazer isso e primavera uso temas, ao mesmo tempo, para salvar o tema na sessão de usuários?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top