Там у вас есть <jsp:include>
для. Вы можете использовать EL для указания атрибута page
.
Создайте файл /WEB-INF/main.jsp
, который будет выглядеть так:
<!doctype html>
<html lang="en">
<head>
<title>Title</title>
</head>
<body>
<jsp:include page="${page}" />
</body>
</html>
Вы можете управлять значением ${page}
с помощью сервлета контроллера страницы. Что-то вроде:
public class PageController extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("page", "/WEB-INF" + request.getPathInfo());
request.getRequestDispatcher("/WEB-INF/main.jsp").forward(request, response);
}
}
Отобразить этот сервлет в web.xml
следующим образом:
<servlet>
<servlet-name>pageController</servlet-name>
<servlet-class>com.example.PageController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pageController</servlet-name>
<url-pattern>/page/*</url-pattern>
</servlet-mapping>
Таким образом, сервлет доступен через http://example.com/context/page/foo.jsp
, и в этом примере URL он будет получать /foo.jsp
из pathinfo и, таким образом, установить атрибут page
со значением /WEB-INF/foo.jsp
, чтобы он был доступен в EL как ${page}
, чтобы jsp:include
знал, что он должен включать. Нет необходимости в грязных скриптлетах или операторах переключения.
В /WEB-INF/foo.jsp
вы можете просто записать HTML, как если бы он был помещен внутри тега HTML <body>
.
Обратите внимание, что файлы JSP помещаются в /WEB-INF
, это сделано для предотвращения прямого доступа по URL, чтобы пользователи не могли запрашивать их без прохождения через контроллер страницы, например, http://example.com/context/foo.jsp
, который только возвращает частичное содержание (будущая страница).
Надеюсь, это поможет.