Подтвердить что ты не робот

Передавать данные из 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?

4b9b3361

Ответ 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.