【问题标题】:Check jsp is not include twice检查 jsp 是否包含两次
【发布时间】:2015-03-27 08:28:23
【问题描述】:

有谁知道如何检查一个jsp是否已经包含另一个jsp两次?

mainJSP.jsp[
   include myJSP.jsp[

       <jsp:include page="foo.jsp"/>
    ]
    include myJSP1.jsp[

       <jsp:include page="foo.jsp"/>//This should never happend
    ]
 ]

有什么想法吗?

【问题讨论】:

  • 硬编码?在你写它之前,检查它是否已经存在。由于那里没有语法错误,我怀疑是否有工具可以检查这一点。
  • 你能在包含的 foo.jsp 中放一个标志并检查它是否已经存在于 pageScope 中吗? (如果您使用的是 jstl)。
  • @drgPP 我正在使用 jstl,你能粘贴我的代码示例吗?
  • @paul,我有点困惑,如果 Foo.jsp 已经包含在主页中,您是否要检查它是否包含两次,或者更确切地说不再包含一次?
  • 如果已经包含则不包含

标签: java html jsp


【解决方案1】:

玩了一段时间后,我能够得到你想要的结果,但我只能使用 scriplets 来解决它。假设:

您的 Foo.jsp 是:(将包含在 myJsp1 和 myJsp2 中的页面)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page import="java.util.HashSet" %>

<%String hasInclude = "itHas";
request.setAttribute("hasInclude", hasInclude); %>
<%HashSet<String> hasIncludes = new HashSet<String>(); 
request.setAttribute("hasIncludes", hasIncludes);%>
<h2>Inside include</h2>

你的 myJsp1:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="java.util.HashSet" %>
<h1>Inside jsp1</h1>
<%
String hasInclude = (String)request.getAttribute("hasInclude");
HashSet<String> hasIncludes = (HashSet<String>)request.getAttribute("hasIncludes"); %>
<%if (hasIncludes==null||!hasIncludes.contains(hasInclude)) { %>
<jsp:include page="include.jsp" />
<%if (hasIncludes==null) {
hasIncludes = new HashSet<String>();
hasIncludes.add((String)request.getSession().getAttribute("hasInclude"));
} else {
    hasIncludes.add(hasInclude);
}
request.setAttribute("hasIncludes", hasIncludes);%>
<%}%>

您的 myJsp2:(与包含之前的 myJsp1 的代码相同)

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="java.util.HashSet" %>
<h1>Inside jsp2</h1>
<%
String hasInclude = (String)request.getAttribute("hasInclude");
HashSet<String> hasIncludes = (HashSet<String>)request.getAttribute("hasIncludes"); %>
<%if (hasIncludes==null||!hasIncludes.contains(hasInclude)) { %>
<jsp:include page="include.jsp" />
<%if (hasIncludes==null) {
hasIncludes = new HashSet<String>();
hasIncludes.add((String)request.getSession().getAttribute("hasInclude"));
} else {
    hasIncludes.add(hasInclude);
}
request.setAttribute("hasIncludes", hasIncludes);%>

<%}%>

最后是 main.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<jsp:include page="myJsp1.jsp" />
<jsp:include page="myJsp2.jsp" />

</body>
</html>

main 的输出将是:

jsp1内部

里面包含

jsp2内部

【讨论】:

  • 其实你应该检查isFoo是否为null,这意味着该页面没有被包含。
  • 对不起,这行不通,我稍微解释一下我想要什么
  • 我在 stackOverflow 上阅读了该实现,但我不喜欢它
  • 这个想法是 myJSP 和 myJSP1 不必相互认识,而 mainJSP 必须是一个孤立的 jsp
  • @paul,从您的图表中,我理解为,您包含两个不同的 jsp 页面,其中包含相同的 (Foo.jsp),所以想法是检查是否包含 myJsp包含 Foo.jsp 并且包含的​​ myJsp1 也包含 Foo.jsp 然后不包含 myJsp1,是否正确?或者更确切地说包括 myJsp1 但不包括其中的 Foo.jsp ?如果是这样的话,那就是一种包容:)
【解决方案2】:

jsp 文件生成一个常规的 java 方法,该方法将文本添加到输出流中,以便您可以提前返回。见How to stop processing a JSP early?

在您不想包含两次的任何文件中尝试以下操作。

foo.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="java.util.HashSet" %>
<%
// Just be careful that the attribute name is unique to this file
if (!request.getAttribute("foo.jsp") == null) {
   return;
}
request.setAttribute("foo.jsp", true)
%>
<h1>Contents of the file</h1>
...

为了尽量减少多个包含具有相同属性名称的问题,您可以使用类似以下的方法在每个 jsp 中生成唯一的属性名称。见Get current filename in JSP

String __jspName = this.getClass().getSimpleName().replaceAll("_", ".")

这种技术有点类似于流行的 C 方法来防止双重包含

#ifndef FILE_NAME
#define FILE_NAME
... file contents
#endif

【讨论】:

    猜你喜欢
    • 2015-01-22
    • 2021-01-03
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2019-01-04
    • 2014-10-08
    相关资源
    最近更新 更多