关于谷歌应用引擎:将数据从Java Servlet传递到JSP?

Pass data from Java Servlet to JSP?

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
// controllers/accounts.php
$accounts = getAccounts();
include"../views/accounts.php";

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

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

1
2
3
4
5
6
7
8
9
10
11
// 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的方式?


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

您将在servlet中拥有以下行。

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

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

1
${accountList}

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

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

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

是否有使用request.sendRedirect的特定目的?如果不使用RequestDispatcher

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
  }
}


您要做的是首先定义一个对象来表示来自getAccounts()的信息 - 类似于AccountBean。

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

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

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

这可能是您的servlet的一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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页面将显示以下内容以显示帐户信息:

1
2
<jsp:useBean id="accountBean" type="myBeans.AccountBean" />
Your account is <jsp:getProperty name="accountBean" property="status" />


除了上面提到的关于使用表达式lang的内容之外,您还可以通过请求本身传递属性。在Servlet的doGet()中,我们写了类似的东西:

1
2
3
4
Account[] accounts = AccountManager.getAccountList();
request.setAttribute("accountList", accounts );
RequestDispatcher rd = req.getRequestDispatcher(nextJSPurl);
rd.forward(req, resp);

在JSP中,我们可以从请求中检索属性:

1
2
3
4
5
6
7
8
9
10
11
 <%
    Account[] accounts= (Account[])request.getAttribute("accountList");

       if (accounts.length>0) {      
       for (Account account: accounts) {            
                %>
                <blockquote>account name: <%= account.getName() %></blockquote>
                <%
            }
        }
 %>

这是我对你的问题的理解 - 你想要重定向或调度到一个新的JSP页面以及在Servlet中计算的数据,对吧?为此,您需要在分派请求之前设置请求属性。

您可以使用HttpServletRequest对象(req.setAttribute("attribute name","attribute value"))设置属性。属性值可以是任何Java对象。

您可以通过req.getAttribute("attribute name")检索值。您还需要在用户getAttribute()函数时键入强制转换对象。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 ();
        }
    }

}

在上面的代码中,servlet不会创建2个不同的请求。它将转发,也将保留原始请求的所有数据。

1
request.setAttribute ("somename","someValue"); // to save your temporary calculations.

您可以在java bean中设置数据,并在控制转到jsp时轻松地将该数据访问到jsp页面。使用setter在java bean中设置日期通过将该bean包含到jsp中来访问这些数据到jsp页面。

1
2
3
4
<%@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类可以拥有的任何属性。