JSP之项目路径问题(${pageContext.request.contextPath},<%=request.getContextPath()%>以及绝对路径获取)...

本文介绍了一种在服务器上部署项目时遇到的请求路径问题及其解决方法。通过逐步排查,发现原因是服务器端口未正确配置导致请求路径不完整。文章详细记录了从发现问题到最终解决的全过程。

  本随笔这是作为一个记录使用,以备后查。项目完成之后本地部署OK,本地Linux部署OK,都可以正常的访问,可是当我把它部署到服务器上面的时候,首页可以正常访问,可是当发出请求的时候却报错误了,说找不到定义的请求。我很纳闷,本地都OK为什么只有在服务器才能找不到请求。不过按照常理我还是一步一步的来开始排错。

  第一步,查看项目部署成功,和部署路径无关,OK。

  第二步,查看web.xml以及struts的请求配置,完全OK,没有问题。

  第三步,既然部署没有问题,请求配置都OK,如果不是机器的原因那么只有可能是发送请求的路径有问题。

折腾了很久都没有发现第三步中的问题出现在什么地方。因为在每个请求前我以为我都获取了绝对路径,所以和部署的路径位置没有关系。在请求的前面我加了获取绝对路径的EL表达式${pageContext.request.contextPath},我以为这个就可以获取完整的路径,其实不然。因为这个问题,很多时间浪费过去了。我把项目部署在本地直接通过项目名称然后加上请求的方式直接访问,发现是可以的,而当项目部署在服务器上面的时候却不到找到请求的定义。最后我注意到我输入的请求唯一的区别就是一个我都没有加上端口号。

  第四步,会不会是因为端口号引起的问题。如果我本地的端口号改成了和浏览器的80端口号一样,而服务器的端口号我没有修改所以还是8080,而且${pageContext.request.contextPath} 没有能力获取端口号,那么是不是我就等于找到问题了。果然我通过在访问服务器的请求加上了8080端口发现

访问OK,没有问题。这个时候我才意识到我将本地的端口号修改了而服务器的端口号没有修改,而且${pageContext.request.contextPath}不能够获

取端口号,所以找不到请求。项目没问题,部署没问题,问题出现在${pageContext.request.contextPath}获取值上。

  那么我就好奇${pageContext.request.contextPath}, <%=request.getContextPath()%><br/> 获取到具体值到底是什么,他没有获取我想要的http://localName.com:port/项目名称(上下文)吗??通过实验我发现,只是简单做个测试,代码不规范:

  

"request.getContextPath()的值是   "<%=request.getContextPath()%><br/>
"pageContext.request.contextPath的值是"${pageContext.request.contextPath}<br/>

  

通过运行我们发现了<%=request.getContextPath()%>和${pageContext.request.contextPath}获取的结果都是项目名(上下文),而不是我们想要的那个结果,可是如果我们想要获取项目的绝对路径和端口号我们有什么办法呢

  

<%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

通过运行结果可知<%=basePath%>可知结果是

  

 我们获取了我们想要的结果又完整的路径和端口号还有项目的上下文环境,所以大功告成了。我把项目中的${pageContext.request.contextPath}都替换成了<%=basePath%>,然后就完全的解决问题了。

 

第五步,做程序需要自己动手实践而不应该只是想,还是代码最实在靠谱,解决了一个问题,又涨了不少知识,加油。

 

转载于:https://www.cnblogs.com/zhangminghui/p/4122821.html

<think>我们正在处理一个关于JSP中`action="${pageContext.request.contextPath}/login"`的解释请求。根据提供的引用内容,我们可以整合信息来回答。首先,`${pageContext.request.contextPath}`是JSP表达式语言(EL)的一部分,用于获取当前Web应用程序的上下文路径ContextPath)。上下文路径Web应用程序的根路径,通常对应于应用程序部署时的名称。在JSP页面中,当我们写一个表单(form)时,需要指定表单提交的URL。这个URL应该是相对于Web应用程序根路径绝对路径。使用`${pageContext.request.contextPath}`可以动态获取当前应用的上下文路径,这样即使应用程序部署的路径改变,代码也不需要修改。具体到`action="${pageContext.request.contextPath}/login"`:-`action`属性指定了表单提交的地址。-`${pageContext.request.contextPath}`会返回当前Web应用的上下文路径,例如,如果应用部署为`http://localhost:8080/myapp`,那么`${pageContext.request.contextPath}`的值就是`/myapp`。-加上`/login`后,完整的提交路径就是`/myapp/login`,这样表单数据就会被提交到该应用的`login`路径对应的处理程序(如一个Servlet或Controller)。引用[1]提到:在JSP中通过`${pageContext.request.contextPath}`可以获取虚拟目录地址(即上下文路径)。引用[2]展示了在表单的action属性和JavaScript中如何使用它来构建URL。引用[5]进一步说明了当用户点击登录后,表单会提交到`${pageContext.request.contextPath}/login`,然后由对应的Controller(如`UserController`)处理。此外,引用[3]和[4]提到了一些IDE(如IntelliJIDEA)可能不识别`${pageContext.request.contextPath}`的问题,这通常是因为web.xml的版本配置问题,需要更新到支持Servlet3.0或更高版本的配置(如使用web-app_4_0.xsd)。总结:`action="${pageContext.request.contextPath}/login"`的作用是动态生成表单提交的URL,确保无论Web应用程序部署在什么上下文路径下,表单都能正确提交到应用程序的登录处理端点。§§相关问题§§1.为什么在JSP中使用`${pageContext.request.contextPath}`而不是直接写路径?2.如何解决在IDE中`${pageContext.request.contextPath}`不识别的问题?3.在非JSP页面(如HTML)中如何获取上下文路径?</think>### `${pageContext.request.contextPath}/login` 的功能和用途详解 在 JSP 页面中,表达式 `action="${pageContext.request.contextPath}/login"` 主要实现以下核心功能: #### 1. **动态获取应用根路径** - `${pageContext.request.contextPath}` 是 JSP 表达式语言(EL)的语法,用于**动态获取当前 Web 应用的上下文路径(Context Path)**。 - 上下文路径Web 应用的根 URL,例如: - 若应用部署在 `http://example.com/myapp`,则 `contextPath = "/myapp"` - 若部署在根目录(如 `http://example.com`),则 `contextPath = ""` - 这种动态获取方式**避免硬编码路径**,使代码在部署环境变化时无需修改[^1][^5]。 #### 2. **构建完整的请求 URL** - 与 `/login` 拼接后,形成完整的请求路径: `[contextPath]/login` - 例如: - 当 `contextPath="/myapp"` 时,实际路径为:`/myapp/login` - 当 `contextPath=""` 时,实际路径为:`/login` - 该路径指向服务端处理登录请求的端点(如 Servlet 或 Controller)[^2][^5]。 #### 3. **在表单提交中的应用** ```html <form action="${pageContext.request.contextPath}/login" method="post"> <!-- 表单内容 --> </form> ``` - **功能**:表单提交时,浏览器会向 `[contextPath]/login` 发送 POST 请求。 - **用途**:将用户输入的登录数据(如用户名/密码)提交到服务端指定的登录处理逻辑(如 Spring MVC 的 `@Controller`)[^2][^5]。 #### 4. **解决路径问题的关键优势** - **跨环境兼容性**:无论应用部署在根目录还是子路径(如 `/myapp`),都能自动适配正确路径。 - **避免 404 错误**:硬编码路径(如 `<form action="/login">`)在非根部署时会失败,而动态路径保证可靠性[^1][^3]。 - **便于迁移**:应用部署路径变更时无需修改代码。 #### 5. **技术实现原理** - `pageContext` 是 JSP 内置对象,提供访问请求/响应等信息的接口。 - `request.contextPath` 通过 HTTP 请求获取部署路径,本质是 Servlet API 的 `HttpServletRequest.getContextPath()` 的 EL 简化写法[^1][^4]。 #### 6. **IDE 兼容性注意事项** - 部分 IDE(如 IntelliJ IDEA)可能不识别该表达式,需检查 `web.xml` 配置: ```xml <!-- 确保使用支持 EL 的 Servlet 4.0+ 规范 --> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="4.0"> </web-app> ``` 版本过低(如 Servlet 2.3)会导致 EL 失效[^3][^4]。 ### 总结 `action="${pageContext.request.contextPath}/login"` 的核心作用是**动态生成与部署环境无关的表单提交地址**,确保登录请求准确发送到服务端控制器。这是 JSP 开发中处理路径问题的标准实践,兼顾了灵活性和可维护性[^1][^2][^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值