【问题标题】:problem with passing bean data from servlet to jsp将bean数据从servlet传递到jsp的问题
【发布时间】:2011-10-08 06:47:52
【问题描述】:

我有 2 个 jsp 页面,一个称为 MyPage.jsp,另一个称为 View.jsp。 View.jsp 具有树结构。 MyPage.jsp 有一些称为数字和设计的文本字段,需要通过 servlet 通过 bean 填充。单击 View.jsp 中的任何树节点时,MyPage.jsp 应该使用文本字段值集呈现。现在发生的事情是因为 MyPage.jsp 被调用了两次,即一次在 View.jsp(在 ajax 函数中),第二次在 servlet 的请求调度程序中,因此在 servlet 中设置的 bean 值丢失了。请提出一种更好的方法,以便在整个过程中保留值,并且在单击树节点 MyPagejsp 时会使用设置的字段值呈现。

responseBean.setNumber("220");
responseBean.setDesign("xyz");
response.setContentType("text/html");                        
response.setCharacterEncoding("UTF-8");
request.setAttribute("responseBean", responseBean);
RequestDispatcher requestDispatcher = getServletContext().getRequestDispatcher("/MyPage.jsp");
requestDispatcher.include(request, response);
response.getWriter().write("Success");

使用 bean 值集调用 MyPage.jsp 的 jsp 页面具有以下代码

View.jsp

$.ajax({
 url : AJAX_SERVLET,
type: "GET",
data: "Number="+node.data.title,
success : function(output) {                                
$("[id=content]").attr("src", '/Test-portlet/MyPage.jsp');
}
});
}

MyPage.jsp

<jsp:useBean id="responseBean" class="com.web.bean.ResponseBean" scope="request">

<jsp:setProperty name="responseBean" property="*"/>

</jsp:useBean>
<body>
<%System.out.println("Values"+responseBean.getNumber()); %>
</body>

在上面的 MyPage.jsp 代码中,System.out.println 打印了两次值;曾经作为 价值观 202 第二个作为值空。因为它用 null 替换原始值只是因为 MyPage.jsp 被调用了两次,所以第二次值丢失了。请帮忙

【问题讨论】:

  • 功能需求远未明确。请编辑和改进/详细说明。
  • @BalusC 请查看我编辑的问题。我希望我现在清楚了。
  • 您的观点已被理解,但您的System.out.println() 示例很糟糕,因为它永远不会找到并打印由servlet 或jsp:useBean 设置为请求属性的bean。它只会导致NullPointerException

标签: java ajax jsp servlets javabeans


【解决方案1】:

我相信您混淆/误解了一些基本概念,尤其是 HTTP 的工作方式以及 Ajax 的工作方式。

这里发生的情况是您有效地触发了两个 HTTP 请求。一个来自$.ajax(),另一个来自element.attr('src', url)。每个请求都会导致创建和设置一个完全不同的 bean 实例。您完全忽略了 $.ajax() 请求回调中的 bean 数据。我不确定[id=content] 代表什么HTML 元素,但我猜它是&lt;iframe&gt;。这并不完全正确。

您最终应该会有效地触发一个 HTTP 请求。基本上有两种解决方案:

  1. 忘记$.ajax() 并通过element.attr('src', url) 发送请求。

    $("[id=content]").attr("src", "/Test-portlet/MyPage.jsp?number=" + encodeURIComponent(node.data.title));
    

    您还可以将 URL 更改为 servlet,以便您有更多的预处理控制,最后使用 RequestDispatcher#forward() 而不是 include()。不要将 HTML 写入 servlet 中的响应。让 JSP 来做吧。

  2. 忘记&lt;iframe&gt;这个东西,完全由Servlet/Ajax处理响应,无需JSP的干预。您需要将 bean 转换为其他数据格式,以便通过 JavaScript/jQuery 轻松解析。我建议为此使用 JSON。

    $.get(AJAX_SERVLET, { "number": node.data.title }, function(response) {
        $("#number").text(response.number);
        $("#design").text(response.design);
    });
    

    以 HTML 为例

    <div id="number"></div>
    <div id="design"></div>
    

    在 servlet 中

    // ... (create ResponseBean the way as you want)
    String json = new Gson().toJson(responseBean);
    
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(json);
    

另见:

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 2017-09-27
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多