Come integrare Struts 2 con Tiles 3

Come integriamo Struts 2 con Tiles 3? Attualmente il plugin struts2-tile-plugin (2.3.4.1) funziona con una versione precedente di tiles (versione 2.0.6) questo può essere un po ‘fastidioso.

Questa è una risposta personale, per aiutare gli altri con la loro integrazione.

Grazie a Ken un nuovo plugin è stato aggiunto a Struts 2 per supportare il tipo di risultato Tiles 3, dovrebbe essere disponibile con la nuova release imminente – Struts 2.3.9

https://cwiki.apache.org/confluence/display/WW/Tiles+3+Plugin

La soluzione è aggiungere le dipendenze richieste, caricare le tessere con un listener appropriato e creare un tipo di risultato personalizzato. Fortunatamente questi passaggi sono abbastanza semplici, una volta eseguiti è ansible seguire i normali riquadri 2 esempi per come definire i modelli.

1) Dipendenze (inizia con il progetto basic struts ma in questo esempio userò le convenzioni quindi potrebbe essere meglio aggiungere plugs2-convenzioni-plugin, includerà struts2-core et al):

  • NON INCLUDERE struts2-tile-plugin
  • groupId : org.apache.tiles, artifiactId : tiles-extras, versione : 3.0.1
  • groupId : org.slf4j, artifiactId : jcl-over-slf4j, versione : 1.5.8
  • groupId : org.slf4j, artifiactId : slf4j-jdk14, versione : 1.5.8

Nota : una versione più alta delle dipendenze slf4j potrebbe funzionare Non l’ho ancora testata.

2) caricare le tessere con un ascoltatore appropriato

Questo esempio include il web.xml completo, le linee 3-5 sono l’unica cosa che dovrebbe essere nuova per qualcuno che ha familiarità con struts2.

   org.apache.tiles.extras.complete.CompleteAutoloadTilesListener   struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter   struts2 /*   

3) creare un tipo di risultato personalizzato

Dobbiamo definire un tipo di risultato personalizzato da utilizzare con le nostre azioni:

 package com.quaternion.result; import com.opensymphony.xwork2.ActionInvocation; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import org.apache.struts2.dispatcher.ServletDispatcherResult; import org.apache.tiles.TilesContainer; import org.apache.tiles.access.TilesAccess; import org.apache.tiles.request.ApplicationContext; import org.apache.tiles.request.servlet.ServletRequest; import org.apache.tiles.request.servlet.ServletUtil; public class TilesResult extends ServletDispatcherResult { public TilesResult() { super(); } public TilesResult(String location) { super(location); } @Override public void doExecute(String location, ActionInvocation invocation) throws Exception { //location = "test.definition"; //for test setLocation(location); ServletContext context = ServletActionContext.getServletContext(); ApplicationContext applicationContext = ServletUtil.getApplicationContext(context); TilesContainer container = TilesAccess.getContainer(applicationContext); HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); ServletRequest servletRequest = new ServletRequest(applicationContext, request, response); container.render(location, servletRequest); } } 

4) Dobbiamo anche dire a struts2 del nostro tipo di risultato:

            

Con questo fuori mano possiamo ora usare le tessere nei nostri progetti, supponiamo di aver creato una definizione di tile chiamata “test.definition”, possiamo dire alla nostra azione di usare quella definizione facendo quanto segue:

 package com.quaternion.demo.action.test; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; @ParentPackage("tiles-package") @Result(type="tiles-result", location="test.definition") public class QuaternionResultTest extends ActionSupport{} 

Questo è tutto, questo ti permetterà di configurare qualsiasi versione di struts2 con tiles 3+, per favore vedi http://tiles.apache.org/framework/index.html per ulteriori dettagli di configurazione.

  

usa menzionato doctype nel tuo tile.xml