如何使用不同的javax.servlet-api?
How to use a different javax.servlet-api?
我正在尝试调试一些代码以确保我正在设置一些 HttpServletResponse
headers 正确。为此,我只想从 HttpServletRequest 和 HttpServletResponse 打印出 headers。请求端工作正常,但响应没有,因为 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
项目方面:
动态网络模块 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,但我只是不知道在哪里查看或如何更改它。
更新: 如果我取消选中 "Dynamic Web Module" 然后执行 maven 更新,maven 会将动态 Web 模块设置回 2.5
如何让这个 getHeaderNames() 起作用?
问题是,当我编译 javax.servlet-api v2.5 时,即使我在我的 pom 中明确包含 3.1,也正在使用。
首先,按照@Oleg 的建议,我打开了 HttpServletResponse 的声明并检查了包资源管理器以找出 HttpServletResponse 的来源。它来自 Maven 依赖项中的 servlet-api-2.5.jar。这是我认为正在发生但不是我想要的。
接下来,我检查了所有的依赖层次结构,以查找 pom 中的哪个条目包含 2.5 版本。我注意到 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。
我正在尝试调试一些代码以确保我正在设置一些 HttpServletResponse headers 正确。为此,我只想从 HttpServletRequest 和 HttpServletResponse 打印出 headers。请求端工作正常,但响应没有,因为 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
项目方面:
动态网络模块 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,但我只是不知道在哪里查看或如何更改它。
更新: 如果我取消选中 "Dynamic Web Module" 然后执行 maven 更新,maven 会将动态 Web 模块设置回 2.5
如何让这个 getHeaderNames() 起作用?
问题是,当我编译 javax.servlet-api v2.5 时,即使我在我的 pom 中明确包含 3.1,也正在使用。
首先,按照@Oleg 的建议,我打开了 HttpServletResponse 的声明并检查了包资源管理器以找出 HttpServletResponse 的来源。它来自 Maven 依赖项中的 servlet-api-2.5.jar。这是我认为正在发生但不是我想要的。
接下来,我检查了所有的依赖层次结构,以查找 pom 中的哪个条目包含 2.5 版本。我注意到 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。