我有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被调用两次,因此第二次值丢失。请帮忙
答案 0 :(得分:1)
我相信你会混淆/误解一些基本概念,特别是HTTP如何工作以及Ajax应该如何工作。
这里发生的是你正在有效地发出两个HTTP请求。一个按$.ajax()
,另一个按element.attr('src', url)
。每个请求都会导致创建和设置完全不同的bean实例。你完全忽略了$.ajax()
请求回调中的bean数据。我不确定HTML元素[id=content]
代表什么,但我猜它是<iframe>
。这不是完全正确的方式。
您最终应该有效地触发一个HTTP请求。基本上有两种解决方案:
忘记$.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做到。
忘记<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);