1. 程式人生 > >Servlet url-pattern /與/*區別

Servlet url-pattern /與/*區別

以前在使用Servlet的時候,配置url-pattern基本上都是指定的路徑,也沒有仔細的研究,最近突然發現了一個問題,我們將url-pattern配製成/*,那麼Servlet會處理與其匹配的路徑,那麼我們配製成/是不是效果一樣呢?下面我們將通過實際示例來驗證一下。
首先我們新建一個Web程式,建立過程這裡就不再敘述了。然後我們再建立一個Servlet用於測試

package com.gujin.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import
javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class UrlPatternTest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); writer.print("this is UrlPatternTest Servlet."
); writer.flush(); writer.close(); } }

這個Servlet很簡單,只是向頁面輸出一句話,我們需要在web.xml中進行配置,讓其生效。首先我們先將url-pattern配製成/*看一下效果。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>Servlet</display-name> <servlet> <servlet-name>test</servlet-name> <servlet-class>com.gujin.servlet.UrlPatternTest</servlet-class> </servlet> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>

執行程式,通過瀏覽器訪問一下:
我們在瀏覽器位址列輸入:http://127.0.0.1/Servlet/,檢視頁面顯示結果:
這裡寫圖片描述

Tomcat會把這個請求交給我們剛才建立的Servlet去處理,再輸入一些其他的地址也會交給這個Servlet來處理,那麼我們是不是可以推斷,當url-pattern配置成/*的時候,Tomcat會將所有的請求全部交由對應的Servlet進行處理。當訪問的地址正好有對應的檔案存在時,依然如此嗎?我們來驗證一下。
我們繼續建立兩個檔案:test.jsp和test.html

test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>this is test page.
</body>
</html>

test.jsp

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>this is test.jsp page.
</body>
</html>

然後我們通過瀏覽器訪問http://127.0.0.1/Servlet/test.htmlhttp://127.0.0.1/Servlet/test.jsp,我們發現請求依然是交給了我們的Servlet去處理。

下面,修改url-pattern/,我們來驗證一下與/*是否相同

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Servlet</display-name>
  <servlet>
    <servlet-name>test</servlet-name>
    <servlet-class>com.gujin.servlet.UrlPatternTest</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>test</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

修改完成後,我們先來訪問http://127.0.0.1/Servlet/,結果好像與原來一樣,再訪問http://127.0.0.1/Servlet/test.html,結果還是一樣,我們現在可能會想這兩者會不會就沒區別呢?別急,我們還有一個地址,好吧,我們最後再訪問http://127.0.0.1/Servlet/test.jsp,神奇的事情出現了,結果與原來不一樣了。
這裡寫圖片描述
這個時候訪問到了真正的jsp頁面,而不是由我們的Servlet來處理請求。

最後,我們來總結一下:當url-pattern配置成/*的時候,Tomcat會將所有的請求交給對應的Servlet進行處理,當url-pattern配置成/的時候,多數情況下與/*效果一致,但是,當訪問的路徑正好對應jsp檔案時,Tomcat會訪問真實的jsp檔案而不是把請求交給對應的Servlet處理。

以上為個人的疑問以及驗證的過程,有不對的地方,歡迎指正。