jsp为什么会用pageContext获取jsp内置对象requestt在调用contextPath(),会出现方法未定义错误呢?

${pageContext.request.contextPath}和&%=request.getContextPath()%&
做的一个web项目,需要在jsp页面中获取js、css和图片等资源,本想采用相对路径来写,但是发现可移植性太差,在自己电脑上还好使,但辛辛苦苦调好代码后,放到其他电脑上又得再次辛辛苦苦修改相关路径。于是决定采用绝对路径来写。然后在网上找寻相关方法,发现用的比较多的两个:${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文件中配置了虚拟目录,例如
那么我们在对应的物理目录F:\javaweb中创建test_jsp.jsp文件,内容为
开启Tomcat,进行测试,发现输出结果为
可以看到,此时输出为虚拟目录,并且二者完全等价!
因此,在表单&formaction="${pageContext.request.contextPath}/hotel/login.jsp"&中,这样写路径永远对,翻译过来${pageContext.request.contextPath}/hotel/login.jsp其中的含义,就是http//:localhost:8080/hotel/login.jsp,相当于你写了一全路径!当然前提是你的JSP页面等等必须放置的位置正确才可以,所以才说明路径永远正确。
为什么这么要做呢?因为学过一些MVC模式的程序员都知道,JSP的作用是用来显示的(表现的),其他的作用最好不要在这个页面上显示,尤其是Java代码!所以就用EL表达式来替代类似有“&%%&”这样的代码格式。
没有更多推荐了,html 页面中 $(request.contextPath) 的应用有哪些条件,或是注意事项_百度知道
html 页面中 $(request.contextPath) 的应用有哪些条件,或是注意事项
我有更好的答案
&%=request.getContextPath()%&是为了解决相对路径的问题,可返回站点的根路径。但不用也可以吧,比如&a href=&&%=request.getContextPath()%&/catalog.jsp&&我就直接用&a href=&catalog.jsp&&也行啊,这两个文件是在同一个目录下的比如你要生成一个文件放在服务器上得一个目录下,你可以使用request.getContextPath()+/dir,组成一个完整得目录结构!但在JSP文件里,通过request.getContextPath()得到的路径却为空,为什么?你在context中没有配置path属性,所以你的工程文件就是在根目录下,相当于path=&&;即是你直接在浏览器中输入你的服务器ip就会到你的jsp页面,而不是tomcat的默认页面;所以你通过request.getContextPath()得到的字符串是为空的;它是获得虚目录的;如果你想得到工程文件的实际物理路径,可通过:&%=request.getRealPath(&/&)%&,这样页面就会输出:d:/webrequest.getScheme();返回的协议名称,默认是httprequest.getServerName()返回的是你浏览器中显示的主机名getServerPort()获取服务器端口号 request.getContextPath()应该是得到项目的名字,如果项目为根目录,则得到一个&&,即空的字条串,如果项目为abc, &%=request.getContextPath()% &/ 将得到abc/,服务器端的路径则会自动加上,&a href=&XXXX.jsp&& 应该就是指当前路径下的这个xxx.jsp页面,有时候也可以在head里设置html:base来解决路径的问题,不过用的最多的还是request.getContextPath。我想在js文件中得到request.getContextPath()的值,不想在JSP中写太多的Javascript代码一种方法是用hidden&input type=hidden name=contextPath value=&%= request.getContextPath()&再就是在本页面的js里面也是可以使用Scriptlet来赋值的var a = '&%= request.getContextPath()&'或者你赋值给一个hidden的控件都是可以的,然后js取,这样js可以不用写在jsp里
感谢您的回答, 我使用${request.contextPath} 是在html 页面中,同时使用的freemarker 模板技术;
不论是引入 js 或 css 和调用action中的方法, 都应用${requerst.contextPath}得 到根路径,请问在这种情况下使用 ${request.contextPath} 应该怎样操作才能得到相应的根路径
采纳率:36%
el表达式里request域对象的内置对象是使用requestScope的,不过要获取项目名需要用${pageContext.request.contextPath},用${requestScope.contextPath}不能获取
请问:${request.contextPath}为什么有时候可以获取工程名称,有时候获取不到呢?还有${pageContext.request.contextPath}和${request.contextPath}有什么区别呢?我一直觉得${request.contextPath}不知道怎么来的?请教大侠指点.....
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。所有源码均可去github下载【MyGitHub】https://github.com/androidwolf
相对路径与绝对路径 ${pageContext.request.contextPath}
绝对路径:是从盘符开始的路径,形如
C:\windows\system32\cmd.exe
相对路径:是从当前路径开始的路径,假如当前路径为C:\windows
要描述上述路径,只需输入
system32\cmd.exe
实际上,严格的相对路径写法应为
.\system32\cmd.exe
其中,.表示当前路径,在通道情况下可以省略,只有在特殊的情况下不能省略。
假如当前路径为c:\program files
要调用上述命令,则需要输入
..\windows\system32\cmd.exe
其中,..为父目录。
当前路径如果为c:\program files\common files
则需要输入
….\windows\system32\cmd.exe
拿着这理解应该比程序里面好理解得多了。
${pageContext.request.contextPath}等价于&%=request.getContextPath()%&或者可以说是&%=request.getContextPath()%&的EL版
意思就是取出部署的应用程序名或者是当前的项目名称
比如我的项目名称是SpringMVC 在浏览器中输入为http://localhost:8080/SpringMVC/login.jsp
${pageContext.request.contextPath}或&%=request.getContextPath()%&取出来的就是/SpringMVC,而”/”代表的含义就是
所以我们项目中应该这样写${pageContext.request.contextPath}/login.jsp
说一下亲身的例子大概就明白了。这里我先用的是相对路径,很多种情况下都没出错。
你看这个delete操作,我也是用的相对路径,那为甚么不会出错呢,因为请求路径只有一层,没有任何占位符,当HiddenHttpMethodFilter转换为DELETE请求的时候会去掉一层,所以不会出错,请求路径变成http://localhost:8080/emp/1001
但是这个edit就不容乐观了。
本来路径上有占位符的存在,所以转换的时候就不会认全。
就会出现这样的闹剧,请求多层本来就没有Handler处理的路径。
所以告诫大家,请尽可能多的使用相对路径。
没有更多推荐了,为什么在jsp中写${pageContext.request.contextPath }失效了
[问题点数:20分,结帖人hlzw001]
本版专家分:0
结帖率 96.43%
CSDN今日推荐
本版专家分:0
本版专家分:0
本版专家分:84
本版专家分:444
本版专家分:444
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:124
本版专家分:30
本版专家分:177
本版专家分:166
本版专家分:10
匿名用户不能发表回复!|
其他相关推荐pagecontext.request.contextpath我怎么在jsp中打印出来看看这个路径_百度知道
pagecontext.request.contextpath我怎么在jsp中打印出来看看这个路径
我有更好的答案
${pageContext.request.contextPath}样是通过 get方法去取的,先pageContext.getRequest()得到HttpServletRequest对象,再调用 HttpServletRequest的getContextPath方法&% %& 你用pageContext 则必须用 pageContext.getRequest(),点肯定点不出来,又没这个属性作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。El表达式的写法:${pageContext.request.contextPath}jsp的写法:&%=request.getContextPath()%&
采纳率:54%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 jsp获取request 的文章

 

随机推荐