日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

面试——路径、转发与重定向的区别

發(fā)布時(shí)間:2023/12/16 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试——路径、转发与重定向的区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

情形

復(fù)習(xí)尚學(xué)堂java的mybatis第二天遇到了一系列問(wèn)題,并以此來(lái)復(fù)習(xí)關(guān)于項(xiàng)目路徑,服務(wù)器路徑,絕對(duì)路徑,相對(duì)路徑以及轉(zhuǎn)發(fā)和重定向的區(qū)別

一、轉(zhuǎn)發(fā)與重定向

1.兩者的區(qū)別

鏈接:https://blog.csdn.net/liubin5620/article/details/79922692

二、路徑

我們以web開(kāi)發(fā)的各種資源作為大環(huán)境探討路徑的問(wèn)題和定義

項(xiàng)目路徑:叫做項(xiàng)目根目錄或者WEB應(yīng)用程序的根目錄,也就是idea中當(dāng)前web項(xiàng)目中的web文件夾路徑,為web,如下圖所示:

服務(wù)器路徑:tomcat軟件文件夾下的 webapps文件夾,也就是tomcat/webapp文件夾,叫做服務(wù)器根目錄或者web站點(diǎn)根目錄我們的web項(xiàng)目最終打包上傳到tomcat服務(wù)器上,并存在于webapps目錄下,并且以項(xiàng)目名稱(chēng)作為文件夾

我們可以在idea中配置當(dāng)前項(xiàng)目上傳到服務(wù)器根目錄下的項(xiàng)目文件夾名稱(chēng),名稱(chēng)是可以更改的,可以與idea中的項(xiàng)目名稱(chēng)不同(最好一致)。這點(diǎn)idea與eclipse不同,eclipse項(xiàng)目在tomcat服務(wù)器根目錄下的項(xiàng)目文件夾名稱(chēng)與在本地項(xiàng)目名相同(即ide中項(xiàng)目名相同),當(dāng)然我們需要注意,假設(shè)我們更改了idea項(xiàng)目在服務(wù)器根目錄下的文件夾名稱(chēng),例如將/cmz_ReviewMybatis改為——>/ReviewMybatis,則會(huì)使用/cmz_ReviewMybatis不能訪(fǎng)問(wèn)到當(dāng)前項(xiàng)目資源,需要使用/ReviewMybatis來(lái)訪(fǎng)問(wèn),并且后續(xù)的資源訪(fǎng)問(wèn)也要使用/ReviewMybatis作為開(kāi)始的url訪(fǎng)問(wèn)后續(xù)的資源,并且會(huì)影響重定向與靜態(tài)資源訪(fǎng)問(wèn)的路徑,具體下文會(huì)提到。如圖所示:

復(fù)習(xí)項(xiàng)目打包上傳到tomcat的過(guò)程

  • 在idea中,如果項(xiàng)目不是用maven管理的,則將項(xiàng)目src目錄下的所有java文件編譯成為class文件,并放到項(xiàng)目文件夾web文件夾下的web-inf文件夾下的classes文件夾中(web(webapp)/web-inf/classes)其中resources文件夾中的資源文件例如spring等配置文件也會(huì)保存在classes文件夾下,而項(xiàng)目的依賴(lài)jar包則會(huì)上傳到WEB-INF文件夾下的lib文件夾中
  • 將項(xiàng)目根目錄的文件夾web,重命名為項(xiàng)目的名稱(chēng)(這里為cmz_ReviewMybatis,后面的war_exploded不用管,不算名稱(chēng),只是表示打包成war包而已),并將這個(gè)文件夾放到服務(wù)器根目錄下,即放到webapps下,最終路徑為webapps/cmz_ReviewMybatis。最終項(xiàng)目結(jié)構(gòu)如圖所示:
  • ? ? ? 3.如果idea的項(xiàng)目采用maven進(jìn)行管理,最終上傳到服務(wù)器根目錄中的項(xiàng)目結(jié)構(gòu)會(huì)有所不同,classes文件夾不在web-inf文件夾下,maven項(xiàng)目在服務(wù)器根目錄下的項(xiàng)目路徑如圖所示:

    ? ? 4.PS:不論是maven做依賴(lài)管理還是不采用maven,所有項(xiàng)目所依賴(lài)的jar包都要上傳到webapps/項(xiàng)目名稱(chēng)/web-inf/lib目錄下的,有時(shí)候可能依賴(lài)管理會(huì)出現(xiàn)一些問(wèn)題,導(dǎo)致一部分jar包沒(méi)有上傳到tomcat的該目錄只是留在項(xiàng)目本地,從而導(dǎo)致tomcat啟動(dòng)后該項(xiàng)目一些服務(wù)報(bào)錯(cuò),這是因?yàn)樵趖omcat服務(wù)器中的項(xiàng)目缺少jar包依賴(lài)的原因,我們需要將這些jar包上傳到lib包即可,操作如下:

    絕對(duì)路徑以'/'開(kāi)頭的,從根目錄下訪(fǎng)問(wèn)資源的路徑為絕對(duì)路徑,如:/a/b/c

    相對(duì)路徑只要不以'/'開(kāi)頭的,相對(duì)于當(dāng)前資源的路徑,,如:a/b/c或者../a/b/c或者../../a/b/c等。

    三、轉(zhuǎn)發(fā)、重定向、靜態(tài)資源訪(fǎng)問(wèn)的路徑

    1、三者資源訪(fǎng)問(wèn)路徑的根目錄'/'不是同一個(gè)路徑

    請(qǐng)求分為客戶(hù)端直接請(qǐng)求,服務(wù)器重定向并要求客戶(hù)端請(qǐng)求、客戶(hù)端直接訪(fǎng)問(wèn)靜態(tài)資源請(qǐng)求。三種方式中,資源的請(qǐng)求路徑也會(huì)有所不同,相對(duì)路徑和絕對(duì)路徑也會(huì)有所不同:

    • 如果請(qǐng)求是轉(zhuǎn)發(fā),/表示項(xiàng)目根目錄,所有的請(qǐng)求都是以項(xiàng)目根目錄作為參照點(diǎn)和起始點(diǎn)進(jìn)行訪(fǎng)問(wèn)的,不論路徑是絕對(duì)路徑還是相對(duì)路徑。
    • 如果請(qǐng)求是重定向,或者瀏覽器請(qǐng)求靜態(tài)資源引用,/表示服務(wù)器根目錄,所有的請(qǐng)求都是以服務(wù)器根目錄作為起始點(diǎn)和參照點(diǎn)進(jìn)行訪(fǎng)問(wèn),不論路徑是絕對(duì)路徑還是相對(duì)路徑
    • 也就是說(shuō),除轉(zhuǎn)發(fā),/表示項(xiàng)目根目錄;其他所有請(qǐng)求例如重定向或者請(qǐng)求靜態(tài)資源,/表示的都是服務(wù)器根目錄。

    首先我們要明確一點(diǎn):客戶(hù)端訪(fǎng)問(wèn)的url是以服務(wù)器根目錄作為起始點(diǎn)訪(fǎng)問(wèn)的,雖然轉(zhuǎn)發(fā)是以項(xiàng)目根目錄作為起始點(diǎn)訪(fǎng)問(wèn)資源并且發(fā)生了跳轉(zhuǎn),但是這一步是發(fā)生在服務(wù)器內(nèi)部的,客戶(hù)端看不到,所以轉(zhuǎn)發(fā)過(guò)后客戶(hù)端的url不會(huì)因?yàn)榉?wù)器轉(zhuǎn)發(fā)而發(fā)生變化。

    我們結(jié)合例子說(shuō)明。

    案例

    step1.構(gòu)建一個(gè)servlet,轉(zhuǎn)發(fā)到index.jsp

    //注解中用@表示注解聲明,注解中Servlet資源的路徑url為虛擬路徑,也就是說(shuō)我們的PeopleServlet的資源存放在項(xiàng)目的web/homework/people文件 //夾下,并以selAll命名,虛擬路徑雖然不存在在實(shí)際的項(xiàng)目根目錄下,但是是可以實(shí)際訪(fǎng)問(wèn)到的。我們可以把它認(rèn)為是實(shí)際存在與項(xiàng)目根路徑下的, //也就是web/下。 @WebServlet(value = {"/homework/people/selAll"}) public class PeopleServlet extends HttpServlet {private PeopleService peopleServlet = new PeopleServiceImpl();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {List<People> peopleList = peopleServlet.show();req.setAttribute("list", peopleList);//相對(duì)路徑//只要不以/開(kāi)頭的都是相對(duì)路徑,相對(duì)路徑是從當(dāng)前資源所在的虛擬文件夾出發(fā),找到其他資源的過(guò)程// 絕對(duì)路徑//只要路徑中以/開(kāi)頭的都叫做全路徑,從項(xiàng)目根目錄web出發(fā)找到其他資源的過(guò)程//如果請(qǐng)求是轉(zhuǎn)發(fā),/表示項(xiàng)目根目錄,也就是idea中當(dāng)前web項(xiàng)目中的web文件夾路徑,為web//由于我們的servlet目前資源在web/homework/people下,所以如果要跳轉(zhuǎn)到index.jsp(位置在web/index.jsp下)//需要向上跳躍兩個(gè)目錄,寫(xiě)成../../index.jsp,或者寫(xiě)絕對(duì)路徑/index.jsp。// PS:如果請(qǐng)求是重定向,或者瀏覽器請(qǐng)求靜態(tài)資源引用,如css,href,img,script。其中/表示的是tomcat文件夾下的// webapps文件夾,也就是tomcat/webapp文件夾,叫做服務(wù)器根目錄。我們的項(xiàng)目是放在webapp下// PS:也就是說(shuō),除了請(qǐng)求是轉(zhuǎn)發(fā),/表示項(xiàng)目根目錄,其他所有請(qǐng)求例如重定向或者請(qǐng)求靜態(tài)資源,/表示的都是服務(wù)器根目錄。req.getRequestDispatcher("/index.jsp").forward(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);} }

    2.構(gòu)建index.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri = "http://java.sun.com/jsp/jstl/core" %> <html><head><title>$Title$</title></head><body><img src="/cmz_ReviewMybatis/image/a.png"><br/><table><tr><th>編號(hào)</th><th>姓名</th><th>年齡</th></tr><c:forEach items="${list}" var="peo"><tr><td>${peo.id}</td><td>${peo.name}</td><td>${peo.age}</td></tr></c:forEach><br/></table>$END$</body> </html>

    step3.在web.xml中添加歡迎頁(yè)面了列表

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><welcome-file-list><welcome-file>index.jsp</welcome-file><welcome-file>index.html</welcome-file><welcome-file>default.jsp</welcome-file><welcome-file>default.html</welcome-file></welcome-file-list> </web-app>

    (1)上述為轉(zhuǎn)發(fā)以及靜態(tài)資源訪(fǎng)問(wèn)路徑的正確書(shū)寫(xiě),在啟動(dòng)tomcat后直接訪(fǎng)問(wèn)歡迎頁(yè)面,圖片會(huì)進(jìn)行加載,但是由于我們沒(méi)有訪(fǎng)問(wèn)Servlet的url,所以表中的數(shù)據(jù)并不會(huì)出現(xiàn)

    (2)我們直接訪(fǎng)問(wèn)PeopleServlet,PeopleServlet會(huì)獲取到表中人員數(shù)據(jù),并將數(shù)據(jù)放進(jìn)Request中進(jìn)行轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)回到index.jsp中。所以index.jsp將圖片和數(shù)據(jù)庫(kù)人員數(shù)據(jù)顯示完全。

    (3)如果我們?cè)趇ndex.jsp中將img的路徑替換為images/a.png后,

    • <1>直接訪(fǎng)問(wèn)主頁(yè)index.jsp,是可以訪(fǎng)問(wèn)到圖片資源的,因?yàn)槭庆o態(tài)資源訪(fǎng)問(wèn)并且訪(fǎng)問(wèn)路徑是相對(duì)路徑,所以資源訪(fǎng)問(wèn)的起始點(diǎn)是服務(wù)器根目錄,所以會(huì)在localhost:9090/cmz_ReviewMybatis/images/a.png下訪(fǎng)問(wèn),結(jié)合項(xiàng)目在服務(wù)器根目錄下的目錄結(jié)構(gòu),顯然是可以訪(fǎng)問(wèn)到的。
    • <2>如果我們?cè)L問(wèn)localhost:9090/cmz_ReviewMybatis/homework/people/selAll,也就是訪(fǎng)問(wèn)servlet,并轉(zhuǎn)發(fā)到index.jsp,則可以訪(fǎng)問(wèn)到數(shù)據(jù)庫(kù)數(shù)據(jù),但是訪(fǎng)問(wèn)不到圖片了,因?yàn)樵L(fǎng)問(wèn)的是靜態(tài)資源并且是相對(duì)路徑,所以參照點(diǎn)和起始點(diǎn)是服務(wù)器根目錄,所以會(huì)在localhost:9090/cmz_ReviewMybatis/homework/people/images/a.png下尋找,但是在服務(wù)器中資源并不放在這個(gè)位置,而放在localhost:9090/cmz_ReviewMybatis/images/a.png這個(gè)位置,所以自然訪(fǎng)問(wèn)不到。

    (4)如果我們將圖片資源路徑設(shè)置為/images/a.png

    • <1>直接訪(fǎng)問(wèn)主頁(yè),訪(fǎng)問(wèn)不到圖片
    • <2>通過(guò)轉(zhuǎn)發(fā)回到index.jsp訪(fǎng)問(wèn)資源,仍然獲取不到圖片資源

    總結(jié)

    對(duì)于相對(duì)路徑和絕對(duì)路徑來(lái)說(shuō),我們最好書(shū)寫(xiě)絕對(duì)路徑,如果書(shū)寫(xiě)相對(duì)路徑,則要想好該相對(duì)路徑轉(zhuǎn)化為絕對(duì)路徑是什么。并且要根據(jù)請(qǐng)求是轉(zhuǎn)發(fā)還是非轉(zhuǎn)發(fā)請(qǐng)求來(lái)對(duì)相對(duì)路徑選擇不同的參照點(diǎn),轉(zhuǎn)發(fā)的起始點(diǎn)/是項(xiàng)目根目錄,而重定向或者靜態(tài)資源請(qǐng)求的起始點(diǎn)/則是服務(wù)器根目錄。

    總結(jié)

    以上是生活随笔為你收集整理的面试——路径、转发与重定向的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。