0

嗨,我正在使用 Tapestry 5 创建规划 Web 应用程序并解决 Spring 安全问题,我已将 org.apache.tapestry5.TapestryFilter 中的 url 模式从 /* 更改为 /planning/* 在更改了相应的 url 和文件路径之后任何 Java / .tml 文件相应地 Web 应用程序按预期工作,但是我的 css 样式表不再被拾取。

我在组件文件中有一个 Layout.java 和一个相应的 Layout.tml,然后在 webapp 文件(WEB-INF 之外)的布局文件夹中有一个 layout.css 文件在
Layout.java 文件中调用样式表@Import(stylesheet="context:layout/layout.css") - 这以前总是有效的!

我已经尝试将 css 文件移动到计划子目录 Planning/layout/layout.css 但这似乎仍然没有什么区别!

Web.xml

  <display-name>Planning Tapestry 5 Application</display-name>

  <context-param>
    <param-name>tapestry.app-package</param-name>
    <param-value>com.quartetfs.planning.tapestry</param-value>
  </context-param>

  <filter>
    <filter-name>app</filter-name>
    <filter-class>org.apache.tapestry5.TapestryFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>app</filter-name>
    <url-pattern>/planning/*</url-pattern>
  </filter-mapping>

布局.java

import org.apache.tapestry5.*;
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.ioc.annotations.*;
import org.apache.tapestry5.BindingConstants;

/**
 * Layout component for pages of Planning Application.
 */
@Import(stylesheet="context:layout/layout.css")
public class Layout
{
    /** The page title, for the <title> element and the <h1> element. */
    @Property
    @Parameter(required = true, defaultPrefix = BindingConstants.LITERAL)
    private String title;

    @Property
    private String pageName;

    @Property
    @Parameter(defaultPrefix = BindingConstants.LITERAL)
    private String sidebarTitle;

    @Property
    @Parameter(defaultPrefix = BindingConstants.LITERAL)
    private Block sidebar;

    @Inject
    private ComponentResources resources;

    public String getClassForPageName()
    {
      return resources.getPageName().equalsIgnoreCase(pageName)
         ? "current_page_item"
         : null;
    }

    public String[] getPageNames()
    {
      return new String[] { "planning/Index", };// "About", "Contact" }; TODO
    }
}

布局.tml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-     strict.dtd">
<!--

Design by Free CSS Templates
http://www.freecsstemplates.org
Released for free under a Creative Commons Attribution 2.5 License

Title      : Concrete
Version    : 1.0
Released   : 20080825
Description: A Web 2.0 design with fluid width suitable for blogs and small websites.
-->

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"
      xmlns:p="tapestry:parameter">



    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
        <title>${title}</title>
    </head>

    <body>
        <!-- start header -->
        <div id="header">
            <div id="logo">
                <h1>
                    <t:pagelink page="planning/index">Project and Resource Planning</t:pagelink>
                </h1>
            </div>
            <div id="menu">
                <ul>
                   <li t:type="loop" source="pageNames" value="pageName" class="prop:classForPageName">
                        <t:pagelink page="prop:pageName">${pageName}</t:pagelink>
                    </li>
                </ul>
             </div>
        </div>
        <!-- end header -->

        <!-- start page -->
        <div id="page">
            <!-- start sidebar -->
            <div id="sidebar">
                <ul>
                    <li id="search" style="background: none;">
                    </li>
                    <li t:type="if" test="sidebar">
                        <h2>${sidebarTitle}</h2>
                        <div class="sidebar-content">
                            <t:delegate to="sidebar"/>
                        </div>
                    </li>
                </ul>
            </div>
            <!-- end sidebar -->

            <!-- start content -->
            <div id="content">
                <div class="post">
                    <div class="title">
                        <h2>${title}</h2>
                    </div>
                    <div class="entry">
                        <t:body/>
                    </div>
                </div>
            </div>
            <!-- end content --> 

            <br style="clear: both;"/>
        </div>
        <!-- end page -->

        <!-- start footer -->
        <div id="footer">
            <p class="legal">
                &copy;2009 com.example. All Rights Reserved.
                &nbsp;&nbsp;&bull;&nbsp;&nbsp;
                Design by
                <a href="http://www.freecsstemplates.org/">Free CSS Templates</a>
                &nbsp;&nbsp;&bull;&nbsp;&nbsp;
                Icons by
                <a href="http://famfamfam.com/">FAMFAMFAM</a>.
            </p>
        </div>
        <!-- end footer -->

    </body>
</html>
4

1 回答 1

0

您不必移动 layout.css 文件;如果 Tapestry 找不到,那么在加载包含 Layout 组件的页面时会抛出异常。

当你遇到这样的问题时,查看渲染页面的来源非常有用,看看请求和响应是什么。

我怀疑样式表的 URL 以“/assets/...”的形式出现...... Tapestry 没有接收到它(由于您的过滤器映射的设置方式),您会看到 404 错误.

有必要通知 Tapestry 您已将应用程序放置在一个子文件夹中(可惜,Servlet API 不提供对您如何在 web.xml 中进行配置的内省)。

http://tapestry.apache.org/configuration.html#Configuration-tapestry.applicationfolder

一旦 Tapestry 知道应用程序文件夹,它就可以构建正确的 URL。

于 2013-08-08T17:55:15.877 回答