将数据从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); 

我使用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的方式吗?

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

你将在你的servlets中有下列行。

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

然后在JSP中,您可以使用下面的expression式语言来访问这些数据

 ${accountList} 

我将使用请求派发,而不是sendRedirect如下

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

如果您可以使用RequestDispatcher则可以将这些值存储在requestsession对象中并获取到其他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); } } 

你想要做的是首先定义一个对象来代表来自getAccounts()的信息 – 像AccountBean。

然后在你的servlet的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" /> 

除了上面提到的有关使用expression式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> <% } } %> 
 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不会创build2个不同的请求。 它会转发,也将保留原始请求中的所有数据。

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

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

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

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

您可以在java bean中设置数据,并在控制转到jsp时轻松地将这些数据存取到jsp页面。 使用setter在java bean中设置date通过将这些bean包含到jsp中,将这些数据存取到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类可以拥有的许多属性。