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} |
我会使用请求调度而不是
1 2 | RequestDispatcher rd = sc.getRequestDispatcher(url); rd.forward(req, res); |
如果可以使用
是否有使用
有关详细信息,请参阅此链接。
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中计算的数据,对吧?为此,您需要在分派请求之前设置请求属性。
您可以使用
您可以通过
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类可以拥有的任何属性。