Java servlet无法获得POST参数

时间:2013-12-24 13:11:41

标签: java servlets http-post html-form-post

我正在尝试创建一个简单的登录屏幕,其中包含电子邮件字段,密码字段和登录按钮(所有三个都包含在<form/>内)。当用户提交表单时,客户端执行AJAX POST(异步,以便用户不必“遭受”页面重新加载!)到servlet。现在,servlet只进行虚拟检查,如果用户成功登录则返回“1”,如果电子邮件/密码错误则返回“0”。然后客户端处理响应(同样,将为0或1)。

这是怎么回事:当我提交表单时,servlet会收到HTTP POST请求,但是电子邮件/密码字段显示为NULL:

public class SigninService extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter writer = null;
        try {
            writer = response.getWriter();
            JSONSerializer serializer = new JSONSerializer();

            System.out.println("\tFetching POST data...");
            String email = request.getParameter("email");
            System.out.println("\tEmail is " + email + "...");
            String password = request.getParameter("password");
            System.out.println("\tPassword is " + password + "...");

            Integer answer = null;
            // Dummy check; will replace with actual code once I get this example working...
            if("testing@example.com".equals(email) && "12345".equals(password))
                answer = 1;
            else
                answer = 0;

            System.out.println("\tSerializing the HTTP response...");
            String json = serializer.deepSerialize(answer);

            System.out.println("\tSending response back to client...");
            writer.write(json);
        } catch (Throwable throwable) {
            System.err.println(throwable.getMessage());
            throwable.printStackTrace();
        } finally {
            writer.close();
        }
    }
}

以上代码打印了电子邮件/密码的null值。我阅读了几篇关于从HttpServletRequest(尤其是this文章以及this文章)中提取POST数据的文章,但这些文章似乎都没有帮助我。两者似乎都建议使用request.getReader()方法,但这不是我需要的方法。我需要一种方法来直接访问表单变量及其各自的值。

我无法判断我的客户端代码是否错误地格式化POST请求并以Java servlet无法处理的方式发送表单数据,或者Java servlet未正确编码以处理请求。

当我运行Firebug并提交表单时,以下是与请求相关联的Post标签的内容:

-----------------------------18671963685702-some-really-long-number
Content-Disposition: form-data; name="email"

testing@example.com
-----------------------------18671963685702-another-really-long-number
Content-Disposition: form-data; name="password"

12345
-----------------------------18671963685702-and-another-really-long-number--

对于未经训练的人来说,这个看起来就像客户端正在发送一个非NULL email变量,以及一个非NULL password变量,但是,我在这里不熟悉......

底线

我需要先弄清楚这是客户端还是服务器端的错误。这个问题试图将其诊断为服务器端错误,或者将其排除在外。那么,任何战斗厌倦的servlet老手都会看到HTTP请求或处理它的servlet代码有什么不对吗?如果这是一个服务器错误,我需要更改什么来访问我的表单变量?

1 个答案:

答案 0 :(得分:1)

当您通过ajax提交表单时,您是否以JSON格式发送数据? 如果您是,那么您应该从userId和password框中显式获取jquery或js文件中的数据,然后以JSON格式将其发送到服务器。这样可以解决问题。