天天看點

Servlet開發中的一些細節

一、web.xml配置檔案細節

1.1 由于用戶端是通過URL位址通路web伺服器中的資源,是以Servlet程式若想被外界通路,必須把servlet程式映射到一個URL位址上,這個工作在web.xml檔案中使用<servlet>元素和<servlet-mapping>元素完成。

eg:

<web-app>

<servlet>

<servlet-name>AnyName</servlet-name>

<servlet-class>com.servlet.HelloServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>AnyName</servlet-name>

<url-pattern>/demo/hello.html</url-pattern>

</servlet-mapping>

</web-app>

  • <servlet>元素:用于注冊Servlet。包含兩個主要的子元素,
    • <servlet-name>元素:用于設定Servlet的注冊名稱;
    • <servlet-class>元素:用于設定Servlet的完整限定名。
  • <servlet-mapping>元素用于映射一個已注冊的Servlet的一個對外通路路徑。它包含有兩個子元素,
    • <servlet-name>元素:用于指定Servlet的注冊名稱;
    • <url-pattern>元素:用于指定Servlet的對外通路路徑。

1.2 同一個Servlet可以被映射到多個URL上,即多個<servlet-mapping>元素的<servlet-name>子元素的設定值可以是同一個Servlet的注冊名。

eg:

<servlet-mapping>

   <servlet-name>Servlet2</servlet-name>

    <url-pattern>/Servlet2.htm</url-pattern>

   <url-pattern>/Servlet2.html</url-pattern>

   <url-pattern>/Servlet2.jsp</url-pattern>

 </servlet-mapping>

1.3 在Servlet映射到的URL中也可以使用*通配符,但是隻能有兩種固定的格式:

一種格式是“*.擴充名”,另一種格式是以正斜杠(/)開頭并以“/*”結尾。

eg:

<servlet-mapping>

<servlet-name>AnyName</servlet-name>

<url-pattern>*.do</url-pattern>

<url-pattern>/action/*</url-pattern>

</servlet-mapping>

1.4 如果在<servlet>元素中配置了一個<load-on-startup>元素,那麼WEB應用程式在啟動時,就會裝載并建立Servlet的執行個體對象、以及調用Servlet執行個體對象的init()方法。

eg:

<servlet>

<servlet-name>invoker</servlet-name>

<servlet-class>

org.apache.catalina.servlets.InvokerServlet

</servlet-class>

<load-on-startup>2</load-on-startup>

</servlet>

  • 用途:為web應用寫一個InitServlet,這個servlet配置為啟動時裝載,為整個web應用建立必要的資料庫表和資料。

預設Servlet

  • 如果某個Servlet的映射路徑僅僅為一個正斜杠“/”,那麼這個Servlet就成為目前Web應用程式的預設Servlet。
  • 凡是在web.xml檔案中找不到比對的<servlet-mapping>元素的URL,它們的通路請求都将交給預設Servlet處理,也就是說,預設Servlet用于處理所有其他Servlet都不處理的通路請求。
  • 在<tomcat的安裝目錄>\conf\web.xml檔案中,注冊了一個名稱為org.apache.catalina.servlets.DefaultServlet的Servlet,并将這個Servlet設定為了預設Servlet。
  • 當通路Tomcat伺服器中的某個靜态HTML檔案和圖檔時,實際上是在通路這個預設Servlet。

二、Servlet知識點細節

2.1 Servlet是一個供其他Java程式(Servlet引擎)調用的Java類,它不能獨立運作,它的運作完全由Servlet引擎來控制和排程。

2.2 針對用戶端的多次Servlet請求,通常情況下,伺服器隻會建立一個Servlet執行個體對象,也就是說Servlet執行個體對象一旦建立,它就會駐留在記憶體中,為後續的其它請求服務,直至web容器退出,servlet執行個體對象才會銷毀,即servlet對象是單例的。可以參考這篇文章《對javaservlet單例模式的了解》。

2.3 在Servlet的整個生命周期内,Servlet的init方法隻被調用一次。而對一個Servlet的每次通路請求都導緻Servlet引擎調用一次servlet的service方法。對于每次通路請求,Servlet引擎都會建立一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應對象,然後将這兩個對象作為參數傳遞給它調用的Servlet的service()方法,service方法再根據請求方式分别調用doGet/doPost方法。

繼續閱讀