【问题标题】:Sitemesh 2 is not decorating my JSPsSitemesh 2 没有装饰我的 JSP
【发布时间】:2016-10-07 15:17:15
【问题描述】:

我正在尝试使用 Sitemesh 2.4.2 来装饰一些带有导航栏的 JSP,并将我的 CSS 引用提取到这个装饰器中。但是,我不能让它工作:根据我在decorators.xml 中设置模式的方式,我要么只得到没有装饰器的基本 JSP,要么得到装饰器(这是 @987654322 的内容@ 标记,以及我在 <body> 标记开头添加的 <navbar>),没有来自基本 JSP 的内容。
我的应用程序使用 Glassfish 4 作为应用程序服务器,因此使用 Jersey 2。因为我使用的是 JSP,所以我使用 Jersey 作为过滤器。

这是我的web.xml(我不完全确定是否需要这个 FORWARD 调度程序)

<web-app version="3.0" 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_3_0.xsd">

  <filter>
    <filter-name>SiteMeshFilter</filter-name>
    <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>SiteMeshFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
  </filter-mapping>

  <filter>
    <filter-name>jersey</filter-name>
    <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
    <init-param>
      <param-name>jersey.config.servlet.filter.forwardOn404</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>javax.ws.rs.Application</param-name>
      <param-value>com.xxx.jersey2.config.CustomResourceConfig</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>jersey</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

我的decorators.xml

<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/WEB-INF/decorators">
<decorator name="main" page="my_navbar.jsp">
  <!--<pattern>/jsp/*</pattern>-->
  <pattern>/*</pattern>
</decorator>
</decorators>

在这里,如果我将模式更改为&lt;pattern&gt;/jsp/*&lt;/pattern&gt;,那么装饰器就不会被包含在内——我只会得到基本的 JSP。
通过将模式设置为&lt;pattern&gt;/*&lt;/pattern&gt;,我得到只有装饰器,也就是说,我只得到my_navbar.jsp 的内容。另外,Sitemesh 上面的标签,如&lt;decorator:body /&gt;,根本不会被渲染,它们会出现在浏览器可以看到的生成的网页源代码中。

这是要装饰的 JSP,my_navbar.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Sandbox application</title>
    <link rel="stylesheet" href="../../js/jquery-1.12.4.min.js">
    <link rel="stylesheet" href="../../css/bootstrap.min.css">
    <link rel="stylesheet" href="../../js/bootstrap.min.js">
    <decorator:head />
</head>
<body>

<nav class="navbar navbar-light bg-faded">
    <ul class="nav navbar-nav">
        <li class="nav-item">
            <a class="nav-link" href="/sample-jersey2/">Home</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="/sample-jersey2/movies/list/">Movies</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="/sample-jersey2/genres/list/">Genres</a>
        </li>
    </ul>
</nav>

<decorator:body />

</body>
</html>

最后,我尝试用导航栏和样式装饰其中一个 JSP

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title></title>
</head>
<body>

<h2>Listing Movies</h2>
    <table class="table table-striped">
        <tr>
            <th>Name</th>
            <th>Starring</th>
            <th>Genre</th>
        </tr>
        <c:forEach var="item" items="${it.movies}">
            <tr>
                <td>${item.name}</td>
                <td>${item.starring}</td>
                <td>${item.genre}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

对此的任何想法将不胜感激。
问候

【问题讨论】:

    标签: java jsp jersey glassfish sitemesh


    【解决方案1】:

    我的my_navbar.jsp 文件中缺少这一行:

    <%@ taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
    

    现在它可以正常工作了。

    【讨论】:

      猜你喜欢
      • 2014-05-30
      • 2015-05-20
      • 2011-07-10
      • 2011-12-24
      • 2013-08-25
      • 2014-02-14
      • 2011-05-21
      • 2013-03-01
      相关资源
      最近更新 更多