首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将数据从Java Servlet传递到JSP?

将数据从Java Servlet传递到JSP?
EN

Stack Overflow用户
提问于 2011-03-24 12:00:15
回答 6查看 75.4K关注 0票数 18

我一直是一个PHP开发人员,但最近需要使用谷歌应用程序引擎(Java)在一些项目上工作。在PHP中,我可以这样做(根据MVC模型):

代码语言:javascript
复制
// controllers/accounts.php
$accounts = getAccounts();
include "../views/accounts.php";

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

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

代码语言:javascript
复制
// 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的方法?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-03-24 12:09:50

您需要在request作用域中设置在servlet中检索的数据,以便这些数据在JSP中可用

您的servlet中将包含以下代码行。

代码语言:javascript
复制
List<Account> accounts = getAccounts();  
request.setAttribute("accountList",accounts);

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

代码语言:javascript
复制
${accountList}

我将使用请求分派而不是sendRedirect,如下所示

代码语言:javascript
复制
  RequestDispatcher rd = sc.getRequestDispatcher(url);
  rd.forward(req, res);

如果可以使用RequestDispatcher,那么就可以将这些值存储在requestsession对象中,然后再存储到其他JSP中。

使用request.sendRedirect有什么特别的目的吗?如果不是,则使用RequestDispatcher

See this link for more details

代码语言:javascript
复制
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);
  }
}
票数 31
EN

Stack Overflow用户

发布于 2011-03-24 12:29:29

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

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

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

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

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

代码语言:javascript
复制
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页面将包含以下内容来显示帐户信息:

代码语言:javascript
复制
<jsp:useBean id="accountBean" type="myBeans.AccountBean" />
Your account is <jsp:getProperty name="accountBean" property="status" />
票数 8
EN

Stack Overflow用户

发布于 2011-05-11 05:53:20

除了上面提到的使用表达式语言之外,你也可以通过请求本身来传递属性。在Servlet的doGet()中,我们编写如下代码:

代码语言:javascript
复制
Account[] accounts = AccountManager.getAccountList();
request.setAttribute("accountList", accounts );
RequestDispatcher rd = req.getRequestDispatcher(nextJSPurl);
rd.forward(req, resp);

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

代码语言:javascript
复制
 <%
    Account[] accounts= (Account[])request.getAttribute("accountList");

       if (accounts.length>0) {       
       for (Account account: accounts) {            
                %>
                <blockquote>account name: <%= account.getName() %></blockquote>
                <%
            }
        }
 %>
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5414600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档