Java 将bean数据从servlet传递到jsp时出现问题

Java 将bean数据从servlet传递到jsp时出现问题,java,ajax,jsp,servlets,javabeans,Java,Ajax,Jsp,Servlets,Javabeans,我有两个jsp页面,一个叫做MyPage.jsp,另一个叫做View.jsp。jsp具有树结构。jsp有一些称为number和design的文本字段,需要通过servlet通过bean填充这些字段。单击View.jsp中的任何树节点时,MyPage.jsp都应该使用设置的文本字段值进行呈现。现在发生的事情是因为MyPage.jsp被调用了两次,即一次在View.jsp中(在ajax函数中),第二次在servlet中的请求调度器中,因此servlet中设置的bean值丢失。请建议一种更好的方法,以

我有两个jsp页面,一个叫做MyPage.jsp,另一个叫做View.jsp。jsp具有树结构。jsp有一些称为number和design的文本字段,需要通过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
第二个为空值。因为调用MyPage.jsp两次就用null替换了原始值,所以第二次的值丢失了。请帮助

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

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

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

  • 忘记
    $.ajax()
    ,通过
    元素.attr('src',url)
    发送请求

    $(“[id=content]”)attr(“src”,“/testportlet/MyPage.jsp?number=“+encodeURIComponent(node.data.title));
    
    您还可以将URL更改为servlet URL,这样您就有了更多的预处理控制,并最终使用
    RequestDispatcher#forward()
    而不是
    include()
    。不要将HTML写入servlet中的响应。让JSP来做吧

  • 忘记
    这件事,完全通过Servlet/Ajax处理响应,而不需要JSP的干预。您需要将bean转换为其他数据格式,这些格式很容易被JavaScript/jQuery解析。我建议对此使用JSON

    $.get(AJAX_SERVLET,{“number”:node.data.title},函数(响应){
    $(“#编号”).text(response.number);
    $(“#设计”).text(response.design);
    });
    
    以HTML为例

    
    
    在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);
    
  • 另见:

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