servlet從web.xml中獲取已配置的初始化參數為null


前幾天幫同學調代碼的時候發現了一個小的問題:在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 }

<!--親測有效-->


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM