jsp中的請求servlet操作的跳轉(zhuǎn)<a href = 地址與xml中servlet注冊的url-pattern到底有什么要求?
在reg.jsp文件中是
<a?href?=?"servlet/TheServlet">gotoServlet</a>
在配置文件中是
??????<servlet> ??????<servlet-name>TheServlet</servlet-name> ??????<servlet-class>servlet.TheServlet</servlet-class> ??????<load-on-startup>1</load-on-startup> ??????</servlet> ??????<servlet-mapping> ??????<servlet-name>TheServlet</servlet-name> ??????<url-pattern>/servlet/TheServlet</url-pattern> ??????</servlet-mapping>
而在工程里面的位置也如視頻內(nèi)提示的一樣
src--|
?| ? ? ?servlet--|
?| ? ? ? ? ? ? ? ? TheServlet
WebRoot--|
?| ? ? ? ? ? ? ? WEB-INF--|
?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? web.xml
?| ? ? ? ? ? ? ? reg.jsp
這樣整個(gè)的流轉(zhuǎn)流程是怎么樣的,在1-4節(jié)中的說明中,似乎由reg.jsp的超鏈接,獲得的請求地址進(jìn)入web.xml進(jìn)行匹配判斷,得到了對應(yīng)的servlet,再由servlet定義的Class去進(jìn)行相應(yīng)的doget()方法。所以1-4節(jié)好像在說明:reg.jsp的超鏈接無論指向何處都沒關(guān)系,只需要與在web.xml注冊的servlet的url-pattern匹配即可?
但在1-13節(jié)的講解中,說明了這個(gè)reg.jsp的超鏈接是直接鏈接到了項(xiàng)目虛擬地址/servlet/TheServlet,而在web.xml注冊的servlet的url-pattern,是指項(xiàng)目中的這個(gè)servlet的地址(這里存在問題,這個(gè)屬于地址么?如果是地址,指示一個(gè)TheServlet的文件,那么不需要后綴么?),在修改了url-pattern之后,在啟動項(xiàng)目都無法進(jìn)行了,是否相當(dāng)于url-pattern要綁定(或者說鏈接)一個(gè)servlet.java?如果這樣那么還需要所謂的servlet-class來指示類文件么?
所有主要的問題就兩個(gè):1、Jsp文件中的這個(gè)get方式的請求的超鏈接,到底是要指向什么?是一個(gè)確實(shí)的文件?還是一個(gè)隨意的地址,只要servlet能接收這個(gè)超鏈接請求并返回信息即可?
2、在web.xml配置注冊的servlet的url-pattern屬性到底是什么東西,為什么沒有首/就會出現(xiàn)連服務(wù)都無法啟動的情況,是因?yàn)樗?strong>確實(shí)指向一個(gè)確實(shí)存在的servlet實(shí)現(xiàn)類嗎?還是一個(gè)為了和Jsp超鏈接請求相互匹配進(jìn)行處理的匹配數(shù)據(jù)信息,只是因?yàn)樵趈sp中使用的時(shí)候有默認(rèn)添加上下文地址之類的操作,才導(dǎo)致必須添加首/,而在jsp中不能添加首/?
我的問題可能有些亂,初學(xué)JSP,不理解servlet,希望能得到指導(dǎo)
2016-07-12
你好
先說你的第一個(gè)問題 我的理解是請求的地址,你可以把里面的測試路徑隨便更改為"?會發(fā)現(xiàn)直接跳轉(zhuǎn)到百度首頁了.?因?yàn)槲沂褂玫氖荌DE是IDEA,所以使用了JAVA EE 6的注解功能,并沒有添加文件到web.xml,所以理解角度可能和你不一樣了,我的是這樣的,在Servlet文件的開始有如下:
假如沒有urlPatterns這個(gè)參數(shù),無論你的href寫什么都會是404;
在回答你第一個(gè)問題的時(shí)間就牽扯到你第二個(gè)問題了,
在web.xml配置注冊的servlet的url-pattern屬性到底是什么東西
然后你問
這里存在問題,這個(gè)屬于地址么?如果是地址,指示一個(gè)TheServlet的文件,那么不需要后綴么?
那么我們是不是可以理解為?url-pattern 就是路徑參數(shù),因?yàn)檫@個(gè)就是Servlet的參數(shù),所以是不需要后綴的,也就是說我們的Servlet類文件會注冊一個(gè)路徑(注意我說的是路徑.)
然后就回到我們最開始的 1-13中老師有講相對和絕對對吧.
------分割線------
我剛才做了一個(gè)測試?
你可以把urlPatterns的參數(shù)改為任意名稱,與你的Servlet文件名完全無關(guān),然后在?<a href="servlet/HelloServlet">中改為相同的一樣可以跳轉(zhuǎn).
所以我們可以不可以這樣理解呢,?url-pattern/urlPatterns 只是給你的Servlet文件起了一個(gè)路徑,就好像我們每個(gè)人都有用戶名一樣.
只要兩處一致,即可跳轉(zhuǎn)訪問,這大概也是老師一開始說的注冊Servlet的意思呢.
寫了這么多可能有點(diǎn)亂,現(xiàn)在重新回答你的兩個(gè)問題:
1、Jsp文件中的這個(gè)get方式的請求的超鏈接,到底是要指向什么?是一個(gè)確實(shí)的文件?還是一個(gè)隨意的地址,只要servlet能接收這個(gè)超鏈接請求并返回信息即可?
A:超鏈接就是路徑,路徑當(dāng)然指向的還是文件. 所以最終還是文件.
2、在web.xml配置注冊的servlet的url-pattern屬性到底是什么東西,為什么沒有首/就會出現(xiàn)連服務(wù)都無法啟動的情況,是因?yàn)樗_實(shí)指向一個(gè)確實(shí)存在的servlet實(shí)現(xiàn)類嗎?還是一個(gè)為了和Jsp超鏈接請求相互匹配進(jìn)行處理的匹配數(shù)據(jù)信息,只是因?yàn)樵趈sp中使用的時(shí)候有默認(rèn)添加上下文地址之類的操作,才導(dǎo)致必須添加首/,而在jsp中不能添加首/?
A:url-pattern這個(gè)屬性就是一個(gè)名字,而且與實(shí)際路徑無關(guān)(可以理解為虛擬路徑或者別名),并不是文件真實(shí)路徑(這樣回答會不會與第一個(gè)問題的回答沖突),因?yàn)檫@里的首/表示為項(xiàng)目的根目錄,沒有就會出現(xiàn)找不到加載路徑所以無法啟動吧.結(jié)論無論在普通的Java類中還是Servlet還是JSP,我們都需要一個(gè)明確且唯一的路徑.(無論相對還是絕對,肯定是唯一的)