【问题标题】:Get parameter sent via jquery ajax in Java Servlet [duplicate]获取通过Java Servlet中的jquery ajax发送的参数[重复]
【发布时间】:2013-10-22 20:26:07
【问题描述】:

我在网络上搜索此主题,但找不到有效的示例。 我会很高兴有人可以帮助我。

这是我测试的。

 $.ajax({
    url: 'GetJson',
    type: 'POST',        
    dataType: 'json',
    contentType: 'application/json',

    data: {id: 'idTest'},
    success: function(data) {
        console.log(data);
    }
});

在 Sevlet 中

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    String id = request.getParameter("id");
    String id2[] = request.getParameterValues("id");        
    String id3 = request.getHeader("id");

}

我的一切都是空的。

【问题讨论】:

  • 那个问题讲的是如何从servlet获取参数到网页,但没有相反的。

标签: java jquery ajax json servlets


【解决方案1】:

getParameter("foo") 在 servlet 中返回 null 时遇到了同样的问题。找到了一个简单的解决方案,可能对这里的人有用。使用默认值

contentType='application/x-www-form-urlencoded; charset=UTF-8'

或将其排除在外。这将使用参数中的数据自动对请求进行编码。

希望这会有所帮助...

【讨论】:

    【解决方案2】:

    排序答案是这个数据隐藏在请求InputStream中。

    以下 servlet 是如何使用它的演示(我在 JBoss 7.1.1 上运行它):

    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet(name="fooServlet", urlPatterns="/foo")
    public class FooServlet extends HttpServlet
    {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            InputStream is = req.getInputStream();
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            byte[] buf = new byte[32];
            int r=0;
            while( r >= 0 ) {
                r = is.read(buf);
                if( r >= 0 ) os.write(buf, 0, r);
            }
            String s = new String(os.toByteArray(), "UTF-8");
            String decoded = URLDecoder.decode(s, "UTF-8");
            System.err.println(">>>>>>>>>>>>> DECODED: " + decoded);
    
            System.err.println("================================");
    
            Enumeration<String> e = req.getParameterNames();
            while( e.hasMoreElements() ) {
                String ss = (String) e.nextElement();
                System.err.println("    >>>>>>>>> " + ss);
            }
    
            System.err.println("================================");
    
            Map<String,String> map = makeQueryMap(s);
            System.err.println(map);
            //////////////////////////////////////////////////////////////////
            //// HERE YOU CAN DO map.get("id") AND THE SENT VALUE WILL BE ////
            //// RETURNED AS EXPECTED WITH request.getParameter("id")     ////
            //////////////////////////////////////////////////////////////////
    
            System.err.println("================================");
    
            resp.setContentType("application/json; charset=UTF-8");
            resp.getWriter().println("{'result':true}");
        }
    
        // Based on code from: http://www.coderanch.com/t/383310/java/java/parse-url-query-string-parameter
        private static Map<String, String> makeQueryMap(String query) throws UnsupportedEncodingException {
            String[] params = query.split("&");
            Map<String, String> map = new HashMap<String, String>();
            for( String param : params ) {
                String[] split = param.split("=");
                map.put(URLDecoder.decode(split[0], "UTF-8"), URLDecoder.decode(split[1], "UTF-8"));
            }
            return map;
        }
    }
    

    随着请求:

    $.post("foo",{id:5,name:"Nikos",address:{city:"Athens"}})
    

    输出是:

    >>>>>>>>>>>>> DECODED: id=5&name=Nikos&address[city]=Athens
    ================================
    ================================
    {address[city]=Athens, id=5, name=Nikos}
    ================================
    

    (注意:req.getParameterNames() 不起作用。打印在第 4 行的地图包含使用 request.getParameter() 通常可访问的所有数据。还要注意嵌套对象表示法,{address:{city:"Athens"}}address[city]=Athens


    与您的问题略有无关,但为了完整起见:

    如果你想使用服务器端的 JSON 解析器,你应该使用JSON.stringify 来处理数据:

    $.post("foo",JSON.stringify({id:5,name:"Nikos",address:{city:"Athens"}}))
    

    在我看来,将 JSON 与服务器通信的最佳方式是使用 JAX-RS(或 Spring 等价物)。它在现代服务器上非常简单,可以解决这些问题。

    【讨论】:

    • 谢谢。有了这个我可以做我需要的。
    • gae 使用 $.ajax 和你使用 $.post 有什么区别?
    • 示例语法更简洁。
    • 哦,好的,感谢您的澄清!
    • 糟糕的建议。用户只是在 jQuery 中做错了。该问题应该在 jQuery 端解决,而不是在 Servlet 端workarounded。 OP 应该只是将数据作为具有键值对的真实 JSON 对象发送,而不是作为 JSON 格式的字符串发送。设置正确的内容类型(默认设置)后,jQuery 将自动处理它,这样 request.getParameterXxx() 将透明地继续工作。
    猜你喜欢
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2021-11-11
    • 2019-10-25
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多