【问题标题】:OGNL and wildcards working in tiles definitions with struts2-tiles-plugin?OGNL 和通配符在使用 struts2-tiles-plugin 的瓷砖定义中工作?
【发布时间】:2012-04-20 11:33:36
【问题描述】:

我希望 Tiles 从 struts2 值堆栈中解析 ognl。如何做到这一点?

使用 tile 2.2.2(尽管如果可以使用更高版本,例如 3 也可以)

这里提到了新功能: http://tiles.apache.org/2.2/framework/whats-new.html

这里展示了如何实现它:http://tiles.apache.org/2.2/framework/tutorial/advanced/el-support.html#OGNL_Support

但我不确定如何在我的项目中进行。是否有人在他们的 struts2 项目中使用了 tiles3?我记得读过一些方法可以默认打开图块 3 中的所有新功能,但我找不到该页面的链接。

如果可以使用 spring 进行配置,那很好(如果有帮助,如果没有,则不是问题)。

【问题讨论】:

  • 我不确定您要做什么——您的意思是您希望 Tiles def 中的 OGNL 使用 S2 值堆栈吗?
  • 是的……确实如此。我只是不知道我在做什么,文档可能会更清晰一些。

标签: struts2 tiles ognl


【解决方案1】:

我喜欢 tile 模板系统,因为它简单直接,使用 Tiles 2.2.2,您可以使用通配符支持将您的 struts2 约定直接推送到模板系统中,现在还有 OGNL!

在图块中添加支持 OGNL 的图块 2.2.2 的步骤(当前使用 Struts 2.3.1.2):

1) 添加struts2-tiles-plugin

2) 添加tiles 2.2.2 jars,包括添加ognl 支持的jars。假设 maven:所有组 id 是:org.apache.tiles 所有版本都是 2.2.2,以下是工件 id:

  • tiles-api
  • 瓷砖核心
  • 瓷砖附加功能
  • tiles-jsp
  • tiles-ognl
  • tiles-servlet

还需要添加以下内容:

通过使用 org.apache.tiles.extras.complete.CompleteAutoloadTilesListener,您可以在您的 tiles.xml 中获得 Wild Cards、EL、OGNL、MVEL 支持

示例 web.xml:

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

struts.xml 用于演示:该演示使用 struts 中的 OGNL 来显示硬编码的问候消息。三个动作映射存在“”、“test”和“package/*”,斜线后面的值将被tiles用来设置一个新的标题。一个非常简单的示例,但确实显示了一些有用的功能。

<struts>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.ui.theme" value="simple" />
    <constant name="struts.enable.SlashesInActionNames" value="true" />
    <constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
    <package  name="basicstruts2"  namespace="" extends="tiles-default">
        <result-types>
            <result-type name="tiles" default="true" class="org.apache.struts2.views.tiles.TilesResult"/>
        </result-types>
        <action name="/**" class="com.kenmcwilliams.tiles.action.Test">
            <result>{1}</result>
        </action>
    </package>
</struts>

tiles.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
    <definition name="baseLayout" template="/WEB-INF/content/tiles/template.jsp">
        <put-attribute name="title" value="Default Title"/>
        <put-attribute name="header" value="/WEB-INF/content/tiles/header.jsp"/>
        <put-attribute name="body" value="/WEB-INF/content/tiles/body.jsp"/>
        <put-attribute name="footer" value="/WEB-INF/content/tiles/footer.jsp"/>
        <put-attribute name="variable"  expression="OGNL:greeting"/>
    </definition>
    <definition name="test" extends="baseLayout">
        <put-attribute name="title" value="Test Title"/>
    </definition>
    <definition name="WILDCARD:package/*" extends="baseLayout">
        <put-attribute name="title" value="{1}" type="string"/>
    </definition>
    <definition name="" extends="baseLayout">
    </definition>
</tiles-definitions>

/WEB-INF/content/tiles/body.jsp

<div>
    This is the default body.
</div>

/WEB-INF/content/tiles/footer.jsp

<div>
    This is the default footer.
</div>

/WEB-INF/content/tiles/header.jsp

<div>
    This is the default header.
</div>

/WEB-INF/content/tiles/template.jsp

<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<%@page contentType="text/html" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title><tiles:insertAttribute name="title"/></title>
    </head>
    <body>
        <tiles:insertAttribute name="header"/>
        <tiles:insertAttribute name="body"/>
        <tiles:insertAttribute name="footer"/>
        <tiles:insertAttribute name="variable"/>
    </body>
</html>

Test.java 操作

package com.kenmcwilliams.tiles.action;

import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import java.util.logging.Logger;
import org.apache.struts2.interceptor.SessionAware;

public class Test extends ActionSupport implements SessionAware{
    private static final Logger log = Logger.getLogger(Test.class.getName());
    @Override
    public String execute(){
        log.info("Test execute");
        return SUCCESS;
    }

    private String greeting = "Hello, World from Action!";
    public String getGreeting(){
        return greeting;
    }

    @Override
    public void setSession(Map<String, Object> session) {
        session.put("greeting", "Greetings from session!");
    }
}

现在应该足以让磁贴适用于您的应用程序。

【讨论】:

猜你喜欢
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
相关资源
最近更新 更多