我很遗憾,我很遗憾。但我花了最近几天搜索,不幸的是我没有找到一个似乎合适的答案。
我有一个扩展HttpServlet并覆盖init()“not init(ContextConfig)”的Servlet,并且在init()函数中,getServletContext始终返回null。当我使用Springs 4.0.x和Jetty 8.1.x时,情况并非如此。我猜我做错了什么但不知道它是什么。我通常从测试代码中删除了Springs,但它仍然为null。
的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<display-name>MyServlet</display-name>
<servlet-name>MyServlet</servlet-name>
<servlet-class>servlet.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
JavaConfig Starter partial:
WebAppContext root = new WebAppContext();
root.setDescriptor("./WEB-INF/web.xml");
root.setDisplayName("Root Context");
root.setSessionHandler(sesh); //Persist Session across restarts of context
root.setHandler(csh);
root.setMaxFormContentSize(10000000);
// Cron Servlet
System.out.println("Checking root ServletContext ");
if (root.getServletContext() == null)
System.out.println("ServletContext is null");
//ServletHolder test = new ServletHolder(new MyServlet());
//test.setDisplayName("test");
//test.setName("test");
//root.addServlet(test, "/the");
root.setResourceBase(new File("./jsp").getPath());
server.setHandler(root);
//Start the server
server.start();
server.join();
和servlet:
package servlet;
import java.io.*;
import org.apache.log4j.Logger;
import javax.servlet.*;
import javax.servlet.http.*;
public class MyServlet extends HttpServlet {
static Logger log = Logger.getLogger(MyServlet.class);
private static final long serialVersionUID = 1L;
public void init() throws ServletException {
// Initialization code...
log.info("MyServlet init()");
super.init();
ServletContext sc = getServletContext();
if (sc == null)
log.info("54: Conext returned null");
}
public void destroy() {
log.info("MyServlet destroy()");
}
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setHeader("Server", "GoAway");
doProcess(req, resp);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setHeader("Server", "GoAway");
doProcess(req, resp);
}
private void doProcess(HttpServletRequest req, HttpServletResponse resp) throws IOException {
PrintWriter out = resp.getWriter();
// setup no cache
resp.setContentType("text/html");
resp.getWriter().println("<html><head><META HTTP-EQUIV=\"refresh\" content=\"0;URL=/\"></head><body>\n</body>\n</html>");
resp.getWriter().close();
out.close();
return;
}
protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("Server", "GoAway");
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
}
}
所以这是我从一个更大的应用程序中删除的东西,以弄清楚我做错了什么。所以有些人可能仍然不需要。您可以在Javaconfig中看到我也尝试过在那里创建servlet容器,但结果是一样的。
因此,从Start代码中,servletContext不为null。 但是从MyServlet的init()代码中,它总是返回null。
我真的不确定我做错了什么。
感谢您的帮助。
o FYI包括Jar的
commons-beanutils-1.9.2.jar
commons-codec-1.9.jar
commons-io-2.2.jar
commons-logging-1.2.jar
javax.el-2.2.6.jar
javax.el-api-2.2.5.jar
javax.mail-1.5.3.jar
javax.servlet-api-3.1.0.jar
jetty-http-9.3.6.v20151106.jar
jetty-io-9.3.6.v20151106.jar
jetty-security-9.3.6.v20151106.jar
jetty-server-9.3.6.v20151106.jar
jetty-servlet-9.3.6.v20151106.jar
jetty-util-9.3.6.v20151106.jar
jetty-webapp-9.3.6.v20151106.jar
jetty-xml-9.3.6.v20151106.jar
log4j-1.2.17.jar
org.apache.jasper.glassfish-2.2.2.v201112011158.jar
slf4 j-api-1.7.13.jar
spring-aop-4.2.3.RELEASE.jar
spring-beans-4.2.3.RELEASE.jar
spring-context-4.2.3.RELEASE.jar
spring-context-support-4.2.3.RELEASE.jar
spring-core-4.2.3.RELEASE.jar
spring-expression-4.2.3.RELEASE.jar
spring-tx-4.2.3.RELEASE.jar
spring-web-4.2.3.RELEASE.jar
更新2015.12.10:
所以我用不同的Jetty版本玩了一下。原始代码使用的是8.1.17,我决定将其升级到9.3.6。所以我将它降级到9.3.5,但结果相同。然后我降级到9.2.14,问题得到了解决。所以,这是Jetty 9.3.x中的一个错误(这似乎不太可能,因为有人会使用它)或者9.3它们是一种不同的配置方式。我查找了有关它的文档,因为它显示的方式和我一样。