欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

${pageContext.request.contextPath}和<%=request.getContextPath()%> 的区别 博客分类: 项目代码  

程序员文章站 2024-02-18 10:33:04
...

       做的一个web项目,需要在jsp页面中获取js、css和图片等资源,本想采用相对路径来写,但是发现可移植性太差,在自己电脑上还好使,但辛辛苦苦调好代码后,放到其他电脑上又得再次辛辛苦苦修改相关路径。于是决定采用绝对路径来写。然后在网上找寻相关方法,发现用的比较多的两个:${pageContext.request.contextPath}和<%=request.getContextPath()%>,但具体用哪个我也不大清楚,于是继续查找两者的区别,但让我郁闷的是,网上“抄袭”的真多啊!而且说了一大堆!尽是些不痛不痒的专业名词,关键的真没几个!所以我决定靠自己理解,现在明白了!我想用一种比较通俗的语言分享一下我对此的认识!

      可以说${pageContext.request.contextPath}等价于<%=request.getContextPath()%>!它们的意思就是取得当前项目名称(或者是--取出部署的应用程序名,不过这么说太官方了,试问有多少人知道“取出部署的应用程序名”的义)
      那么什么是当前的项目名称呢?

      ${pageContext.request.contextPath}和<%=request.getContextPath()%> 的区别
            
    
    博客分类: 项目代码  ${pageContext.request.contextPath}和<%=request.getContextPath()%> 的区别
            
    
    博客分类: 项目代码  

      假定你的web应用名称为hotel,这个hotel就是当前的项目名称,不过你在浏览器中输入请求路径时,例如输入http//:localhost:8080/hotel/login.jsp 

      ${pageContext.request.contextPath}或<%=request.getContextPath()%>就是从这个请求路径(URL)上截取(是截取) /hotel ,看清楚,前面是有"/",而这个“/”代表的是"http//:localhost:8080",看清楚这里是没有"/"的!

      对应到真是的物理地址,即为图中WebContent目录!

      另外,如果你是在Tomcat的server.xml文件中配置了虚拟目录,例如

      ${pageContext.request.contextPath}和<%=request.getContextPath()%> 的区别
            
    
    博客分类: 项目代码  

      那么我们在对应的物理目录F:\javaweb中创建test_jsp.jsp文件,内容为

      ${pageContext.request.contextPath}和<%=request.getContextPath()%> 的区别
            
    
    博客分类: 项目代码   

      开启Tomcat,进行测试,发现输出结果为

      ${pageContext.request.contextPath}和<%=request.getContextPath()%> 的区别
            
    
    博客分类: 项目代码  

      可以看到,此时输出为虚拟目录,并且二者完全等价!

      因此,在表单<formaction="${pageContext.request.contextPath}/hotel/login.jsp">中,这样写路径永远对,翻译过来${pageContext.request.contextPath}/hotel/login.jsp其中的含义,就是http//:localhost:8080/hotel/login.jsp,相当于你写了一全路径!当然前提是你的JSP页面等等必须放置的位置正确才可以,所以才说明路径永远正确。

       为什么这么要做呢?因为学过一些MVC模式的程序员都知道,JSP的作用是用来显示的(表现的),其他的作用最好不要在这个页面上显示,尤其是Java代码!所以就用EL表达式来替代类似有“<%%>”这样的代码格式。