struts2 - examples - struts 2 maven tutorial
Cómo integrar Struts 2 con Tiles 3 (3)
La solución es agregar las dependencias requeridas, cargar teselas con un oyente apropiado y crear un tipo de resultado personalizado. Afortunadamente, estos pasos son bastante fáciles. Una vez hecho, puedes seguir dos ejemplos de tiles normales para ver cómo se definen las plantillas.
1) Dependencias (comience con el proyecto básico de struts pero en este ejemplo usaré convenciones para que sea mejor agregar struts2-conventions-plugin, incluirá struts2-core et al):
- NO INCLUYA struts2-tiles-plugin
- groupId : org.apache.tiles, artifiactId : tiles-extras, versión : 3.0.1
- groupId : org.slf4j, artifiactId : jcl-over-slf4j, versión : 1.5.8
- groupId : org.slf4j, artifiactId : slf4j-jdk14, versión : 1.5.8
Nota : Puede funcionar una versión superior de las dependencias slf4j. No probé esto.
2) carga las fichas con un oyente apropiado
Este ejemplo incluye el web.xml completo, las líneas 3-5 son lo único que debería ser nuevo para alguien familiarizado con struts2.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<listener>
<listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3) crear un tipo de resultado personalizado
Necesitamos definir un tipo de resultado personalizado para usar con nuestras acciones:
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) También necesitamos decirle a struts2 sobre nuestro tipo de resultado:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.ui.theme" value="simple" />
<package name="tiles-package" namespace="" extends="struts-default">
<result-types>
<result-type default="true" name="tiles-result" class="com.quaternion.result.TilesResult"/>
</result-types>
</package>
</struts>
Con eso fuera del camino, ahora podemos usar mosaicos en nuestros proyectos, supongamos que hemos creado una definición de teselas llamada "test.definition", podemos decirle a nuestra acción que use esa definición haciendo lo siguiente:
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{}
Eso es todo, esto le permitirá configurar cualquier versión de struts2 con tiles 3+, consulte http://tiles.apache.org/framework/index.html para obtener más detalles sobre la configuración.
¿Cómo integramos Struts 2 con Tiles 3? El struts2-tiles-plugin actualmente (2.3.4.1) funciona con una versión anterior de los tiles (versión 2.0.6) esto puede ser un poco molesto.
Esta es una respuesta automática, para ayudar a otros con su integración.
Gracias a Ken, se agregó un nuevo complemento a Struts 2 para admitir el tipo de resultado Tiles 3, que debería estar disponible con la próxima versión nueva: Struts 2.3.9
https://cwiki.apache.org/confluence/display/WW/Tiles+3+Plugin
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
usa el doctype mencionado en tus tiles.xml