Java动态获取项目路径以及出现$%7BpageContext.request.contextPath%7D乱码问题

本文介绍了如何在JSP中动态获取项目路径,并针对出现的因web.xml版本过低导致的问题提供了解决方案,即升级到更高版本的web.xml配置。示例代码展示了在JSP页面中使用${pageContext.request.contextPath}

动态获取项目路径的jsp 文件

<%--
  Created by IntelliJ IDEA.
  User: 74282
  Date: 2022/3/31
  Time: 16:22
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--"${pageContext.request.contextPath}  动态获取 项目路径 : springmvc_quickstart--%>
    <a href="${pageContext.request.contextPath}">
        基本类型参数
    </a>
</body>
</html>

原因

web.xml 版本过低
解决。使用较新版本的web.xml 即可 修改web.xml 配置文件


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
     http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  <display-name>Archetype Created Web Application</display-name>
  </web-app>
<think>首先,用户的问题是关于HTTP状态码404错误,具体路径是/cloudlibrary/admin/${pageContext.request.contextPath}/book/selectNewbooks在Apache Tomcat/7.0.47中资源不可用。我需要基于提供的引用来解决这个问题。 回顾引用: - 引用[1]:展示了index页面上的跳转链接,使用了${pageContext.request.contextPath}来获取上下文路径。 - 引用[2]:提到在web.xml中配置session-timeout。 - 引用[3]:描述了如何在web.xml中配置Servlet的访问地址。 - 引用[4]:展示了一个Spring控制器示例,使用@RequestMapping来映射路径。 用户的问题涉及路径/cloudlibrary/admin/${pageContext.request.contextPath}/book/selectNewbooks。注意路径中包含了${pageContext.request.contextPath},这可能是个问题,因为在运行时这个表达式不会被解析;它应该是在JSP中使用的,但在URL中直接使用会导致Tomcat找不到资源。 关键点: - ${pageContext.request.contextPath} 是JSP表达式,用于获取上下文路径(例如,/cloudlibrary)。 - 在URL中直接使用${pageContext.request.contextPath}作为字符串部分,Tomcat会尝试字面解释,而不是解析它。所以路径变成了字面上的/cloudlibrary/admin/${pageContext.request.contextPath}/book/selectNewbooks,这显然不正确。 可能的原因: 1. **路径配置错误**:在链接或配置中,错误地使用了未解析的表达式。 2. **Servlet映射问题**:如果selectNewbooks是一个Servlet或控制器的端点,映射可能不正确。 3. **上下文路径问题**:上下文路径(context path)在部署时可能不匹配。 从引用中提取相关解决方案: - 引用[1]:在JSP中正确使用${pageContext.request.contextPath}来构建链接,例如:<a href="${pageContext.request.contextPath}/user/jumplogin">登录</a>。这表明在JSP中,应该这样使用表达式。 - 引用[3]:配置Servlet的url-pattern,例如<url-pattern>/hello</url-pattern>。确保映射正确。 - 引用[4]:Spring控制器使用@RequestMapping("/admin")和@RequestMapping("/login.action"),所以路径应该基于控制器的映射。 用户路径是/cloudlibrary/admin/${pageContext.request.contextPath}/book/selectNewbooks。分析: - /cloudlibrary 可能是上下文路径。 - /admin 可能是一个子路径。 - ${pageContext.request.contextPath} 应该是上下文路径,但在这里是硬编码的字符串。 - /book/selectNewbooks 可能是端点。 在运行时,${pageContext.request.contextPath} 应该被替换为实际上下文路径(例如/cloudlibrary),所以完整路径应该是/cloudlibrary/admin/cloudlibrary/book/selectNewbooks,这看起来重复了上下文路径,导致404错误。 解决方案: 1. **修复链接中的表达式**:确保在JSP页面中,使用${pageContext.request.contextPath}来动态构建路径,而不是在URL中硬编码它。 2. **检查Servlet映射**:确认book/selectNewbooks端点是否正确映射到Servlet或控制器。 3. **简化路径**:移除不必要的部分,避免路径冗余。 步骤解决: - 在JSP中,链接应该写成:<a href="${pageContext.request.contextPath}/admin/book/selectNewbooks">链接文本</a>。 - 这样,${pageContext.request.contextPath}解析为/cloudlibrary,最终路径为/cloudlibrary/admin/book/selectNewbooks。 如果selectNewbooks是一个Servlet,检查web.xml中的映射: - 如引用[3],确保有类似<url-pattern>/book/selectNewbooks</url-pattern>的配置。 或者,如果是Spring控制器,如引用[4],检查@RequestMapping: - 确保有@Controller和@RequestMapping("/book")之类。 用户提到Tomcat版本7.0.47,但引用中没有特定版本问题。 最终回答结构: 1. **问题分析**:解释为什么出现404错误。 2. **解决方案**:建议修复路径中的表达式使用。 3. **代码示例**:展示如何在JSP中正确编写链接。 4. **相关引用**:自然地添加引用标识,如[^1]。 生成相关问题: - 基于常见Tomcat问题。 确保遵循系统级指令: - 数学表达式用$...$,但这里可能不需要。 - 独立公式用$$...$$,不需要。 - LaTeX语法正确。 - 用中文回答。 - 生成相关问题。 - 引用末尾添加标识。 回答用户上次问题:用户之前的问题是404错误,现在详细询问。 </think> ### 解决HTTP状态码404错误(路径:/cloudlibrary/admin/${pageContext.request.contextPath}/book/selectNewbooks) HTTP状态码404表示请求的资源在服务器上不可用。根据您提供的路径 `/cloudlibrary/admin/${pageContext.request.contextPath}/book/selectNewbooks` 和 Tomcat 7.0.47 环境,问题可能源于路径配置错误。具体分析如下: #### 问题分析 1. **路径表达式未解析**: - `${pageContext.request.contextPath}` 是JSP中的表达式语言(EL),用于动态获取Web应用的上下文路径(例如 `/cloudlibrary`)。但在URL中直接使用该表达式作为字符串(如您的路径所示),Tomcat会将其视为字面值,而不会解析。结果,请求路径变为字面意义上的 `/cloudlibrary/admin/${pageContext.request.contextPath}/book/selectNewbooks`,Tomcat无法匹配任何资源,导致404错误。 - 正确用法应在JSP页面中使用EL动态构建路径,例如:`<a href="${pageContext.request.contextPath}/admin/book/selectNewbooks">链接</a>`。这样在运行时,`${pageContext.request.contextPath}` 会被替换为实际上下文路径(如 `/cloudlibrary`),形成有效路径 `/cloudlibrary/admin/book/selectNewbooks`。 2. **Servlet或控制器映射问题**: - 如果 `/book/selectNewbooks` 是一个Servlet端点,需检查web.xml中的`<url-pattern>`配置是否正确。例如,引用[3]中展示了Servlet映射的示例,确保`<url-pattern>`与请求路径匹配(如 `<url-pattern>/book/selectNewbooks</url-pattern>`)。如果映射不匹配,Tomcat无法路由请求[^3]。 - 如果使用Spring MVC框架(如引用[4]),需验证控制器中的`@RequestMapping`是否正确定义。例如,控制器类应有注解如 `@RequestMapping("/book")`,方法注解如 `@RequestMapping("/selectNewbooks")`,以确保路径映射一致[^4]。 3. **上下文路径冗余**: - 您的路径中包含了重复的上下文路径(`/cloudlibrary/admin/${pageContext.request.contextPath}`)。上下文路径在部署时已包含(如 `http://localhost:8080/cloudlibrary/...`),因此在URL中再次添加会导致路径无效。简化路径为 `/admin/book/selectNewbooks`(在JSP中动态构建)可避免此问题。 #### 解决方案 按步骤修复问题,确保路径正确解析和映射: 1. **在JSP页面中修复路径表达式**: - 不要将 `${pageContext.request.contextPath}` 硬编码在URL中。在链接或表单中使用EL动态生成路径。 - 示例代码(基于引用[1]的风格): ```jsp <a href="${pageContext.request.contextPath}/admin/book/selectNewbooks">访问selectNewbooks</a> ``` - 这样,运行时路径变为 `/cloudlibrary/admin/book/selectNewbooks`(假设上下文路径为 `/cloudlibrary`),Tomcat能正确匹配资源。 2. **检查并修正Servlet或控制器映射**: - **如果使用Servlet**:在web.xml中验证映射。例如: ```xml <servlet> <servlet-name>BookServlet</servlet-name> <servlet-class>com.example.BookServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>BookServlet</servlet-name> <url-pattern>/book/selectNewbooks</url-pattern> </servlet-mapping> ``` 确保`<url-pattern>`与简化后的路径 `/book/selectNewbooks` 匹配[^3]。 - **如果使用Spring MVC**:检查控制器代码。参考引用[4],确保路径映射正确: ```java @Controller @RequestMapping("/book") public class BookController { @RequestMapping("/selectNewbooks") public String selectNewbooks() { // 业务逻辑 return "viewName"; } } ``` 这样,请求 `/cloudlibrary/book/selectNewbooks` 会被正确路由[^4]。 3. **验证部署和上下文路径**: - 确认Web应用部署在Tomcat的上下文路径 `/cloudlibrary` 下。您可以在Tomcat的`server.xml`或应用部署描述符中设置。 - 重启Tomcat后,测试简化路径(如直接访问 `http://localhost:8080/cloudlibrary/admin/book/selectNewbooks`)以验证是否解决404错误。 #### 常见错误排查 - **Tomcat日志检查**:查看Tomcat的`catalina.out`日志,搜索WARN或ERROR信息,确认资源映射失败的具体原因。 - **路径大小写敏感**:Tomcat路径是大写敏感的,确保URL中的大小写与代码中一致。 - **缓存问题**:清除浏览器缓存或使用隐身模式测试,避免旧路径缓存影响。 如果问题持续,提供更多上下文(如相关JSP或控制器代码),我可以进一步诊断。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值