将数据从 Java Servlet 传递到 JSP?

2022-09-02 19:31:28

我一直是PHP开发人员,但最近需要使用Google App Engine(Java)进行一些项目。在PHP中,我可以做这样的事情(就MVC模型而言):

// controllers/accounts.php
$accounts = getAccounts();
include "../views/accounts.php";

// views/accounts.php
print_r($accounts);

我看了一些使用Servlet和JSP的Google App Engine Java演示。他们正在做的是这样的:

// 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的情况下,它是2个不同的HTTP请求(第二个是自动强制的),对吧?因此,在JSP文件中,我无法使用Servlet中计算的数据。

有没有办法像PHP一样做到这一点?


答案 1

您需要在请求范围内设置在 servlet 中检索到的数据,以便数据在 JSP 中可用

您将在 servlet 中包含以下行。

List<Account> accounts = getAccounts();  
request.setAttribute("accountList",accounts);

然后在JSP中,您可以使用如下所示的表达式语言访问此数据

${accountList}

我会使用请求调度而不是如下所示sendRedirect

  RequestDispatcher rd = sc.getRequestDispatcher(url);
  rd.forward(req, res);

如果可以使用,则可以将这些值存储在或对象中,并获取其他 JSP。RequestDispatcherrequestsession

使用有什么具体目的吗?如果不使用 .request.sendRedirectRequestDispatcher

有关更多详细信息,请参阅此链接

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。

然后在您的 servlets doPost 或 doGet 函数中,使用请求信息来填充您的 AccountBean 对象。

然后,您可以使用 setAttribute 方法将 AccountBean 对象存储在请求、会话或 servlet 上下文中,并将请求转发到 JSP 页。

jsp 页面中的 AccountBean 数据是使用 和 标记提取的。

下面可能是您的 servlet 的一个示例:

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's 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" />

推荐