未找到 request.getServletContext(),即使使用新 JAR
Posted
技术标签:
【中文标题】未找到 request.getServletContext(),即使使用新 JAR【英文标题】:request.getServletContext() not found, even with new JAR 【发布时间】:2011-12-13 05:33:16 【问题描述】:我的编译器找不到 HttpServletRequest getServletContext() 方法。
我没有做太复杂的事情:
public static void setMySortedSet(HttpServletRequest request, SortedSet<String> set)
setMySortedSet(request.getServletContext(), set);
我尝试过的一些故障排除:
发现该方法是在 2.3 中创建的,因此我包含了一个反映该方法的 JAR(并将其包含在我的 Eclipse 构建路径中) 我将 JAR 包含在我的 build.xml 类路径中。当我使用 Eclipse 时,找到了该方法,但是当我尝试构建类时,我看到了这个:
compile:
[javac] Compiling 1 source files to C:\...\workspace\proj\build\WEB-INF\classes
[javac] C:\...\workspace\proj\src\main\Helper.java:26: cannot find symbol
[javac] symbol : method getServletContext()
[javac] location: interface javax.servlet.http.HttpServletRequest
[javac] return getURISet(request.getServletContext());
[javac] ^
[javac] Note: C:\...\workspace\proj\src\main\Helper.java uses unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.
[javac] 1 error
对我可能遗漏的内容有任何想法吗?我很感激任何回应。
【问题讨论】:
【参考方案1】:getServletContext()
方法是在 Servlet 3.0 中引入的,而不是 2.3。但是,如果您想获得ServletContext
,那么另一种获得它的方法是:
ServletContext context = request.getSession().getServletContext();
if (username != "" & username != null )
context.setAttribute("savedUserName", username);
writer.println("Context Parameter : " + (String)context.getAttribute("savedUserName"));
这样你就可以在不同的浏览器中获取存储的请求参数值......
【讨论】:
如果你想在 Servlet 规范 不启动会话的情况下获取 ServletContext 怎么办?【参考方案2】:根据Javadoc,ServletRequest#getServletContext()
方法是在 Servlet 3.0 中引入的,而不是 2.3。您需要在 Eclipse 中安装和集成一个 Servlet 3.0 兼容容器,例如 Tomcat 7、Glassfish 3 等,并将动态 Web 项目的 Target Runtime 设置为该容器。当您正确地执行此操作时,您确实 不需要 需要手动修改构建路径或 build.xml
,Eclipse 会自动为您处理它。您也确实不需要下载不同品牌/版本的任意 servlet 容器的松散 JAR 文件并将其放入您的构建路径中。它只会导致未来的类路径和可移植性问题。
另见:
How do I import the javax.servlet API in my Eclipse project? Maven dependency for Servlet 3.0 API?【讨论】:
感谢您的回复。我发现我不需要将项目作为 Java 项目,因此将其创建为动态项目,将运行时设置为 Tomcat 7.0,但仍然存在相同的错误。还有什么我应该注意的吗? 请注意,它必须是一个动态的 Web 项目。您的项目必须创建为 Servlet 3.0 项目(之后您可以在 Project Facets 属性中更改它)。只有 Eclipse Helios (3.6) 和更新版本支持此功能(否则您需要升级)。您还需要确保您的web.xml
根声明符合 Servlet 3.0 规范(您可以手动编辑 XML)。
这是一个动态 Web 项目(抱歉打错字),进入 Project Facets 时,Dynamic Web Module 版本为 v3.0。 web.xml 读取:<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
.
您确定没有在您的/WEB-INF/lib
文件夹或项目的构建路径中有任何精心挑选的特定于servletcontainer 的库吗?另请参阅我的答案中的“另请参阅”链接。
我检查了您的其他页面并确保一切都达到正确的版本,并且我没有任何其他依赖项。太令人沮丧了!【参考方案3】:
我最近也遇到了同样的麻烦。事实上,它在添加一些新罐子后开始发生。 Ant 在 selenium-server.jar 中找到了 HttpServletRequest 类,该类按字母顺序排在 servlet-api.jar 之前(应该使用)。 所以我只是将 selenium-server.jar 重命名为 x-selenium-server.jar 并且一切都开始正常构建,就像以前一样。
【讨论】:
【参考方案4】:这不是您的 java 编译器的问题。 javax 由 servlet 容器本身提供,您必须在项目设置中包含 servlet 容器 jar 文件。
javax.servlet.http 和所有与 servlet 上下文和 servlet 编程相关的类仅与您的 Servlet 容器相关。因此,不要再担心其他任何事情,并检查 Tomcat 库是否包含在您的 WEB-APP 类路径中。
如果不添加它们,一切都会好起来的。
右键单击您的项目>属性>添加库>服务器运行时
并选择与您的应用程序关联的服务器。
您已完成,这将在您的项目中包含 Servlet 容器库,并且 HttpServletRequest 和 HttpServletResponse 类将被解析。
希望对您有所帮助,有关 Servlet 架构和上下文的更多信息可以找到 Here.
【讨论】:
以上是关于未找到 request.getServletContext(),即使使用新 JAR的主要内容,如果未能解决你的问题,请参考以下文章