2010-11-02 11 views
5

Quando aggiorno il fagiolo:Uso degli strumenti di velocità con molla 3.0.3

<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> 
    <property name="cache" value="true"/> 
    <property name="prefix" value=""/> 
    <property name="suffix" value=".vm"/> 
    <property name="toolboxConfigLocation" value="tools.xml" /> 
</bean> 

Con il percorso tools.xml per Strumenti Velocity, ottengo:

Caused by: 
java.lang.ClassNotFoundException: org.apache.velocity.tools.view.ToolboxManager 

Ho cercato di collegare strumenti versione 2 e 1.4, nessuno dei due ha questa struttura del pacchetto. Mi sono perso qualcosa di ovvio? Quale versione di Velocity Tools supporta il componente Spring/Velocity?

risposta

5

Spring ha un supporto Velocity molto obsoleto per impostazione predefinita. Estendo la classe VelocityView da Spring e sostituisco il metodo createVelocityContext in cui inizializzo Strumenti personalmente. Here è come sembra alla fine.

+0

Oh favoloso, cosa potrei chiedere di più, grazie per il riferimento e chiarire tutto per me! –

1

Con 3.0.5 Ho usato una classe simile a quello che ha postato Serg, con l'unica modifica è quello di utilizzare le classi aggiornato che la primavera non ha utilizzato (coda attraverso VelocityToolboxView -> ServletToolboxManager (utilizzato nel createVelocityContext abbiamo ignorato) che è la classe che è deprecato, quindi ho modificato l'initVelocityToolContext in risposta di Serg essere:.

private ToolContext getToolContext() throws IllegalStateException, IOException { 
    if (toolContext == null) { 
    XmlFactoryConfiguration factoryConfiguration = new XmlFactoryConfiguration("Default Tools"); 
    factoryConfiguration.read(getServletContext().getResourceAsStream(getToolboxConfigLocation())); 
    ToolboxFactory factory = factoryConfiguration.createFactory(); 
    factory.configure(factoryConfiguration); 
    toolContext = new ToolContext(); 
    for (String scope : Scope.values()) { 
     toolContext.addToolbox(factory.createToolbox(scope)); 
    } 
    } 
    return toolContext; 
} 

ho dovuto anche cambiare la linea che ha creato il VelocityContext chiamare questo metodo, ovviamente,

mio fagiolo ora sembra del tipo:

<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver" 
     p:cache="false" 
     p:prefix="" 
     p:suffix=".vm" 
     p:layoutUrl="templates/main.vm" 
     p:toolboxConfigLocation="/WEB-INF/velocity/velocity-toolbox.xml" 
     p:viewClass="path.to.overriden.class.VelocityToolsLayoutView" 
/> 
11

Io uso un po 'più semplice. Inoltre, non posso forzare Velocity Tools a funzionare a causa della mancanza di documentazione di configurazione ed esempi. Ho appena ottenere la velocità-generic-tools-2.0.jar e fare un piccolo cambiamento a mio avviso resolver:

<bean id="velocityViewResolver" 
    class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> 
    <property name="order" value="1"/> 
    <property name="prefix" value="/WEB-INF/vm/"/> 
    <property name="suffix" value=".vm"/> 

    <property name="exposeSpringMacroHelpers" value="true"/> 
    <property name="contentType" value="text/html;charset=UTF-8"/> 
    <property name="attributesMap"> 
     <map> 
      <!--Velocity Escape Tool--> 
      <entry key="esc"><bean class="org.apache.velocity.tools.generic.EscapeTool"/></entry> 
     </map> 
    </property>   
</bean> 

Poi, nel modello di velocità è possibile utilizzarlo come al solito $ esc.html ($ htmlCodeVar) . Questa soluzione è molto semplice, senza tonnellate di configurazioni e classi primarie primaverili.

1

Ispirato risposte da Scott e serg, ecco un altro modo per farlo che non richiede XML: http://squirrel.pl/blog/2012/07/13/spring-velocity-tools-no-xml/

public class MyVelocityToolboxView extends VelocityView { 
    @Override 
    protected Context createVelocityContext(Map<String, Object> model, 
      HttpServletRequest request, HttpServletResponse response) { 
     ViewToolContext context = new ViewToolContext(getVelocityEngine(), 
       request, response, getServletContext()); 

     ToolboxFactory factory = new ToolboxFactory(); 
     factory.configure(ConfigurationUtils.getVelocityView()); 

     for (String scope : Scope.values()) { 
      context.addToolbox(factory.createToolbox(scope)); 
     } 

     if (model != null) { 
      for (Map.Entry<String, Object> entry : (Set<Map.Entry<String, Object>>) model 
        .entrySet()) { 
       context.put(entry.getKey(), entry.getValue()); 
      } 
     } 
     return context; 
    } 
} 
1

Ispirato da tutte le risposte precedenti, questa è la mia implementazione di VelocityLayoutView per spring e velocity-tools 2.0, ha apportato qualche miglioramento!

public class VelocityToolsView extends VelocityLayoutView { 

    private static final String TOOL_MANAGER_KEY = ViewToolManager.class.getName(); 

    @Override 
    protected Context createVelocityContext(
      Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) { 
     ServletContext application = getServletContext(); 

     // use a shared instance of ViewToolManager 
     ViewToolManager toolManager = (ViewToolManager)application.getAttribute(TOOL_MANAGER_KEY); 
     if(toolManager == null) { 
      toolManager = createToolManager(getVelocityEngine(), getToolboxConfigLocation(), application); 
      application.setAttribute(TOOL_MANAGER_KEY, toolManager); 
     } 

     ViewToolContext toolContext = toolManager.createContext(request, response); 
     if(model != null) { toolContext.putAll(model); } 

     return toolContext; 
    } 

    private ViewToolManager createToolManager(VelocityEngine velocity, String toolFile, ServletContext application) { 
     ViewToolManager toolManager = new ViewToolManager(application, false, false); 
     toolManager.setVelocityEngine(velocity); 

     // generic & view tools config 
     FactoryConfiguration config = ConfigurationUtils.getVelocityView(); 
     // user defined tools config 
     if(toolFile != null) { 
      FactoryConfiguration userConfig = ConfigurationUtils.load(application.getRealPath(toolFile)); 
      config.addConfiguration(userConfig); 
     } 
     toolManager.configure(config); 

     return toolManager; 
    } 
} 
Problemi correlati