在公共标头中声明时,无法识别JSTL标记库

时间:2010-11-30 21:31:37

标签: include jstl

我有一段时间的想法将我的所有taglib声明(uri等)放在一个公共头文件中,所以我不必手动将它们写入我的所有JSP中。最初,事情看起来很好,虽然我不像简单的EL语法那样使用实际的taglib。但是,我在所有jsp文件中都遇到了麻烦,除了明确声明了taglibs的文件。所有其他jsp(包括头文件)都将<c:something.../>标记视为HTML并且不对其进行评估。我做了一些谷歌搜索,发现this post on O'Reilly暗示我正在做的事情可以做,但我显然做错了什么。更重要的是,头文件中的其他内容(常见页眉,页面标题等)都显示正常。头文件和包含的示例如下。

标题文件:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ page session="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

包含声明:

<jsp:include page="/WEB-INF/jsp/include/header.jsp">
    <jsp:param name="title" value="Home" />
</jsp:include>

1 个答案:

答案 0 :(得分:21)

这是预期的行为。

当您使用<jsp:include>时,它在单独的请求中执行目标,然后在包含JSP中包含输出。它不包含所包含目标的,它包含输出。生成目标输出的方法将丢失。

要执行您要执行的操作,您需要使用<% include %>指令:

<%@ include file="/WEB-INF/jsp/include/header.jsp" %>

这会将header.jsp的文字文字倾斜到您的页面中。当然,通过这样做,您不能再向其传递参数,因此您需要将其设置为页面上下文属性(例如,使用<c:set> ...但当然您不能使用{{ 1}}直到你完成了包括......)。

基本上,这不值得麻烦。 Taglib声明是令人讨厌的样板,但很难摆脱。