如何使用不同的javax.servlet-api?

时间:2017-10-27 14:28:23

标签: java eclipse maven tomcat servlet-3.0

我正在尝试调试一些代码以确保我设置了一些HttpServletResponse  标题正确。为此,我只想打印出来自HttpServletRequest和HttpServletResponse的头文件。请求端工作正常,但响应没有,因为response.getHeaderNames()未定义。

    private void printDebug(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("----- Request ---------");
        Collections.list(request.getHeaderNames()).forEach(n -> System.out.println(n + ": " + request.getHeader(n.toString())));

        System.out.println("----- Response ---------");
        response.getHeaderNames().forEach(n -> System.out.println(n + ": " + response.getHeader(n)));
}

使用:
Eclipse Oxygen.1a版本(4.7.1a)
Tomcat v.7.0
jdk1.8.0_112

项目方面:
动态Web模块3.1

在我的pom文件中:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

但有些地方我确定有一个我缺少的配置,默认情况下我们将Eclipse指向2.5 javax.servlet-api,但我不知道在哪里查看或如何更改它。

更新:如果我取消选中“动态网络模块”,然后执行maven更新,maven会将动态网络模块设置回2.5 enter image description here

如何让这个getHeaderNames()起作用?

1 个答案:

答案 0 :(得分:1)

问题在于,当我编译javax.servlet-api v2.5时,即使我在我的pom中明确地包含3.1。

首先,正如@Oleg建议的那样,我打开了HttpServletResponse的声明并检查了包浏览器以找出HttpServletResponse的来源。它来自Maven Dependencies中的servlet-api-2.5.jar。这是我认为发生的事情,但不是我想要的。

接下来,我浏览了所有依赖关系层次结构,以找到包含2.5版本的pom中的哪个条目。我注意到jstl工件包含了我不想要的旧版本。

所以我改变了这个:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>

到此:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
  <exclusions>
     <exclusion>
        <groupId>java.servlet</groupId>
        <artifactId>servlet-api</artifactId> 
     </exclusion>
  </exclusions>
</dependency>

最后,我做了一个Maven更新和一个干净的编译,以确保它有效。

希望这有助于其他人!

谢谢@Oleg。