Нередко страница jsp обрабатывает запрос вместе сервлетом. В этом случае сервлет определяет логику, а jsp - визуальную часть. И при обработке запроса сервлет может перенаправить дальнейшую обработку странице jsp. Соответственно может возникнуть вопрос, как передать данные из сервлета в jsp?
Есть несколько способов передачи данных из сервлета в jsp, которые заключаются в использовании определенного контекста или scope. Есть несколько контекстов для передачи данных:
request (контекст запроса): данные сохраняются в HttpServletRequest
session (контекст сессии): данные сохраняются в HttpSession
application (контекст приложения): данные сохраняются в ServletContext
Данные из контекста запроса доступны только в пределах текущего запроса. Данные из контекста сессии доступны только в пределах текущего сеанса. А данные из контекста приложения доступны постоянно, пока работает приложение.
Но вне зависимости от выбранного способа передача данных осуществляется с помощью метода setAttribute(name, value), где name - строковое название данных, а value - сами данные, которые могут представлять различные данные.
Наиболее распространенный способ передачи данных из сервлета в jsp представляют атрибуты запроса. То есть у объекта HttpServletRequest, который передается в сервлет, вызывается метод setAttribute(). Этот метод устанавливает атрибут, который можно получить в jsp.
Например, добавим в проект страницу basic.jsp со следующим кодом:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP Application</title>
</head>
<body>
<p>Name: ${name}</p>
<p>Age: ${age}</p>
</body>
</html>
В basic.jsp можно получить атрибуты name и age и вывести их значение на страницу. Для вывода атрибутов применяется специальный синтаксис EL: в фигурные скобки {} заключается выводимое значение
Определим сервлет HelloServlet, который передает запрос basic.jsp и передает ей данные:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("name", "Tom");
request.setAttribute("age", 34);
getServletContext().getRequestDispatcher("/basic.jsp").forward(request, response);
}
}
Сервлет устанавливает два атрибута - "name" и "age" через объект HttpServletRequest и затем перенаправляет запрос странице basic.jsp.
Если мы обратимся к сервлету HelloServlet, то он передаст запрос и данные странице basic.jsp.
Использование контекста приложения представляет применение объекта ServletContext, который можно получить в сервлете с помощью метода getServletContext():
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext selvletContext = getServletContext();
selvletContext.setAttribute("name", "Tom");
selvletContext.setAttribute("age", 35);
getServletContext().getRequestDispatcher("/basic.jsp").forward(request, response);
}
}
Код страницы basic.jsp при этом не меняется.
Подобным образом можно передать данные в jsp через сессию:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("name", "Tom");
session.setAttribute("age", 34);
getServletContext().getRequestDispatcher("/basic.jsp").forward(request, response);
}
}