我已经阅读了很多类似的问题,并尝试了所有建议的方法来解决问题,但是它没有成功。现在我真的不知道如何处理这个问题(localhost:8080 / testWebApp / home):
HTTP Status 500 -
...
exception
java.lang.NullPointerException
test.web.servlet.TestServlet.doGet(TestServlet.java:37)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
我使用maven 3.3.9和tomcat7 7.0.70-1。我的项目目录具有以下层次结构:
webApp/
pom.xml
src/
main/
java/
test/web/servlet/
TestServlet.java
webapp/
index.html
WEB-INF/
views/
home.jsp
web.xml
这是TestServlet代码:
package test.web.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
@WebServlet(urlPatterns = { "/home"})
public class TestServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public TestServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/views/home.jsp");
//The following attempts are unsuccessful too:
//RequestDispatcher dispatcher = request.getRequestDispatcher("/home.jsp");
//RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/home.jsp");
dispatcher.forward(request, response); // error (37 line)
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
这是web.xml代码:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_4.dtd">
<web-app>
<welcome-file-list>
<welcome-file>home</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
home.jsp代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Home Page</title>
</head>
<body>
<%-- <jsp:include page="main.jsp"></jsp:include> --%>
<h3>Home</h3>
<br><br>
<b>You have the following options:</b>
<ul>
<li>Login</li>
</ul>
</body>
</html>
pom.xml中的一些有用的行:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<server>tomcat-7.0.70-1</server>
<url>http://localhost:8080/manager/text</url>
<path>/testWebApp</path>
</configuration>
</plugin>
谢谢你的帮助!
答案 0 :(得分:2)
您无法在应用程序中获取任意文件的RequestDispatcher。 getRequestDispatcher()的参数必须是应用程序的有效URL路径,而不是相对文件系统位置。这就是dispatcher
为空的原因。
如果你想让你的JSP驻留在WEB-INF下(这是一个好主意),那么你必须为它们创建适当的<servlet-mapping>
元素。
答案 1 :(得分:0)
在深入研究servlet文档(特别是映射主题)之后,我对web.xml
和TestServlet.java
进行了一些修改。 It's important那个:
WEB-INF目录不是公共文档树的一部分 应用。不能提供WEB-INF目录中包含的文件 由容器直接发送给客户端。 在我的情况下,
views
文件夹位于WEB-INF
内(对于来自外部的用户访问限制)。
因此,需要添加以下行(web.xml
):
...
<servlet>
<servlet-name>home</servlet-name>
<jsp-file>/WEB-INF/views/home.jsp</jsp-file>
<init-param>
<param-name>home</param-name>
<param-value>Home Page</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>home</servlet-name>
<url-pattern>/homepg</url-pattern>
</servlet-mapping>
...
并更正了TestServlet.java
:
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/homepg");
P.S。 感谢gsl指向正确的方向!
答案 2 :(得分:0)