2015-12-12 2 views
0

enter image description hereJava: в том числе заголовка шаблона (вызывает сервлет) на JSP-страницу (вызывает сервлет)

Я пытаюсь понять, как JSP и сервлеты работают вместе. Таким образом, при запросе веб-страницы запускается сервлет, который отправляет некоторые данные в качестве ответа, а JSP, который запускает сервлет, обрабатывает (например, показывает) данные.

Все работает, но у меня есть небольшая проблема с частичной JSP-страницей, которая включена в запрошенную страницу как «компонент шаблона» (она действует как компонент шаблона (например, баннеры и т. Д.)).

В моем случае у меня есть заголовок (jsp-файл, который должен запускать сервлет, запрашивать некоторые данные и пересылать их в родительский jsp-файл), который должен быть включен внутри (возможно/почти) все страницы. Таким образом, когда запрашивается страница, страница должна включать некоторые другие ответы на свой ответ.

на самом деле я говорю об этом. Ниже приведены мои JSP-файлы.

1) WEB-INF/JSP/head.jsp (действует как часть шаблона): это работает, поскольку он не вызывает сервлет.

<%@page contentType="text/html" pageEncoding="UTF-8" session="false"%> 
<%@taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%> 
<title>Company - ${param.title}</title> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<link rel="shortcut icon" href=<c:url value='/images/favicon.ico'/> type="image/x-icon"/> 
<link rel="stylesheet" href=<c:url value='/styles/default.css'/>> 

2) WEB-INF/JSP/header.jsp (действует как часть шаблона), это один не работает.

<%@ page language="java" contentType="text/html; charset=utf-8" 
    pageEncoding="utf-8" session="false"%> 
<header> 
We are ${companyStatus} 
</header> 

3) WEB-INF/JSP/index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" 
    pageEncoding="utf-8" session="false"%> 
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<!DOCTYPE html> 
<html> 
<head> 
<c:import url="head.jsp"> 
    <c:param name="title" value="Welcome" /> 
</c:import> 
</head> 
<body> 
    <%@include file="header.jsp"%> 
    <p>${test}</p> 
</body> 
</html> 

И в этот момент у меня есть два сервлета.

IndexServlet (@WebServlet('/index.html'))

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
     request.setAttribute("test", "Some specific data for Welcome-page only!"); 
     request.getRequestDispatcher(/WEB-INF/JSP/index.jsp).forward(request, response); 
} 

HeaderServlet (@WebServlet("WEB-INF/JSP/header.jsp"))

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
     request.setAttribute("companyStatus", "closed"); 
     request.getRequestDispatcher(????).forward(request, response); 
} 

Это не работает, конечно.

P.S. This (нажмите, чтобы увидеть ссылку) это не мой вопрос. Мой вопрос заключается в том, как включить ответ страницы JSP в ответ на другую страницу JSP.

ответ

0

Я мог бы решить проблему. Теперь это работает. Я отредактировал файл web.xml и добавлены следующие конфигурации:

web.xml

<servlet> 
    <servlet-name>HeaderServlet</servlet-name> 
    <servlet-class>my.package.HeaderServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>HeaderServlet</servlet-name> 
    <url-pattern>/header</url-pattern> 
</servlet-mapping> 

Тогда я отредактировал мой HeaderServletdoGet

HeaderServlet

@WebServlet("/HeaderServlet") 
<...> 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
     request.setAttribute("companyStatus", "closed"); 
     request.getRequestDispatcher("WEB-INF/JSP/header.jsp").forward(request, response); 
} 

в затем редактировал мой index.jsp файл

индекс.JSP

<%@ page language="java" contentType="text/html; charset=utf-8" 
    pageEncoding="utf-8" session="false"%> 
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<!DOCTYPE html> 
<html> 
<head> 
<c:import url="head.jsp"> 
    <c:param name="title" value="Welcome" /> 
</c:import> 
</head> 
<body> 
    <c:import url="/header" /> 
    <p>${test}</p> 
</body> 
</html> 

Тогда я на самом деле сделал пользовательский тег и заменить <c:import url="/header" /> на <my:header />. Но этот последний шаг - это просто дополнительное усовершенствование для моего решения, поэтому я не пишу дальнейшего объяснения об пользовательских тегах.