Ответ 1
Это может быть вызвано загрязнением класса. Убедитесь, что вы /WEB-INF/lib
не содержат что-то вроде jsp-api-*.jar
.
Я получаю следующую ошибку, что может быть проблемой?
Мой дескриптор контекста:
<?xml version="1.0" encoding="UTF-8"?>
<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_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>controller.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at org.apache.jsp.index_jsp._jspInit(index_jsp.java:22)
at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Unknown Source)
Feb 23, 2010 11:35:28 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at org.apache.jsp.index_jsp._jspInit(index_jsp.java:22)
at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Unknown Source)
Это может быть вызвано загрязнением класса. Убедитесь, что вы /WEB-INF/lib
не содержат что-то вроде jsp-api-*.jar
.
Если ваш проект основан на Maven, не забудьте указать область для таких зависимостей, как servlet-api, jsp-api. В противном случае эти банки будут экспортироваться в WEB-INF/lib и, следовательно, загрязняться с помощью серверов Tomcat. Это вызывает болезненные проблемы.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
У меня была эта ошибка; это произошло несколько спонтанно, и страница остановилась в браузере в середине HTML-тега (а не в разделе кода). Это было непонятно!
Оказывается, я разрешаю переменной выйти из сферы действия, и сборщик мусора убрал ее, а затем я попытался ее использовать. Таким образом, казалось бы, случайное время.
Чтобы дать более конкретный пример... Внутри метода у меня было что-то вроде:
Foo[] foos = new Foo[20];
// fill up the "foos" array...
return Arrays.asList(foos); // this returns type List<Foo>
Теперь на моей странице JSP я вызвал этот метод и использовал возвращаемый им объект List. Объект List поддерживается этим массивом "foos"; но массив вышел из области видимости, когда я вернулся из метода (поскольку это локальная переменная). Поэтому вскоре после возвращения сборщик мусора сместил массив "foos", и мой доступ к списку вызвал исключение NullPointerException, поскольку его базовый массив теперь был уничтожен.
Я действительно задавался вопросом, как я написал вышеописанный метод, будет ли это происходить.
Еще более глубокая проблема заключалась в преждевременной оптимизации. Мне нужен список, но я знал, что у меня будет ровно 20 элементов, поэтому я решил, что постараюсь быть более эффективным, чем new ArrayList<Foo>(20)
, который устанавливает только начальный размер 20, но может быть менее эффективным, чем метод, который я использовал. Поэтому, конечно, чтобы исправить это, я просто создал свой ArrayList, наполнил его и вернул. Не более странная ошибка.
Проблема в вашем JSP, скорее всего, вы вызываете метод для объекта, который является нулевым во время выполнения.
Это происходит в вызове _jspInit(), что немного необычнее... Код проблемы, вероятно, является объявлением метода, например <%! %>
Обновление: я только воспроизвел это, переопределив метод _jspInit(). Это то, что вы делаете? Если это так, не рекомендуется - почему он начинается с _.
Я изо всех сил старался следовать приведенным выше ответам. Но у меня есть причина для того же.
Примечание. Это для развертывания maven + eclipse + tomcat и проблемы, особенно с spring mvc.
1- Если вы включаете зависимость сервлета и jsp, отметьте их в области видимости.
<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>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
Возможно, вы можете включить jstl в качестве зависимости. Таким образом, jsp-api.jar
и servlet-api.jar
будут включены вместе. Таким образом, необходимо исключить, что servlet-api и jsp-api развертываются по мере необходимости в lib в целевом или в "WEB-INF/lib", как указано ниже.
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
<exclusion>
<artifactId>jsp-api</artifactId>
<groupId>javax.servlet.jsp</groupId>
</exclusion>
</exclusions>
</dependency>