【问题标题】:POSTing data to a servlet 3.0 with jQuery 2.0.3使用 jQuery 2.0.3 将数据发布到 servlet 3.0
【发布时间】:2013-11-22 07:06:55
【问题描述】:

由于 jQuery 的功能,我正在尝试制作一个应该从 jsp 页面调用 servlet 的 Web 应用程序$.post(...) 并在同一页面上发布结果。 到目前为止,即使在网上搜索后,我也没有运气。 作为一个菜鸟,我可能做错了什么,但我不知道是什么。

我设法将问题简化为以下MWE。 我的Test 项目中的 servlet 如下所示:

@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 如下所示,则网络应用按预期工作:

<%@ 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/servlet//servletservlet/servlet 替换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>

请注意,表单或多或少与以前相同,但现在有一个&lt;div id="result"&gt;,其中包含result 的默认值。 另一个区别在于函数send(),其中调用/Test/servlet 来计算result;然后在按下 Send! 按钮后,这个result 被注入到上面的&lt;div id="result"&gt; 中。 如上所示,servlet 将请求转发到results.jsp 的响应中,这很简单:

<p>Result: ${result}</p>

现在,当用户按下Send! 按钮时,输入字段的值作为参数传递给servlet,servlet 将参数转换为参数并将其转发到给定页面。 当此页面被解释时,预期的消息 (Result: value) 被组合并返回到 index.jsp,它被包含在 &lt;div id="result"&gt; 中并最终变得可见。

我想知道是否有可能使$.post(...) 完全像第一种方法一样工作,而无需立即在&lt;body&gt; 内声明&lt;div id="result"&gt;。 提前感谢您提供任何建议或想法来满足这种好奇心。

【问题讨论】:

    标签: javascript jquery jsp servlets post


    【解决方案1】:

    函数(结果){ alert('完成!'); },

    返回的结果(响应)未被使用,因此您看不到结果。你可以这样做:

    1. 在你的 html 中添加一个带有一些 id 的标签
    2. 将来自服务器的响应放入该标记中。

    例如

    <div id="result"></div>
    

    把javascript改成

     function(result) {
         $("#result").html(result);
             },
    

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 2014-07-31
      • 2011-12-25
      • 2013-10-21
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2012-03-25
      相关资源
      最近更新 更多