Struts 2 を Tiles 3 と統合するにはどうすればよいですか? 現在、struts2-tiles-plugin (2.3.4.1) は古いバージョンのタイル (バージョン 2.0.6) で動作しますが、これは少し面倒です。
これは、他の人が統合するのを助けるための自己回答です。
解決策は、必要な依存関係を追加し、適切なリスナーを使用してタイルを読み込み、カスタムの結果の種類を作成することです。幸いなことに、これらの手順は非常に簡単です。完了したら、通常のタイル 2 の例に従って、テンプレートを定義する方法を確認できます。
1)依存関係(基本的な struts プロジェクトから始めますが、この例では規則を使用するので、struts2-conventions-plugin を追加するのが最善かもしれません。struts2-core などが含まれます):
注: 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>
これで、プロジェクトでタイルを使用できるようになりました。「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{}
以上で、タイル 3 以降の struts2 の任意のバージョンを構成できるようになります。構成の詳細については、 http: //tiles.apache.org/framework/index.html を参照してください。
Ken のおかげで、Tiles 3 の結果タイプをサポートする新しいプラグインが Struts 2 に追加されました。これは、今後の新しいリリース - Struts 2.3.9 で利用できるはずです。
https://cwiki.apache.org/confluence/display/WW/Tiles+3+Plugin