2012-04-15 75 views
0

我送使用jQuery的POST請求:不能傳遞參數通過jQuery POST到Servlet的

$.post(
'test', 
{ foo: 'bar'} 
); 

而且我有處理這一個簡單的servlet:

@WebServlet("/test") 
public class TestServlet extends HttpServlet { 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
     Map<String, String[]> parameterMap = req.getParameterMap(); 
    } 

} 

但requestMap在servlet中結果是空的。我究竟做錯了什麼?

編輯: 忘了提及我從JSF Facelet頁面調用此腳本。不要問我爲什麼要麻煩手動發佈Ajax請求,以及爲什麼我使用servlet來處理它們。說來話長。我知道這不是JSF的方式。

@BalusC的答案後,我嘗試添加一個Servlet過濾器是這樣的:

@WebFilter(urlPatterns="/test") 
public class TestFilter implements Filter { 
    @Override 
    public void destroy() { } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
     Map<String, String[]> parameterMap = request.getParameterMap(); 
     chain.doFilter(request, response); 
    } 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { } 
} 

和它的工作!不僅我能夠獲取過濾器中的參數,還可以在servlet中訪問這些參數!那麼,有人能解釋我這是什麼魔法嗎?

+0

你用'螢火蟲'看到了什麼? – gdoron 2012-04-15 11:57:07

+0

我看到它實際上正在發送POST請求。同時,我在Eclipse中設置了斷點,並且我確實瞭解了這個請求,但是沒有任何參數......我使用Chrome開發人員工具,並且它顯示請求實際上已經發布了所有必需的參數。 – jFrenetic 2012-04-15 12:00:32

回答

0

如果請求 - 響應鏈中的某些代碼事先調用了request.getReader()request.getInputStream(),則參數圖將爲空。 HTTP請求體只能被讀取和解析一次(客戶端不會根據服務器需求多次重新發送)。檢查你的所有過濾器。

+0

我沒有自定義過濾器。我使用訪問令牌從Facebook獲得響應,並且在頁面加載時執行此腳本以將其傳遞給Servlet。但請注意:該腳本是從JSF Facelet調用的。 – jFrenetic 2012-04-15 13:17:39

+0

另請參閱編輯。 – jFrenetic 2012-04-15 14:28:01

+0

如果在* getParameter(),getParameterMap()等之前調用getReader()或getInputStream(),則參數將保持爲null。反過來說,如果你在getReader()或getInputStream()之前調用'getParameter()'等,*,那麼它們將返回EOF。調試你的代碼來檢查你是不是直接調用它們中的任何一個。這就是我根據症狀所能判斷的。 – BalusC 2012-04-15 22:52:54