当传递一个值时,HttpServlet的getParameter("param")返回null

3

我发现一个奇怪的问题,当我在URL中看到其他参数被传递时,request.getParameter("pg")返回null。除了这个参数外,所有其他参数都被正确打印出来。可能出了什么问题?

Map<String,String[]> paramMap = (Map<String,String[]>)request.getParameterMap();
        for (Map.Entry<String, String[]> paramPair : paramMap.entrySet()) {
            LOGGER.info("key - " + paramPair.getKey() + " value =" + paramPair.getValue()[0]);
        }

示例 URL -

http://myserver?searchfor=History+of+Photography&cb=XQ&n=77de88ca&ptnrS=XQyyyyyyYYus&qid=812753692c6536fb529f5ca7ac5aca9b&action=pick&ss=sub&pn=1&st=hp&ptb=447E5AED-F162-40B4-9EE5-A81299D0223D&plp=1&pg=PRshop&redirect=mPWsrdz9heamc8iHEhldEeSc%2FVOw6SzSGaNI5V3YDA%2F2aJhytHNs8w96Bn6LLIZVUIhPwV62vOCzTXhqJvTnW5g66rsz%2FnxYxdLMAYgDRrDL0jeKlXJQ1pFUFFVXHSrvxvGE971vUn5%2F0m7v9vrFJGEoo6nckfQS9o9CGCHUWndDqD0rhA8TW%2Bfa%2Fpxz8JafQQ3ID%2Fsw6GdCvt65%2FomhgEvEX4xv%2B8XQkfNLNvl6%2BpZdZJshoyUfDw5LZBwzFpw52x0Em9ZDVu1sHm4WxLPt9rDUBHj5Wn0eVf5HNoVYGyCa%2FfufPwfQy8OYiLdgvskMPxUTd3YQOJiiO%2F%2ByMdF4Ew%3D%3D&hlc=YWotbWVnYXx4cS1ocA..&pr=PR&ct=GG&tpr=sbt&tp=top

请展示给我们代码。 - Jonathan M
如果您添加导致问题的代码片段以及您正在发送请求的URL,将会更有帮助。 - Kal
请展示发起 HTTP 请求的代码。 - Jonathan M
这是一个多值参数吗?我自己也遇到了这个问题,解决方法是使用 request.getParameterValues(paramName) 方法。 - Mike G
不是多元值 - Shamik
1个回答

4
根据 Java EE 6 API 对于ServletRequest的说明,如果参数不存在,getParameter(String)将返回null。 如果您得到了null,则该参数不存在。
另外,您提供的URL示例并未展示此错误。
以下是我用来测试的代码:

public final class BlueServlet extends HttpServlet
{
    private static final long serialVersionUID = 6055351295950796407L;

    private static final Logger logger = LoggerFactory.getLogger(BlueServlet.class);

    @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
    {
        PrintWriter responseWriter;
        @SuppressWarnings("unchecked")
        Map<String, String[]> parameterMap = request.getParameterMap();

        if ((parameterMap != null) && !parameterMap.isEmpty())
        {
            Map.Entry<String, String[]> entry;
            int index;
            Iterator<Map.Entry<String, String[]>> iterator = parameterMap.entrySet().iterator();
            StrBuilder valueBuffer = new StrBuilder();
            String[] values;

            while (iterator.hasNext())
            {
                entry = iterator.next();
                values = entry.getValue();

                valueBuffer.setLength(0);

                if (values != null)
                {
                    for (index = 0; index < values.length; ++index)
                    {
                        valueBuffer.appendSeparator(", ");
                        valueBuffer.append(values[index]);
                    }
                }
                else
                {
                    valueBuffer.append("[none]");
                }

                logger.info("Key: {}; Value(s): {}", entry.getKey(), valueBuffer);
            }
        }
        else
        {
            logger.info("parameterMap is empty.");
        }

        responseWriter = response.getWriter();
        responseWriter.println("<html><head><title>Blue</title></head><body>");
        responseWriter.println("<h1>Blue</h1></body>");
    }

感谢您关注此事。我知道这没有意义,如果我没有亲眼看到它,我也不会相信。我仍然看到request.getParameter("pg")返回null,但request.getQueryString()返回整个字符串,包括pg参数值。我正在使用JDK 5和Tomcat版本5.5.12。 - Shamik
@Shamik 你是否会遍历参数映射(例如用于日志记录),并使用迭代器删除? - Igor Čordaš
@Shamik,我也遇到了类似的问题,能否请您评论一下,您的问题的根本原因是什么? - Sudhir N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接