這裏的疑問在於pageContext和request都是JSP中的內置對象之一,爲何不直接用${request.contextPath}來獲取項目路徑?html
出現這種疑問,實際上是將JSP的內置對象和EL表達式的內置對象混淆了。java
JSP的9大內置對象:web
application:是servletContext的實例,表明JSP所屬的web項目自己服務器
config:是servletConfig的實例,表明當前JSP的配置信息cookie
exception:是java.lang.Throwable的實例,該對象只有在JSP頁面中設置了isErrorPage爲true時,才能使用session
out:jspWriter的實例,表明JSP頁面的輸出流app
page:表明該頁面自己,沒有太大用處
jsp
pageContext:頁面上下文對象htm
request:是httpservletrequest的實例,表明一次請求對象
response:是httpservletresponse的實例,表明服務器的響應
session:是Httpsession的實例,表明一次會話
EL表達式的11個內置對象:(EL表達式的格式${表達式},它是一種簡單的數據訪問方式,是爲了在JSP頁面中不使用Java腳本語言而引進的)
pageContext:表明該頁面的pageContext對象,和JSP的pageContext對象相同
pageScope:用於獲取page範圍內的屬性值
requestScope:用於獲取request範圍內的屬性值
responseScope:用於獲取response範圍內的屬性值
sessionScope:用於獲取session範圍內的屬性值
applicationScope:用於獲取application範圍內的屬性值
param和paramValues:用於獲取請求的參數值
header和headerValues:用於獲取請求頭信息
cookie:用於獲取cookie中的值
initParam:用於獲取web應用的初始化信息
經過以上比較,不難發現EL表達式中只有pageContext對象,而沒有request對象,request對象是JSP的內置對象。那麼在EL表達式中獲取request對象,只能經過${pageContext.request}獲取,同理,response和session對象也得這樣得到。因此在獲取項目絕對路徑時,只能經過${pageContext.request.contextPath}來獲取,對應於Java腳本語言中的<%=request.getContextPath()%>的方式