如何将Struts 2与Tiles 3集成

我们如何将Struts 2与Tiles 3整合? 目前struts2-tiles-plugin(2.3.4.1)可以使用旧版本的tile(版本2.0.6),这可能有点麻烦。

这是一个自我回答,帮助他人融合。

感谢Ken在Struts 2中添加了一个新的插件来支持Tiles 3结果types,它应该在即将推出的新版本中提供 – Struts 2.3.9

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

解决scheme是添加所需的依赖关系,使用适当的侦听器加载切片并创build自定义结果types。 幸运的是,这些步骤相当简单,一旦完成,您可以按照正常的方块2例子来定义模板。

1) 依赖性 (从基本的struts项目开始,但在这个例子中,我将使用约定,所以最好添加struts2-conventions-plugin,它将包括struts2-core等):

  • 不要包含 struts2-tiles-plugin
  • groupId :org.apache.tiles, artifiactId :tiles-extras, 版本 :3.0.1
  • groupId :org.slf4j, artifiactId :jcl-over-slf4j, 版本 :1.5.8
  • groupId :org.slf4j, artifiactId :slf4j-jdk14, 版本 :1.5.8

:更高版本的slf4j依赖可能工作我还没有testing过这个。

2) 用适当的监听器加载瓦片

这个例子包含了完整的web.xml,对于熟悉struts2的人来说,第3-5行是唯一的新东西。

<?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) 创build一个自定义结果types

我们需要定义一个自定义的结果types以用于我们的操作:

 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)我们还需要告诉struts2我们的结果types:

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

现在我们可以在我们的项目中使用瓷砖了,假设我们已经创build了一个名为“test.definition”的瓷砖定义,我们可以通过执行以下操作告诉我们的操作使用该定义:

 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{} 

就这样,这可以让你configuration任何版本的struts2与瓷砖3+,请参阅http://tiles.apache.org/framework/index.html进一步的configuration细节。;

 <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd"> 

在tiles.xml中使用提及的doctype