2015-03-27 3 views
0

Кто-нибудь знает, как проверить, что jsp уже включает другой jsp дважды?Проверка jsp не включается дважды

mainJSP.jsp[ 
    include myJSP.jsp[ 

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

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

Любые идеи ?.

+0

как в жёстко? прежде чем вы напишете его, проверьте, есть ли он там. Поскольку там нет синтаксической ошибки, я сомневаюсь, что есть инструмент, который проверяет это. – Stultuske

+0

Можете ли вы поместить флаг в список foo.jsp и проверить, существует ли он в pageScope? (если вы используете jstl). – drgPP

+0

@drgPP Я использую jstl, вы можете вставить мне пример кода, пожалуйста? – paul

ответ

2

После некоторого времени игры я смог получить желаемый результат, но я смог разрешить его только с помощью скриптов. Предположим, что:

Ваш 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> 

Выход Основной будет:

Inside jsp1

Внутри включают

Inside jsp2

+0

На самом деле вы должны проверить, является ли isFoo равным null, это означает, что страница не была включена. – drgPP

+0

Извините, что это не работает, я объясняю немного лучше, что хочу – paul

+0

Я прочитал эту реализацию здесь, в stackOverflow, но мне не нравится – paul

1

Файл 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 
Смежные вопросы