【问题标题】:JavaScript file not found if I use sub-resource in Jersey's @Path annotation如果我在 Jersey 的 @Path 注释中使用子资源,则找不到 JavaScript 文件
【发布时间】:2024-05-29 14:30:02
【问题描述】:

我有一个 Jersey REST Web 服务,这是我的 URL 路径 http://localhost:8080/myapp/account/home 的资源类。

@Path("account/home")
public class AccountResources {

    @GET
    @Produces(MediaType.TEXT_HTML)
    public Viewable displayForm() {
        return new Viewable("/homepage.html");
    }
}

HTML 文件 homepage.html 与 JavaScript 文件链接,该文件应从服务器上的 js/jump.js 加载:

<script src="js/jump.js"></script>

但是,当我启动我的 web 应用程序并打开 http://localhost:8080/myapp/account/home(基本上是 homepage.html)时,JavaScript 文件 js/jump.js 没有加载。所以我必须添加上下文根路径/myapp/ 才能使其工作:

<script src="/myapp/js/jump.js"></script>

这并不漂亮,因为上下文根路径/myapp 可以稍后更改。所以我不想在我的 HTML 文件中到处添加/myapp。另外,我的 webapp 中的物理目录布局如下:

WebContent
    |
    |_____ homepage.html
    |
    |_____ js
            |
            |____ jump.js

那么为什么我在homepage.html 中使用&lt;script src="js/jump.js"&gt;&lt;/script&gt; 却不起作用,即使物理上js/jump.jshomepage.html 在服务器上的同一个Web 根目录中?如果我以这种方式使用 @Path 注释,Jersey servlet 是否会更改 HTML 和 JavaScript 文件的相对 URL 路径?我尝试了另一种在没有子资源的情况下使用@Path 的方式:

@Path("account")

这次我可以在我的homepage.html中使用&lt;script src="js/jump.js"&gt;&lt;/script&gt;,如果我打开http://localhost:8080/myapp/account就可以成功加载JS文件。因此,Jersey 的 @Path("account/home") 注释中定义的 URL 路径中的子资源似乎会使 JavaScript 相对文件路径无法搜索。

有什么好办法让双方都开心吗? (即,我可以在 URL 路径中使用这两个子资源,例如 @Path("account/home"),而无需将 js/jump.js 更改为 /myapp/js/jump.js

【问题讨论】:

    标签: java javascript url servlets jersey


    【解决方案1】:

    试着写

    <script src="../js/jump.js"></script>
    

    在您的第一个示例中,服务器评估到 http://localhost:8080/myapp/account/js/jump.js 的相对路径

    但你需要的是:

    http://localhost:8080/myapp/js/jump.js

    所以只要让浏览器知道要向上查找一条路径。 祝你好运!

    【讨论】:

    • 魔术!这工作正常。但这不是有点奇怪,因为 HTML 文件 homepage.html 与服务器上同一 Web 根目录 WebContent 下的 js 文件夹位于同一目录级别。为什么服务器评估相对路径的方式不同?
    • homepage.html 在服务器上的位置无关紧要。 URL 明智的,它在 myapp/account/home 上。并且 js 在 myapp/js/jump.js 上。相对路径删除最后一个 / 之后的最后一个单词并连接新路径。所以你需要摆脱帐户路径。
    最近更新 更多