2012-11-12 108 views
6

我們如何將Struts 2與Tiles 3集成?當前的struts2-tiles-plugin(2.3.4.1)與舊版本的tile(版本2.0.6)一起工作,這可能有點麻煩。如何將Struts 2與Tiles 3集成3

這是一個自我回答,幫助他人融合。

回答

5

由於肯一個新的插件加入到Struts 2的支持磚3的結果類型,它應該是可用即將推出的新版本 - 的Struts 2.3.9

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

+0

我一直在搞瓷磚拼成struts2約定,這是工作,但它不漂亮...也許我也可以發送你也是你呢? – Quaternion

+0

請確定,這是第一次嘗試支持Tiles 3,所以我們可以在下一個版本中擴展它 –

+1

在此接受了答案,因爲......此插件的工作量少得多。 – Quaternion

7

解決方案是添加所需的依賴項,使用適當的偵聽器加載磁貼並創建自定義結果類型。幸運的是,這些步驟非常簡單,一旦完成,您可以按照正常的方塊2例子來定義模板。

1)依賴(先從基本的支柱項目,但在這個例子中,我將使用約定所以它可能只是最好加struts2中的約定,插件,它將包括struts2的核心等):

  • 不包括 Struts2的瓷磚,插件
  • 的groupId:org.apache.tiles,artifiactId:瓷磚,演員,版本:3.0.1
  • 的groupId:org.slf4j,artifiactId:JCL-過SLF4J,版本:1.5.8
  • 的groupId:org.slf4j,artifiactId:SLF4J-JDK14,版本 :1.5.8

注意:更高版本的SLF4J依賴可能工作,我的沒有測試過這個。

2)用適當的聽衆

這個例子包含了完整的web.xml中,3-5行負荷磚,應該是新的人熟悉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)創建自定義結果類型

我們需要定義一個自定義結果類型用我們的行動用途:

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我們的結果類型:

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

隨着那個出wa我們現在可以在我們的項目中使用瓷磚,假設我們已經創建了一個名爲「test」的瓷磚定義。定義」我們可以告訴我們的行動從做使用的定義如下:

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

就是這樣,這將讓你配置與瓷磚3+ struts2的任何版本,請參閱http://tiles.apache.org/framework/index.html進一步配置的詳細信息。

+0

見http://mail-archives.apache.org/mod_mbox/struts-dev/201211.mbox/browser –

+0

是的,我是爲了建立一個JIRA的任務......是你的意思? – Quaternion

+0

在撰寫之前的評論時,我還不知道你和struts-dev的人是一樣的 –

0
<!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