Передавать данные из Java Servlet в JSP?
Я был разработчиком PHP, но в последнее время мне нужно работать над некоторым проектом с помощью Google App Engine (Java). В PHP я могу сделать что-то вроде этого (в терминах модели MVC):
// controllers/accounts.php
$accounts = getAccounts();
include "../views/accounts.php";
// views/accounts.php
print_r($accounts);
Я рассматриваю некоторые демонстрации Google App Engine Java, используя Servlet и JSP. Что они делают, так это:
// In AccountsServlet.java
public class AccountsServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("accountid");
// do something
// REDIRECT to an JSP page, manually passing QUERYSTRING along.
resp.sendRedirect("/namedcounter.jsp?name=" + req.getParameter("name"));
}
}
В основном в случае Java это два разных HTTP-запроса (второй из которых автоматически принудительно), правильно? Поэтому в JSP файле я не могу использовать данные, вычисленные в Servlet.
Есть ли способ, которым я могу сделать это, похоже на способ PHP?
Ответы
Ответ 1
Вам нужно будет установить данные, полученные в сервлете в области запроса, чтобы данные были доступны в JSP
У вас будет следующая строка в ваших сервлетах.
List<Account> accounts = getAccounts();
request.setAttribute("accountList",accounts);
Затем в JSP вы можете получить доступ к этим данным, используя язык выражения, например ниже
${accountList}
Я бы использовал запросы отправки вместо sendRedirect
следующим образом
RequestDispatcher rd = sc.getRequestDispatcher(url);
rd.forward(req, res);
Если вы можете использовать RequestDispatcher
, вы можете сохранить эти значения в объекте request
или session
и перейти в другой JSP.
Есть ли какая-либо конкретная цель использования request.sendRedirect
?. Если не использовать RequestDispatcher
.
См. эту ссылку для более подробной информации.
public class AccountServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Account> accounts = getAccountListFromSomewhere();
String url="..."; //relative url for display jsp page
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher(url);
request.setAttribute("accountList", accounts );
rd.forward(request, response);
}
}
Ответ 2
То, что вы хотите сделать, это сначала определить объект для представления информации из getAccounts() - что-то вроде AccountBean.
Затем в ваших функциях doPost или doGet сервлета используйте информацию запроса для заполнения вашего объекта AccountBean.
Затем вы можете сохранить объект AccountBean в контексте запроса, сеанса или сервлета с помощью метода setAttribute и перенаправить запрос на страницу JSP.
Данные AccountBean на вашей странице jsp извлекаются с помощью тегов и тегов.
Здесь может быть пример вашего сервлета:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
// get data from request querystring
String accountId = req.getParameter("accountid");
// populate your object with it (you might want to check it not null)
AccountBean accountBean = new AccountBean(accountId);
// store data in session
HttpSession session = req.getSession();
session.setAttribute("accountBean", accountBean);
// forward the request (not redirect)
RequestDispatcher dispatcher = req.getRequestDispatcher("account.jsp");
dispatcher.forward(req, resp);
}
Затем на странице JSP будет отображаться следующая информация:
<jsp:useBean id="accountBean" type="myBeans.AccountBean" />
Your account is <jsp:getProperty name="accountBean" property="status" />
Ответ 3
Кроме того, что упоминалось выше об использовании выражения lang, вы также можете передавать атрибуты через сам запрос. В Servlet doGet() мы пишем что-то вроде:
Account[] accounts = AccountManager.getAccountList();
request.setAttribute("accountList", accounts );
RequestDispatcher rd = req.getRequestDispatcher(nextJSPurl);
rd.forward(req, resp);
В JSP мы можем получить атрибут из запроса:
<%
Account[] accounts= (Account[])request.getAttribute("accountList");
if (accounts.length>0) {
for (Account account: accounts) {
%>
<blockquote>account name: <%= account.getName() %></blockquote>
<%
}
}
%>
Ответ 4
import javax.servlet.http.*;
public class AccountsServlet extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response) {
try {
// Set the attribute and Forward to hello.jsp
request.setAttribute ("somename", "someValue"); // to save your temporary calculations.
getServletConfig().getServletContext().getRequestDispatcher("/namedcounter.jsp?name=" + req.getParameter("name")).forward(request, response);
} catch (Exception ex) {
ex.printStackTrace ();
}
}
}
В вышеприведенном коде сервлет не будет создавать 2 разных запроса. Он будет пересылать, а также сохранит все данные из первоначального запроса.
request.setAttribute ("somename", "someValue"); // to save your temporary calculations.
Ответ 5
Это мое понимание вашего вопроса - вы хотите перенаправить или отправить на новую страницу JSP вместе с данными, вычисленными в Servlet, правильно? Для этого вам нужно установить атрибуты запроса перед отправкой запроса.
Вы можете установить атрибуты с помощью объекта HttpServletRequest
(req.setAttribute("attribute name", "attribute value")
). Значение атрибута может быть любым объектом Java.
Вы можете получить значение req.getAttribute("attribute name")
. Вам также нужно будет ввести объект, когда пользователь получает функцию getAttribute().
Ответ 6
Вы можете установить данные внутри java beans и легко получить доступ к этим данным на странице jsp, когда управление переходит к jsp. установить дату в java beans, используя сеттеры, получить доступ к этим данным на страницу jsp, включив в нее bean в jsp.
<%@page contentType="text/html"%>
<jsp:useBean id="man" class="beans.Person"/>
<jsp:setProperty name="man" property="*"/>
First Name: <jsp:getProperty name="man" property="firstName"/>
например, вы можете получить доступ ко многим свойствам, которые может иметь класс bean.