Как интегрировать Struts 2 с Tiles 3

Как мы интегрируем Struts 2 с Tiles 3? Плагин struts2-tile-plugin (2.3.4.1) в настоящее время работает со старой версией тайлов (версия 2.0.6), что может быть немного неприятно.

Это ответ на себя, чтобы помочь другим с их интеграцией.

3 ответа

Решение

Благодаря Кену в Struts 2 был добавлен новый плагин для поддержки типа результатов Tiles 3, он должен быть доступен в следующем выпуске - Struts 2.3.9

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

Решение состоит в том, чтобы добавить необходимые зависимости, загрузить плитки соответствующим слушателем и создать собственный тип результата. К счастью, эти шаги довольно просты, после того, как вы сделаете это, вы можете следовать обычным плиткам 2 примера для определения шаблонов.

1) Зависимости (начните с базового проекта Struts, но в этом примере я буду использовать условные обозначения, так что может быть лучше всего добавить Struts2-ventionstions-плагин, он будет включать в себя struts2-core и др.):

  • НЕ ВКЛЮЧАЙТЕ Struts2-Tiles-Plugin
  • groupId: org.apache.tiles, artifiactId: плитки-дополнения, версия: 3.0.1
  • groupId: org.slf4j, artifiactId: jcl-over-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>

Теперь мы можем использовать плитки в наших проектах, предположим, что мы создали определение плиток с именем "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{}

Вот и все, это позволит вам настроить любую версию struts2 с плитками 3+, см. http://tiles.apache.org/framework/index.html для получения дополнительной информации о конфигурации.

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

используйте упомянутый doctype в вашем tile.xml

Другие вопросы по тегам