尝试在Head First Servlet和JSP中重现示例时发生NullPointerException

时间:2018-07-10 10:24:22

标签: java servlets

我在Head First Servlets和JSP Ch.5中重现了该示例,该示例展示了Servlet Context Listener的工作方式。在实现本书中的代码之后,我得到了$errors->first('username')

  带有路径[/ ServletContextListenerPractice]的上下文中Servlet [ListenerTester]的

Servlet.service()抛出异常   java.lang.NullPointerException

我已经检查了好几次,并且确定除了文件路径以外,这些代码与书上的代码相同。当本书使用NullPonterException时,我将文件路径设置为com.example.web。有人知道是什么问题吗?

ListenerTester.java

com.example

Dog.java

package com.example.web;

import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

/**
 * Servlet implementation class ListenerTester
 */
@WebServlet("/ListenerTester")
public class ListenerTester extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public ListenerTester() {
        super();
        // TODO Auto-generated constructor stub
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        out.println("test context attributes set by listener<br>");
        out.println("<br>");

        Dog dog = (Dog) getServletContext().getAttribute("dog");

        // render brand name to client
        out.println("The brand is " + dog.getBreed());
    }

}

MyServletContextListener.java

package com.example.web;

public class Dog {

    private String breed;

    public Dog(String breed) {
        this.breed = breed;
    }

    public String getBreed() {
        return breed;
    }
}

web.xml

package com.example.web;

import javax.servlet.*;

public class MyServletContextListener implements ServletContextListener {
    public void contextInitilized(ServletContextEvent event) {
        ServletContext sc = event.getServletContext();
        String dogBreed = sc.getInitParameter("breed");

        Dog d = new Dog(dogBreed);

        // set Dog reference, d, as attribute on Servlet Context
        sc.setAttribute("dog", d);
    }

    public void contextDestroyed(ServletContextEvent event) {
        // do nothing
    }
}

1 个答案:

答案 0 :(得分:2)

您拼写了错误的Database,但是编译器并不介意,因为您没有告诉您打算覆盖超类contextInitialized中的方法。如果添加ServletContextListener注释来告诉编译器您的意图,它将验证您实际上是在重写超类方法。

@Override

拥有一个名为public class MyServletContextListener implements ServletContextListener { @Override // this one gives a compiler error because it doesn't override anything public void contextInitilized(ServletContextEvent event) { // . . . } @Override // this one doesn't complain because it does override a method public void contextInitialized(ServletContextEvent event) { // . . . } // this one compiles just fine, even though the name is spelled wrong public void contextInitilized(ServletContextEvent event) { // . . . } public void contextDestroyed(ServletContextEvent event) { // do nothing } } 的新方法是完全合法的;它也完全没用,并且不会按照您的期望进行操作。