2012-11-30 9 views
6

Próbuję przesłonić init (ServletConfig config) Kod method.My jest:serwlet Zastępowanie init (ServletConfig config)

public void init(ServletConfig config) throws ServletException { 
    ServletContext sc = getServletContext(); // ----- NullPointerException 
} 

to daje NullPointerException.

Jeśli i zmodyfikować go jako:

public void init(ServletConfig config) throws ServletException { 
    ServletContext sc = config.getServletContext(); // ----- works fine 
} 

To działa prawidłowo. Wiem, że powinniśmy przesłonić metodę init(), a nie init (ServletConfig config), ale
Czy ktoś może podać mi powody, dlaczego tak się dzieje?

+1

Skąd wiesz, że * powinniśmy przesłonić metodę 'init()', a nie 'init (ServletConfig config)' *? –

+0

Nie mówię, że nie możemy przesłonić metody init (ServletConfig config), możemy, ale czytam, że metoda init() jest wywoływana wewnętrznie z metody init (ServletConfig config), więc powinniśmy przesłonić metodę init(). –

+0

Wygląda na to, że masz już odpowiedź. czego jeszcze potrzebujesz? –

Odpowiedz

19

Porównaj dokumentacji init(ServletConfig):

 
public void init(ServletConfig config)throws ServletException 
Called by the servlet container to indicate to a servlet that the servlet 
is being placed into service. 

See Servlet#init. This implementation stores the ServletConfig object 
it receives from the servlet container for later use. When overriding 
this form of the method, call super.init(config). 

I porównać to z dokumentacji init():

 
public void init() throws ServletException 
A convenience method which can be overridden so that there's no need to 
call super.init(config). 

Instead of overriding init(ServletConfig), simply override this method 
and it will be called by GenericServlet.init(ServletConfig config). The 
ServletConfig object can still be retrieved via getServletConfig(). 

Kiedy przesłanianie init(ServletConfig), pierwszą rzeczą, którą należy zrobić, to zadzwonić:

super.init(config); 

Jeśli chcesz o to następnie wywołanie bezpośrednio do getServletContext() w twojej metodzie nie będzie już powodować NPE.

+0

oznacza po wywołaniu - super.init (config) ;, serwlet otrzyma odwołanie do servletcontext? –

+0

@RiteshKaushik tak, to właśnie to oznacza. –

1

Ponieważ w:

public void init(ServletConfig config) throws ServletException 
{ 
    ServletContext sc = getServletContext(); 
} 

nie powoływać super.init(ServletConfig). W rezultacie ServletConfig nie jest przechowywany w instancji serwletu, a kolejne wywołania getServletConfig zwrócą wartość null.

2

Dzieje się tak dlatego, że przesłanianie metody złego mechanizmu Jeśli nadrzędne

 public void init(ServletConfig config) throws ServletException { 
     super.init(config); 
      ServletContext sc = getServletContext(); 
    } 

Zamiast nadrzędnymi init(ServletConfig), wystarczy zastąpić poniżej metody i zostanie ona wywołana przez GenericServlet.init(ServletConfig config)

public void init() throws ServletException { 
ServletContext sc = getServletContext(); 
} 
0

Wystarczy umieścić super init (config) w pierwszej linii nadpisanej metody

public void init(ServletConfig config) throws ServletException 
Powiązane problemy