排序答案是此数据隐藏在请求中
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.URLDeprer;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 depred = URLDeprer.depre(s, "UTF-8"); System.err.println(">>>>>>>>>>>>> DECODED: " + depred); 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 pre from: http://www.preranch.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(URLDeprer.depre(split[0], "UTF-8"), URLDeprer.depre(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)。它在现代服务器上非常简单,可以解决这些问题。



