约束:

  1. 相对路径概念-./代表当前目录、../代表上级目录
  2. 示例的所有文件都基于http://127.0.0.1:8080/test路径开放,test为对应的contextPath

前端

  1. HTML标签的imglinkscriptform标签
  2. css文件的background属性
  3. js文件的ajax请求,这里特指Jquery插件

HTML标签

  1. img标签的src属性

    绝对路径-语法为/开头,其绝对路径是基于[scheme]://[serverName]:[port]此路径

    相对路径-语法为./或者../开头,相对的是当前html文件的路径

    示例:

    <img src="/test/info/img/1234.png",即正确的引用需要带上contextPath
  2. link标签的href属性

    相对路径是相对于当前html文件的路径,绝对路径是相对于[scheme]://[serverName]:[port]此路径,示例如下

<link ref="/test/css/default.css">,即也必须带上`contextPath`
  1. script标签的src属性

    此处路径约束类同link标签,示例如下
<script type="text/script" src="/test/js/default/js">  //即也必须带上contextPath
  1. form标签的action属性

    此处路径约束类同link标签,示例如下
<form action="${basePath}/info/get"></form>	//必须携带contextPath

CSS

  1. background/background-img属性

    此处路径类同HTML标签的img/link/script标签,示例如下
background:url(/test/info/img/1234.png) no-repeat center;//即必须带上contextPath

Jquery

  1. ajax请求的url路径

    • 绝对路径的写法与上述的标签写法类同,即必须带上contextPath,示例如下
    	$.ajax({
    url:"/test/info/msg/get",
    type:"get",
    data:{},
    callback:function(data){
    }
    });
    • 相对路径是相相对于当前html引入文件的路径,示例如下
    test.html文件引入下述js文件,其中test.html对应的绝对路径为http://127.0.0.1:8080/test/info/msg/test.html
    <script src="/test/static/info/msg/manager.js"></script>
    $.ajax({
    url:"list" //请求的路径为`http://127.0.0.1:8080/test/info/msg/list`
    //url:"./list" //同上
    //url:"../../info/content/get" //请求为`http://127.0.0.1:8080/test/info/content/get`
    });

前台使用小结

  1. HTML标签的imglinkscriptform标签以及css文件中的background属性均遵循以下规则:
  • /开头,此路径均是相对于[scheme]://[serverName]:[port]此路径,在本文中便是http://127.0.0.1:8080,所以如果在Tomcat/Jetty这样的web容器中,倘若contextPath不为空,则务必带上contextPath属性

  • 所有的资源加载路径建议均转换为绝对路径加载,以免不必要的404错误

  1. Jqueryajax api中的url路径
  • 绝对路径的概念与第一点一致并建议使用绝对路径来进行访问,其中的contextPath可以通过前端模板视图工具,比如freemarker:<#assign basePath='${Application["basePath"]}'/>来建立全局变量

  • 相对路径的编写则需要注意

    I. html文件或者JSP页面在Tomcat/Jetty等web容器中的绝对访问路径是什么,比如spring mvc会对html页面的映射有一定的配置,所以所有的访问路径均需要转化为访问controller层的路径,即关注@Controller中的@RequestMapping()注解

    II. 在明白上述第一点的情况下,在上述绝对路径的基础上使用相对路径的规则即可

后端

这里只罗列下servlet关于路径的api以及spring mvc的路径使用

Servlet获取路径

示例路径为http://127.0.0.1:8080/test/info/msg/manager.html

  • request.getContextPath()

    返回上下文路径,此处为/test

  • request.getServletPath()

    返回servlet对应的路径,此处为/info/msg/manager.html,即不包含contextPath

  • request.getRequestURI()

    返回请求的完整路径,此处为/test/info/msg/manager.html,即包含contextPath

spring mvc的路径配置

    <!-- 静态资源映射 -->
<mvc:resources mapping="/static/**" location="/static/"/>
<!-- 视图配置 即对html页面的映射-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="true" />
<property name="prefix" value="pages/" />
<property name="suffix" value=".html" />
<property name="contentType" value="text/html;charset=UTF-8" />
<!-- 设置requestContext变量的名称 -->
<property name="requestContextAttribute" value="request" />
<!-- 配置是否在生成模板内容之前把HTTPsession中的数据放入model中 -->
<property name="exposeSessionAttributes" value="true" />
<!-- 配置是否在生成模板内容之前把HTTPrequest中的数据放入model中 -->
<property name="exposeRequestAttributes" value="true" />
<!-- 使用spring lib时 是否暴露 RequestContext 变量 默认为true -->
<property name="exposeSpringMacroHelpers" value="true" />
</bean>
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer>
<property name="templateLoaderPath" value="/WEB-INF/views/" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0</prop>
<prop key="default_encoding">utf-8</prop>
<prop key="number_format">0.##########</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="classic_compatible">true</prop>
<prop key="template_exception_handler">ignore</prop>
</props>
</property>
</bean>

简单看下其相关的Controller层对页面的路径映射,前台的ajax请求的相对路径便可针对此处的@RequestMapping()注解来完成相应的编写

@Controller
public class HtmlPageControl {
@RequestMapping(value="/**/*.html")
public void redirect(HttpServletRequest request){
String contextPath = request.getContextPath() ;
//设置basePath让前台获取
if(request.getSession().getServletContext().getAttribute("basePath")==null){}
request.getSession().getServletContext().setAttribute("basePath",contextPath) ;
}
//返回为**/*的模式
String requestURI = request.getRequestURI() ;
int start = contextPath.length() + 1;
int end = requestURI.lastIndexOf(".html") ; return requestURI.substring(start,end) ;
}
}

小结

  1. 此点切记:前台对于后台spring mvc需要确认html/jsp资源在其Controller层的映射,因为js文件只是被HTML/JSP文件所包含,所以ajax请求中的url属性如果采用相对路径则是针对HTML/JSP文件在Controller中的路径
  2. 前台所有的请求路径均建议使用绝对路径来完成

web开发过程中关于路径问题的总结的更多相关文章

  1. JAVA WEB项目中各种路径的获取

    JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报  分类: JAVA开发(41)  1.可以在s ...

  2. web开发中目录路径问题的解决

    web开发当中,目录路径的书写是再常用不过了,一般情况下不会出什么问题,但是有些时候出现了问题却一直感到奇怪,所以这里记录一下,彻底解决web开发中路径的问题,开发分为前端和服务端,那么就从这两个方面 ...

  3. web项目中各种路径的获取(复制,为以后好找资源)

    web项目中各种路径的获取 1.可以在servlet的init方法里 String path = getServletContext().getRealPath("/"); 这将获 ...

  4. WEB应用中的路径问题及乱码问题

    1 WEB应用中的路径问题  在web应用中,由于使用转发跳转路径时,地址栏不变.此时使用相对路径(../)存在404现象. 故使用绝对路径,解决web应用的路径问题. 什么是绝对路径,以 “/” 开 ...

  5. web开发过程中经常用到的一些公共方法及操作

    进化成为程序猿也有段岁月了,所谓的经验,广度还是依旧,只不过是对于某种功能有了多种实现方式的想法.每天依旧不厌其烦的敲打着代码,每一行代码的回车似乎都有一种似曾相识的感觉.于是乎:粘贴复制,再粘贴再复 ...

  6. 理解java Web项目中的路径问题

    本文以项目部署在tomcat服务器为例,其他相信也是一样的. 先说明请求页面的写法,在web中,页面路径主要写的有以下几种 1.请求重定向 2.浏览器的请求被服务器请求到新页面(我称为“转发”) 3. ...

  7. web项目中的路径问题

    “/”表示根路径 1.“/”代表的意思不是固定的,是要根据具体的方法,才能知道在该方法中"/"所代表的含义,同样相对路径也不是固定的,需要根据具体的方法来判断具体是相对哪个路径的相 ...

  8. 解决servlet在web.xml中的路径跳转问题

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" ...

  9. Web开发中的路径问题总结

    原文地址:http://zzqrj.iteye.com/blog/806909 路径问题在Web开发中算是令人比较蛋疼的问题,尤其是用相对地址时,同样的代码,在不同的目录结构中竟然会出现有对有错的结果 ...

随机推荐

  1. 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...

  2. Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3)(A.B.C,3道暴力题,C可二分求解)

    A. Is it rated? time limit per test:2 seconds memory limit per test:256 megabytes input:standard inp ...

  3. 大区间素数筛选(POJ 2689)

    /* *POJ 2689 Prime Distance *给出一个区间[L,U],找出区间内容.相邻的距离最近的两个素数和距离最远的两个素数 *1<=L<U<=2147483647 ...

  4. java实现死锁的demo

    死锁 只有当t1线程占用o1且正好也需要o2,t2此时占用o2且正好也需要o1的时候才会出现死锁,(类似于2个人拿着两个筷子吃饭,都是需要对方的一根筷子才能吃) 以下代码t1线程占用o1,并且获取到o ...

  5. Java Web学习路线图

    三张Java Web完整学习路线图,阶段一和JavaSE部分可不学

  6. dedecms利用memberlist标签调用自定义会员模型的会员信息

    [摘要]本文讲一下dedecms如何利用memberlist标签调用自定义会员模型的会员信息. dedecms利用memberlist标签调用自定义会员模型的会员信息,这个问题找了很久,官方论坛提问过 ...

  7. intellij idea on update action\on frame deactivation ||Servlet 页面不同步问题

    当修改servlet源码时,对应的servlet页面即使刷新也不会改变,,,很烦躁 因为xx.java需要编译成xx.class后,再部署到服务器上才可以运行,所以问题就是服务器里的类文件并没有更新. ...

  8. 5分钟把任意网站变成桌面软件--windows版

    本文源自于segmentfault的一篇专栏文章:https://segmentfault.com/a/1190000012924855  只不过这篇是MAC版本的,所以我试了下windows版的: ...

  9. mybatis实战教程三:多对多关联

    MyBatis3.0 添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作 一.创建student.te ...

  10. Java并发编程的艺术读书笔记(2)-并发编程模型

    title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...