JavaEE 项目的页面( html, jsp)引用资源时的路径真不好整,请问最佳实践是什么 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abcbuzhiming
V2EX    Java

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

  •  
  •   abcbuzhiming 2017-05-22 22:22:08 +08:00 5480 次点击
    这是一个创建于 3066 天前的主题,其中的信息可能已经有所发展或是发生改变。
    javaee 项目都是部署在 Servlet 容器服务器里,典型的如 Tomcat 和 Jetty,这类项目有个特点,他们给你的访问地址都是带 app 路径的,比如
    http://localhost/ebapp/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 作为模板文件格式会怎么样?
    lotmany
        18
    lotmany  
       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     Solana     3692 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 05:06 PVG 13:06 LAX 22:06 JFK 01:06
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86