将bean数据从servlet传递给jsp的问题

时间:2011-07-19 07:19:19

标签: java ajax jsp servlets javabeans

我有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。由于它将原始值替换为null,因为MyPage.jsp被调用两次,因此第二次值丢失。请帮忙

1 个答案:

答案 0 :(得分:1)

我相信你会混淆/误解一些基本概念,特别是HTTP如何工作以及Ajax应该如何工作。

这里发生的是你正在有效地发出两个HTTP请求。一个按$.ajax(),另一个按element.attr('src', url)。每个请求都会导致创建和设置完全不同的bean实例。你完全忽略了$.ajax()请求回调中的bean数据。我不确定HTML元素[id=content]代表什么,但我猜它是<iframe>。这不是完全正确的方式。

您最终应该有效地触发一个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. 忘记<iframe>事物,并在没有JSP干预的情况下完全由Servlet / Ajax处理响应。您需要将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);
    
  3. 另见: