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.html
和http://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處理。
以上為個人的疑問以及驗證的過程,有不對的地方,歡迎指正。