如何在Struts 2与3瓷砖整合(How to integrate Struts 2 with T

2019-06-21 03:22发布

我们如何整合Struts 2的使用Tiles 3? Struts2的瓷砖 - 插件目前(2.3.4.1)使用旧版本的瓷砖(2.0.6版本)的作品这可有点讨厌的。

这是一种自我的答案,帮助别人与他们的融合。

Answer 1:

由于肯一个新的插件加入到Struts 2的支持砖3的结果类型,它应该是可用即将推出的新版本 - 的Struts 2.3.9

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



Answer 2:

解决的办法是与适当的监听器添加所需要的依赖,负载瓦片和创建定制结果类型。 幸运的是,这些步骤是很容易,做一次就可以按照正常的瓷砖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>

有了这样的,我们现在可以在我们的项目中使用的瓷砖,假设我们已经创建了一个名为“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进一步配置的详细信息。



Answer 3:

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

使用DOCTYPE提到在tiles.xml



文章来源: How to integrate Struts 2 with Tiles 3