前幾天幫同學調代碼的時候發現了一個小的問題:在web.xml文件中配置了servlet的初始化參數,但是在servlet中獲取初始化參數時,獲取到的值卻一直未null
1、servlet的三種創建方式
(1)實現Servlet接口
(2)繼承GenericServlet類,它實現了Servlet接口除了service的方法
(3)繼承HttpServlet方法

2、servlet的生命周期
(1)如果是第一次訪問servlet,則創建servlet實例
(2)自動調用init(ServletConfig config)方法
(3)調用service()方法
(4)終止階段調用destory()方法
【注】可用一個類去實現Servlet接口,就可以看到這些方法
3、問題的產生及解決方法
servlet3.0以后可以采用注解驅動了,這相當於在web.xml中配置了servlet的信息。如果再在web.xml中配置,可能會產生如下問題
(1)當在web.xml中配置的url-pattern與在注解驅動中配置的url-pattern相同時,則無法啟動Tomcat
1 <servlet> 2 <servlet-name>ParamTest</servlet-name> 3 <servlet-class>cn.test.ParamTest</servlet-class> 4 <init-param> 5 <param-name>message</param-name> 6 <param-value>hello servlet!</param-value> 7 </init-param> 8 </servlet> 9 10 <servlet-mapping> 11 <servlet-name>ParamTest</servlet-name> 12 <url-pattern>/ParamTest</url-pattern> 13 </servlet-mapping>
1 @WebServlet("/ParamTest") 2 public class ParamTest extends HttpServlet { 3 private static final long serialVersionUID = 1L; 4 5 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 6 String message = this.getInitParameter("message"); 7 response.getWriter().write(message); 8 } 9 10 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 11 doGet(request, response); 12 } 13 }
錯誤信息截圖:

(2)有人可能會想,那把web.xml中的servlet-mapping刪掉,用注解驅動映射可以嗎?
web.xml修改如下
1 <servlet> 2 <servlet-name>ParamTest</servlet-name> 3 <servlet-class>cn.test.ParamTest</servlet-class> 4 <init-param> 5 <param-name>message</param-name> 6 <param-value>hello servlet!</param-value> 7 </init-param> 8 </servlet>
運行結果:java.lang.NullPointerException 空指針異常
注解驅動和配置驅動畢竟不是一套體系,不能混用。但是如果你在web.xml中配置的url-pattern與注解驅動的url-pattern不同,則程序運行正常。原因,Tomcat在加載程序時會先去讀取項目的web.xml配置

此時可以看到地址欄中的url-pattern采用的是web.xml中的配置。
個人建議:將配置驅動和注解驅動分開寫,不要混用
(1)配置驅動:web.xml和繼承HttpServlet
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 3 <display-name>test</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 13 <servlet> 14 <servlet-name>ParamTest</servlet-name> 15 <servlet-class>cn.test.ParamTest</servlet-class> 16 <init-param> 17 <param-name>message</param-name> 18 <param-value>hello servlet!</param-value> 19 </init-param> 20 </servlet> 21 22 <servlet-mapping> 23 <servlet-name>ParamTest</servlet-name> 24 <url-pattern>/param</url-pattern> 25 </servlet-mapping> 26 </web-app>
1 public class ParamTest extends HttpServlet{ 2 private static final long serialVersionUID = 1L; 3 4 @Override 5 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 6 String message = getInitParameter("message"); 7 response.getWriter().write(message); 8 } 9 10 @Override 11 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 12 doGet(request, response); 13 } 14 }
(2)注解驅動
1 @WebServlet( 2 urlPatterns= {"/ParamServlet","/initparam"}, 3 initParams= {@WebInitParam(name="message",value="hello servlet")}) 4 public class ParamServlet extends HttpServlet { 5 private static final long serialVersionUID = 1L; 6 7 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 8 String message = getInitParameter("message"); 9 response.getWriter().write(message); 10 } 11 12 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 13 doGet(request, response); 14 } 15 }
<!--親測有效-->
