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

JavaWeb 獲取應(yīng)用根路徑的實(shí)踐指南

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

JavaWeb 獲取應(yīng)用根路徑的全面指南

在 JavaWeb 開(kāi)發(fā)中,獲取應(yīng)用根路徑(上下文路徑)是常見(jiàn)的需求,以下是多種場(chǎng)景下的獲取方式:

一、核心方法匯總

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

二、詳細(xì)使用場(chǎng)景

1. Servlet 中獲取 (最常用)

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

2. JSP 頁(yè)面中使用

<!-- 推薦:EL表達(dá)式 -->
<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" >個(gè)人資料</a>

3. 無(wú)請(qǐng)求對(duì)象時(shí)獲取

// 在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 模板中使用

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

四、路徑拼接最佳實(shí)踐

// 安全拼接路徑(避免雙斜杠)
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"

五、常見(jiàn)問(wèn)題解決方案

獲取的路徑為空?

// 檢查是否部署在ROOT應(yīng)用
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"

六、路徑使用場(chǎng)景對(duì)比

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

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

1. 全局路徑存儲(chǔ)方案

@WebListener
public class AppContextListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        // 存儲(chǔ)上下文路徑
        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("\\.\\.", ""); // 移除上級(jí)目錄引用
}

關(guān)鍵原則

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

    關(guān)于Java 并發(fā)的 CAS

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

    Java Socket實(shí)現(xiàn)簡(jiǎn)易聊天室

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

佛教| 永顺县| 曲麻莱县| 内丘县| 延寿县| 宜都市| 房产| 广东省| 曲阜市| 庄浪县| 巴南区| 梅河口市| 陕西省| 密山市| 大冶市| 佛冈县| 阿巴嘎旗| 苗栗县| 弋阳县| 永平县| 南平市| 麻栗坡县| 阿合奇县| 万州区| 合川市| 鹤山市| 沙洋县| 浮梁县| 长乐市| 龙井市| 黄梅县| 德安县| 临漳县| 大邑县| 青田县| 额济纳旗| 炉霍县| 洞头县| 华宁县| 松滋市| 柳林县|