V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abcbuzhiming
V2EX  ›  Java

JavaEE 项目的页面( html, jsp)引用资源时的路径真不好整,请问最佳实践是什么

  •  
  •   abcbuzhiming · 2017-05-22 22:22:08 +08:00 · 5066 次点击
    这是一个创建于 2771 天前的主题,其中的信息可能已经有所发展或是发生改变。
    javaee 项目都是部署在 Servlet 容器服务器里,典型的如 Tomcat 和 Jetty,这类项目有个特点,他们给你的访问地址都是带 app 路径的,比如
    http://localhost/webapp/xxx/yyy/zzz
    要死就死在这个 app 路径(上下文路径)上,搞的我的模板文件( jsp 或 html 或者别的什么)引用资源的时候,路径完全没法写,你写绝对路径 /assert/a.jpg。结果指向的是 http://localhost/assert/a.jpg,没有 webapp 路径,访问不到,你要搞个相对路径吧:assert/a.jpg,遇到什么 forword,还有 springmvc 之类的地址映射会不知道飞到哪里去。
    我在网上找了半天,也就找到了一个针对 jsp 的方案,改成${pageContext.request.contextPath}/assets/a.jpg,但是问题是这${pageContext.request.contextPath}就只有模板是 jsp 的时候才认啊,换成 html 就不生效了了。

    所以 javaee 项目的模板引用资源文件路径的最佳实践到底是啥?
    26 条回复    2017-07-25 12:34:15 +08:00
    happy1993
        1
    happy1993  
       2017-05-22 22:36:01 +08:00 via Android
    上下文路径不能设置为空吗?
    springmarker
        2
    springmarker  
       2017-05-22 22:38:56 +08:00 via Android
    你用的 eclipse 吧,rootpath 可以设置,idea 启动时默认是没有的
    freestyleyooo
        3
    freestyleyooo  
       2017-05-22 22:45:57 +08:00 via Android
    同问,这个论坛我发现大部分都是搞高科技的前端的,而范围广大的企业级 java 开发却很少有人讨论啊
    dongdongkun
        5
    dongdongkun  
       2017-05-22 23:06:13 +08:00
    贴个我在 eclipse 中用 struts 写的小作业
    ![QQ 截图 20170522225539.png]( https://ooo.0o0.ooo/2017/05/22/5922fdac298bb.png)
    感觉在 jsp 和 php 中引用资源并没什么毛病
    将项目导出 WAR 文件,复制到 tomcat 的 webapps 下可以正常访问
    dongdongkun
        6
    dongdongkun  
       2017-05-22 23:07:38 +08:00
    [接楼上]路径就是 http://localhost:8080/teacher
    abcbuzhiming
        7
    abcbuzhiming  
    OP
       2017-05-22 23:20:33 +08:00
    @happy1993 部署的时候可以,调试的时候怎么做,而且你有没有遇到过调试时需要启动多个项目的情况呢? tomcat 不支持基于端口的虚拟主机部署,这是个大问题
    abcbuzhiming
        8
    abcbuzhiming  
    OP
       2017-05-22 23:21:09 +08:00
    @springmarker rootpath ?你指的 eclipse 上的设置?我找了半天没找到这个配置
    abcbuzhiming
        9
    abcbuzhiming  
    OP
       2017-05-22 23:23:27 +08:00
    @colewp 你说的方法就是我说的办法,但是只能针对 jsp,如果模板是 html 立马完蛋
    abcbuzhiming
        10
    abcbuzhiming  
    OP
       2017-05-22 23:24:05 +08:00
    @dongdongkun 你设置什么呢吧,你贴出来的那张图片地址,项目路径怎么都没了
    abcbuzhiming
        11
    abcbuzhiming  
    OP
       2017-05-22 23:25:26 +08:00
    @dongdongkun 我看到你的图了,你这种更糟好吗,你的项目路径你硬编码写 teacher 在路径里,万一你部署的时候服务器上有个和同名的 webapp 你就傻眼了呢,绝对不用用硬编码来描述( webapp )上下文路径
    dongdongkun
        12
    dongdongkun  
       2017-05-22 23:27:51 +08:00
    贼尴尬!
    SoloCompany
        13
    SoloCompany  
       2017-05-23 00:02:39 +08:00
    这你都搞不定,让你上个 CDN 再弄个资源路径分割啥的岂不是要疯掉?
    Wetoria
        14
    Wetoria  
       2017-05-23 00:19:18 +08:00 via iPhone
    我记得 HTML 有个 basepath?还是 jsp ?没折腾过
    Lonely
        15
    Lonely  
       2017-05-23 02:11:34 +08:00 via iPhone
    jsp 可以用 c:url
    abcbuzhiming
        16
    abcbuzhiming  
    OP
       2017-05-23 08:56:34 +08:00
    @SoloCompany 你有方案提出来啊
    abcbuzhiming
        17
    abcbuzhiming  
    OP
       2017-05-23 08:56:51 +08:00
    @Lonely 不用 jsp 作为模板文件格式会怎么样?
    sunsulei
        18
    sunsulei  
       2017-05-23 09:20:18 +08:00
    找台机器放静态文件嘛,css,js 之类的全扔过去,路径写绝对的外链地址.
    Sharuru
        19
    Sharuru  
       2017-05-23 09:24:56 +08:00
    一般不都是相对路径引用么……

    除此之外,contextPath 是可以设置的……
    各类 template engine 也有不同的解决方案。
    u5f20u98de
        20
    u5f20u98de  
       2017-05-23 10:37:56 +08:00
    <head>
    <script type="text/javascript">
    var path=window.location.origin+'/'+window.location.pathname.split('/')[1]; //取到域名后的第一个目录的全路径
    document.write('<script src="'+path+'/xx.js"><\/script>')
    </script>
    </head>
    1023400273
        21
    1023400273  
       2017-05-23 12:22:50 +08:00
    request.getContextPath()?
    af463419014
        22
    af463419014  
       2017-05-23 14:31:17 +08:00
    我们这里的做法:
    全部 html 改成 jsp

    有的一个 jsp 里就只用${pageContext.request.contextPath}这个功能,其他内容跟原 html 一样
    因为本来 jsp 里写 html 格式也不变,一模一样的
    darrenfang
        23
    darrenfang  
       2017-05-23 20:17:32 +08:00 via iPhone
    <c:set var="path" value="${pageContext.request.contextPath}"/>
    然后用${path}来引用路径
    darrenfang
        24
    darrenfang  
       2017-05-23 20:18:59 +08:00 via iPhone
    @darrenfang 页面都是 jsp,没有 html
    honam
        25
    honam  
       2017-05-24 10:10:40 +08:00
    贼尴尬。。。
    wusj
        26
    wusj  
       2017-07-25 12:34:15 +08:00 via Android
    搭车顺便问一下,要是在 js 文件里又怎么获取这个路径?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2701 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:04 · PVG 23:04 · LAX 07:04 · JFK 10:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.