Вы можете использовать тег JSTL (просто перетащите jstl-1.2.jar in /WEB-INF/lib
) c:import
для импорта внешнего ресурса,который выдаст FileNotFoundException
, если URL недействителен, что, в свою очередь, может быть отслежено с помощью тега JSTL c:catch
.Наконец, вы можете использовать JSTL c:choose
, чтобы проверить, отображать ли iframe или возможную ошибку.
Вот SSCCE , copy'n'paste'n 'запустите его (с установленным JSTL):
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<title>SO question 2291085</title>
</head>
<body>
<c:set var="url" value="http://google.com" />
<c:catch var="e">
<c:import url="${url}" varReader="ignore" />
</c:catch>
<c:choose>
<c:when test="${empty e}">
<iframe src="${url}"></iframe>
</c:when>
<c:otherwise>
<p>Error! ${e}</p>
</c:otherwise>
</c:choose>
</body>
</html>
Измените http://google.com
на http://google.com/foo
или что-то недопустимое, вы увидите вместо этого ошибку.
Обратите внимание, что я использовал varReader="ignore"
чтобы он был буферизован, но не прочитан, так что он не будет полностью доставлен, что может быть дорогостоящим, потому что в конце концов вы запрашиваете один и тот же URL дважды.
Обновление : В качестве альтернативы,для этого вы можете использовать Servlet
, который предварительно обрабатывает запрос внутри метода doGet()
с помощью java.net.URLConnection
.Вот пример стартапа.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
URL url = new URL("http://google.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
int status = connection.getResponseCode(); // 200 = OK, 404 = Not Found, etc.
if (status == 200) {
request.setAttribute("url", url);
} else {
// Do your thing to set custom message or request another page.
}
request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);
}
... а в page.jsp
тогда просто есть что-то вроде
<c:if test="${not empty url}">
<iframe src="${url}"></iframe>
</c:if>
Отобразите сервлет на url-pattern
чего-то вроде /foo
и позвоните на http:/example.com/contexty/foo
вместо JSP.