我正在尝试制作一个 Web 应用程序,该应用程序应该通过jQuery的功能从jsp页面调用servlet并在同一页面上发布结果。到目前为止,即使在网上搜索后,我也没有运气。作为一个菜鸟,我可能做错了什么,但我不知道是什么。$.post(...)
我设法将问题简化为以下MWE。我项目中的 servletTest
如下所示:
@WebServlet("/servlet")
public class Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String temp = request.getParameter("param");
request.setAttribute("result", temp);
RequestDispatcher view = request.getRequestDispatcher("/index.jsp");
view.forward(request, response);
}
}
如果我index.jsp
的情况如下,则 Web 应用程序按预期工作:
<%@ page language="java" import="java.util.*"
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Test page</title>
</head>
<body>
<p>Result: ${result}</p>
<form method="post" action="/Test/servlet">
<input name="param" value="value" />
<button type="submit">Send!</button>
</form>
</body>
</html>
如果我将我的 Web 应用程序部署到我的Tomcat 7.0.47容器中,事实上,我会得到一个带有 的页面Result:
、一个初始化为的输入字段value
和一个Send!
按钮。如果我按下按钮,servlet 会正确进入,/Test/servlet
然后页面会显示Result: value
. 但是,在我的项目中,我应该使用jQuery的函数$.post(...)
将参数发布到 servlet 并取回属性,因此我将其替换index.jsp
为以下代码:
<%@ page language="java" import="java.util.*"
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Test page</title>
<script type="text/javascript" src="js/jquery-2.0.3.min.js"></script>
<script type="text/javascript">
function send() {
var value = $('#field').val();
alert('Sending: ' + value);
$.post('/Test/servlet', {
param : value
}, function(result) {
alert('Done!');
}, 'html');
}
</script>
</head>
<body>
<p>Result: ${result}</p>
<form action="/">
<input id="field" value="value" />
<button type="button" onclick="send()">Send!</button>
</form>
</body>
</html>
这一次,如果我部署 Web 应用程序并按下按钮,我会看到两个消息窗口。第一个告诉Sending: value
(意味着jQuery 2.0.3已正确解析),第二个Done!
. 显然,页面没有更新以反映Result: value
。由于 servlet 没有更改,我怀疑 servlet 没有正确解析。所以我尝试/Test/servlet
用: /Test/servlet/
, Test/servlet/
, Test/servlet
, /servlet/
, /servlet
, servlet/
and替换servlet
,但没有成功。但是,我注意到我没有收到Done!
消息(例如我使用的她/servlet
或类似的消息)。
所以,总而言之,我做错了什么?你能解释一下背景中发生了什么以帮助我理解吗?提前致谢!
多亏了coding_idiot的帮助,我终于明白了为什么我的代码不起作用。我将在下面分享我的发现,希望他们也可以帮助其他人。
简单地说,上面描述的两种方法是不等价的,或者至少在这些方面是不等价的。实际上,第一种方法调用 servlet,该 servlet 生成一个替换初始页面的页面。相反,第二种方法调用生成一个页面的 servlet,该页面返回到不一定被替换的初始页面。正如coding_idiot所建议的,返回的数据必须被注入到某个地方让用户看到它。
这就是我重构上述代码以获得工作示例的方式。servlet 的代码保持不变,但该doPost(...)
方法的倒数第二行现在显示为:
RequestDispatcher view = request.getRequestDispatcher("/results.jsp");
然后,我将上面的页面分成两个不同的部分。第一个是index.jsp
当用户请求 Web 应用程序地址时由容器自动加载的:
<%@ page language="java" import="java.util.*"
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Test page</title>
<script type="text/javascript" src="js/jquery-2.0.3.min.js"></script>
<script type="text/javascript">
function send() {
$.post('/Test/servlet', {
param : $('#field').val()
}, function(result) {
$("#result").html(result);
}, 'html');
}
</script>
</head>
<body>
<form>
<input id="field" value="value" />
<button type="button" onclick="send()">Send!</button>
</form>
<div id="result">
<p>Result: --</p>
</div>
</body>
</html>
请注意,表单或多或少与以前相同,但现在有一个<div id="result">
包含result
. 另一个区别在于调用计算 asend()
的函数;然后在发送之后将其注入到上面!按钮被按下。正如我上面所展示的,servlet 将请求转发到一个响应中,它很简单:/Test/servlet
result
result
<div id="result">
results.jsp
<p>Result: ${result}</p>
现在,当用户按下Send!
按钮时,输入字段的值作为参数传递给 servlet,servlet 将参数转换为参数并将其转发到给定页面。当此页面被解释时,预期的消息 ( Result: value
) 被组合并返回到index.jsp
它包含在其中的位置,<div id="result">
并最终变得可见。
我想知道是否可以$.post(...)
在不<div id="result">
立即在<body>
. 提前感谢您提供任何满足这种好奇心的建议或想法。