最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaWeb 獲取應用根路徑的實踐指南

 更新時間:2025年08月19日 09:19:46   作者:步行cgn  
本文全面介紹JavaWeb中獲取應用根路徑的多種方法,涵蓋Servlet、JSP、SpringBoot等場景,強調相對路徑與物理路徑的合理使用及安全性驗證,確保不同環(huán)境下的路徑處理一致性和正確性,感興趣的朋友一起看看吧

JavaWeb 獲取應用根路徑的全面指南

在 JavaWeb 開發(fā)中,獲取應用根路徑(上下文路徑)是常見的需求,以下是多種場景下的獲取方式:

一、核心方法匯總

場景獲取方式返回值示例
Servlet 中request.getContextPath()/myapp
JSP 頁面中${pageContext.request.contextPath}/myapp
全局路徑(無請求)getServletContext().getContextPath()/myapp
物理磁盤路徑getServletContext().getRealPath("/")C:\tomcat\webapps\myapp\
Spring 環(huán)境中@Value("${server.servlet.context-path}")/myapp
監(jiān)聽器/過濾器servletContext.getContextPath()/myapp

二、詳細使用場景

1. Servlet 中獲取 (最常用)

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    // 獲取上下文路徑(帶斜杠)
    String contextPath = request.getContextPath();
    // 示例: "/myapp"
    // 構建完整URL
    String homeUrl = contextPath + "/index.html";
    // 示例: "/myapp/index.html"
}

2. JSP 頁面中使用

<!-- 推薦:EL表達式 -->
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css" rel="external nofollow" >
<!-- 傳統(tǒng)腳本 -->
<script>
  const basePath = '<%= request.getContextPath() %>';
</script>
<!-- 超鏈接示例 -->
<a href="${pageContext.request.contextPath}/user/profile" rel="external nofollow" >個人資料</a>

3. 無請求對象時獲取

// 在Servlet的init()方法中
public void init(ServletConfig config) {
    String contextPath = config.getServletContext().getContextPath();
}
// 在自定義工具類中
public class PathUtils {
    public static String getContextPath() {
        return WebApplicationContextUtils
               .getRequiredWebApplicationContext()
               .getServletContext()
               .getContextPath();
    }
}

4. 獲取物理磁盤路徑

// 獲取Web根目錄物理路徑
String realPath = request.getServletContext().getRealPath("/");
// Linux: "/usr/tomcat/webapps/myapp/"
// Windows: "C:\\tomcat\\webapps\\myapp\\"
// 獲取資源物理路徑
String imgPath = getServletContext().getRealPath("/images/logo.png");

三、Spring Boot 特殊處理

1. 配置文件獲取

# application.yml
server:
  servlet:
    context-path: /myapp
// 注入上下文路徑
@Value("${server.servlet.context-path}")
private String contextPath;

2. Controller 中獲取

@GetMapping("/path")
public String getPath(HttpServletRequest request) {
    return "Context Path: " + request.getContextPath();
}

3. Thymeleaf 模板中使用

<!-- 直接使用語法 -->
<a th:href="@{/user/profile}" rel="external nofollow" >Link</a> 
<!-- 自動添加context path -->
<!-- 顯式獲取 -->
<p th:text="${#request.getContextPath()}"></p>

四、路徑拼接最佳實踐

// 安全拼接路徑(避免雙斜杠)
public static String buildPath(String base, String... parts) {
    StringBuilder path = new StringBuilder(base.endsWith("/") ? 
        base.substring(0, base.length() - 1) : base);
    for (String part : parts) {
        if (part.startsWith("/")) part = part.substring(1);
        if (!part.isEmpty()) {
            path.append("/").append(part);
        }
    }
    return path.toString();
}
// 使用示例
String fullPath = buildPath(contextPath, "api", "v1", "user");
// 輸出: "/myapp/api/v1/user"

五、常見問題解決方案

獲取的路徑為空?

// 檢查是否部署在ROOT應用
if (contextPath.isEmpty()) {
    contextPath = "/"; // 或保持空字符串
}

獲取路徑帶額外斜杠

// 規(guī)范化路徑
if (contextPath.endsWith("/")) {
    contextPath = contextPath.substring(0, contextPath.length() - 1);
}

不同環(huán)境路徑處理

String contextPath = request.getContextPath();
String basePath = request.getScheme() + "://" 
                + request.getServerName() + ":" 
                + request.getServerPort() 
                + contextPath;
// 輸出: "http://localhost:8080/myapp"

六、路徑使用場景對比

路徑類型獲取方式適用場景
上下文路徑request.getContextPath()構建資源鏈接、重定向
物理磁盤路徑getRealPath("/")文件上傳/下載、模板讀取
Servlet 路徑request.getServletPath()請求路由分析
完整 URLrequest.getRequestURL()日志記錄、OAuth 回調
相對路徑request.getRequestURI()權限驗證、請求分析

七、企業(yè)級解決方案

1. 全局路徑存儲方案

@WebListener
public class AppContextListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        // 存儲上下文路徑
        sce.getServletContext().setAttribute("ctx", 
            sce.getServletContext().getContextPath());
    }
}
<!-- JSP中直接使用 -->
<link href="${ctx}/css/style.css" rel="external nofollow"  rel="stylesheet">

2. 前端統(tǒng)一配置

// 在base.jsp中
<script>
  window.APP_CONFIG = {
    contextPath: '${pageContext.request.contextPath}'
  };
</script>
// 其他JS中使用
axios.get(APP_CONFIG.contextPath + '/api/data');

3. 安全路徑處理

// 防止路徑遍歷攻擊
public static String safePath(String inputPath) {
    return Paths.get(inputPath)
                .normalize()
                .toString()
                .replaceAll("\\.\\.", ""); // 移除上級目錄引用
}

關鍵原則

  1. 始終使用相對路徑(基于 context path)
  2. 避免硬編碼路徑
  3. 前端資源使用絕對路徑(以 / 開頭)
  4. 文件操作使用物理路徑
  5. 重要操作驗證路徑安全性

通過合理選擇獲取方式,可確保應用在不同部署環(huán)境(開發(fā)/測試/生產(chǎn))中路徑處理的正確性和一致性。

到此這篇關于JavaWeb 獲取應用根路徑的全面指南的文章就介紹到這了,更多相關JavaWeb獲取應用根路徑內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MyBatisPlus利用Service實現(xiàn)獲取數(shù)據(jù)列表

    MyBatisPlus利用Service實現(xiàn)獲取數(shù)據(jù)列表

    這篇文章主要為大家詳細介紹了怎樣使用 IServer 提供的 list 方法查詢多條數(shù)據(jù),這些方法將根據(jù)查詢條件獲取多條數(shù)據(jù),感興趣的可以了解一下
    2022-06-06
  • 淺談java中對集合對象list的幾種循環(huán)訪問

    淺談java中對集合對象list的幾種循環(huán)訪問

    下面小編就為大家?guī)硪黄猨ava中對集合對象list的幾種循環(huán)訪問詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • Spring?IOC中對象的創(chuàng)建、策略及銷毀時機和生命周期詳解

    Spring?IOC中對象的創(chuàng)建、策略及銷毀時機和生命周期詳解

    這篇文章主要介紹了Spring?IOC中對象的創(chuàng)建、策略及銷毀時機和生命周期詳解,Spring默認使用類的空參構造方法創(chuàng)建bean,假如類沒有空參構造方法,將無法完成bean的創(chuàng)建,需要的朋友可以參考下
    2023-08-08
  • 關于Java 并發(fā)的 CAS

    關于Java 并發(fā)的 CAS

    后端開發(fā)鎖成為一個不可避免的話題,今天我們討論的是與之對應的無鎖 CAS。本文會從怎么來的、是什么、怎么用、原理分析、遇到的問題等不同的角度帶你真正搞懂 CAS。
    2021-09-09
  • Java Socket實現(xiàn)簡易聊天室

    Java Socket實現(xiàn)簡易聊天室

    這篇文章主要為大家詳細介紹了Java Socket實現(xiàn)簡易聊天室,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Java如何導出數(shù)據(jù)庫中的所有數(shù)據(jù)表到指定文件夾

    Java如何導出數(shù)據(jù)庫中的所有數(shù)據(jù)表到指定文件夾

    這篇文章主要介紹了Java導出數(shù)據(jù)庫中的所有數(shù)據(jù)表到指定文件夾,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • Java多線程并發(fā)JUC包CountDownLatch閉鎖的實例

    Java多線程并發(fā)JUC包CountDownLatch閉鎖的實例

    這篇文章主要介紹了Java多線程并發(fā)JUC包CountDownLatch閉鎖的實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Java中Thread類詳解及常用的方法

    Java中Thread類詳解及常用的方法

    在java中談到線程,必然少不了Thread類,下面這篇文章主要給大家介紹了關于Java中Thread類及常用的方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • SpringBoot實現(xiàn)ThreadLocal父子線程傳值的幾種方式

    SpringBoot實現(xiàn)ThreadLocal父子線程傳值的幾種方式

    ThreadLocal作為Java中重要的線程本地變量機制,為我們提供了在單個線程內存儲數(shù)據(jù)的便利,但是,當涉及到父子線程之間的數(shù)據(jù)傳遞時,ThreadLocal默認的行為并不能滿足我們的需求,所以本文將介紹在SpringBoot應用中實現(xiàn)ThreadLocal父子線程傳值的幾種方式
    2025-12-12
  • 監(jiān)聽器獲取Spring配置文件的方法

    監(jiān)聽器獲取Spring配置文件的方法

    這篇文章主要為大家詳細介紹了監(jiān)聽器獲取Spring配置文件的方法,很實用的方法,感興趣的小伙伴們可以參考一下
    2016-06-06

最新評論

和田市| 荃湾区| 南汇区| 当雄县| 彰武县| 改则县| 延吉市| 肃宁县| 汉寿县| 错那县| 合肥市| 乐陵市| 南召县| 阜新市| 开原市| 民勤县| 临清市| 循化| 凭祥市| 永仁县| 宁城县| 虎林市| 开阳县| 曲麻莱县| 铁岭县| 东阿县| 洪洞县| 平陆县| 乾安县| 布尔津县| 博乐市| 武定县| 手游| 大田县| 新龙县| 林州市| 凤庆县| 东乡族自治县| 洪雅县| 秀山| 安康市|