5

我想遍历一个包含 java servlet 中所有头文件名称的枚举。我的代码如下:

public class ServletParameterServlet extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        ServletConfig c = this.getServletConfig();
        PrintWriter writer = response.getWriter();

        writer.append("database: ").append(c.getInitParameter("database"))
              .append(", server: ").append(c.getInitParameter("server"));

       Enumeration<String> headerNames = ((HttpServletRequest) c).getHeaderNames();


    }
}

这是正确的语法吗?在 Java 中如何实际迭代枚举值?特别是在这种情况下?

谢谢你的帮助,马克

4

3 回答 3

10

这只是像普通 Java 一样的迭代:

for (Enumeration<?> e = request.getHeaderNames(); e.hasMoreElements();) {
    String nextHeaderName = (String) e.nextElement();
    String headerValue = request.getHeader(nextHeaderName);
}

请注意,对于某些设置,这有点危险,因为 HTTP 标头可能会被复制。在这种情况下,headerValue将只是第一个具有该名称的 HTTP 标头。用于getHeaders获取所有这些。

并扔掉 Eclipse 的任何建议——它是垃圾。

于 2017-09-18T20:46:10.393 回答
1

您可以List使用以下方法将其转换为:

public static <T> List<T> enumerationToList(final Enumeration<T> enumeration) {
    if (enumeration == null) {
        return new ArrayList<>();
    }
    return Collections.list(enumeration);
}

用法:

final List<String> headerNames = enumerationToList(request.getHeaderNames());

for (final String headerName : headerNames) {
    System.out.println(headerName);
}
于 2020-02-21T03:21:20.713 回答
1

我们可以使用 forEachRemaining

    Enumeration<String> headerNames = request.getHeaderNames();
    headerNames.asIterator().forEachRemaining(header -> {
         System.out.println("Header Name:" + header + "   " + "Header Value:" + request.getHeader(header));
    });
于 2019-12-06T15:26:05.163 回答