我在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
}
}
答案 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
}
}
的新方法是完全合法的;它也完全没用,并且不会按照您的期望进行操作。