jsp中常常出现的pageContext.request.contextPath
- 这里面涉及几个知识点: EI表达式, jsp内置对象, 以及EI表达式的内置对象
- jsp内置对象主要涉及四个域对象:
在学习jsp时,经常能看到 ${pageContext.request.contextPath} 这种写法而疑惑,通过上网查阅很多资料,写下自己的理解与感悟, 这篇博客主要是讲一下关于这个的EI表达式用法.
首先我们需要知道这里面涉及的知识点EI表达式及其内置对象,jsp内置对象
- jsp内置对象(主要为4个域对象)
jsp里面主要有9个内置对象,我们通常用四个"特殊"对象,也就是域对象,这是jsp内置的对象,我们可以直接用,通过形如: <%=request.getContextPath()%> 或者 <% request.getContextPath()%> 的两种形式(<%= … >和<%=…>)
PageContext 的实例对象 : pageContext
HttpServletRequest 实例对象 : request
HttpSession 实例对象 : session
ServletContext 实例对象 : application
(一定要注意后面加黑的才是对象名字,才是我们可以直接在jsp中用的)
- EI表达式子及内置对象
EI表大致主要是jsp获取数据的一种规范,或者说简易写法(比如获取域对象内的信息,或者表单数据等),语法主要为 ${…}
EI内置对象主要有11个:
这里面除了pageContext 外,其余的形如 pageScope requestScope param等10个均为指向一个Map对象(集合), 如requestScope 代表 request 域中用于保存属性的 Map 对象, 仅仅有pageContext为域对象,为域对象,为域对象.
也就是说,在EI表达式中,仅仅可以用这么一个域对象+11个map 集合,对于其他三个域对象中的除了Map集合外的其他内容,我们是没办法使用的,也没办法使用其他域对象的方法.至少没办法直接使用
但是,神奇的 pageContext 不仅可以在EI中直接使用,在jsp中也能直接使用,且代表意思完全相同,于是,这就是一个桥梁!
比如,通过pageContext对象的getRequest()方法,我们可以获得Request域对象!
pageContext.getRequest() ${pageContext.request}
后者即为我们在EI中的简易写法
于是最终答案呼之即出:
${pageContext.request.contextPath}
即为: 先获得request对象.底层通过getRequest()方法
然后再获得contextPath:当前应用的虚拟目录, 底层通过调用request对象的getContextPath()方法
这里是引用一个其他博文言简意赅的写法: ${pageContext.request.contextPath}等价于<%=request.getContextPath()%> 或者可以说是<%=request.getContextPath()%>的EL版 意思就是取出部署的应用程序名或者是当前的项目名称
比如我的项目名称是ajax01 在浏览器中输入为http://localhost:8080/ajax01/login.jsp ${pageContext.request.contextPath}或<%=request.getContextPath()%>取出来的就是/ajax01,而"/"代表的含义就是http://localhost:8080
所以我们项目中应该这样写${pageContext.request.contextPath}/login.jsp4
来源: https://blog.csdn.net/u011161002/article/details/84087364
- 一个有趣的写法:
<% String path = request.getContextPath(); %>
<% String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; /%>
这个语句是用来拼装当前网页的相对路径的,
request.getSchema() 可以返回当前页面使用的协议,就是上面例子中的“https”。
request.getServerName() 可以返回当前页面所在的服务器的名字,就是上面例子中的“localhost"。
request.getServerPort() 可以返回当前页面所在的服务器使用的端口,就是80。
request.getContextPath() 可以返回当前页面所在的应用的名字,就是上面例子中的demo1。
这四个拼装起来的 basePath ,就是当前应用的跟路径了,
组合起来就是:https://localhost:80/demo1/
参考链接:https://blog.csdn.net/ITBigGod/article/details/82886359
参考链接:https://blog.csdn.net/w_linux/article/details/79850223
参考链接:https://blog.csdn.net/qq_38181976/article/details/73087383