springmvc访问静态资源,以及相对路径,绝对路径问题.

通常状况下,在web工程里,css js png jpg 这类资源文件,由浏览器发起请求,由 tomcat、jetty、nginx 这类进程直接接管,相似于 jfinal、Struts、spring mvc 框架都不会去干预.css


而 WEB-INF 目录下面因为有 jar 包、配置文件等须要被保护的文件,因此 tomcat、jetty 这类 java web 容器自然禁止对 WEB-INF 之下一切资源的访问

所以, css、js 这类文件生来就不该该被放在 WEB-INF 之下,这个是由好久之前的 java web 规范决定的

若是必定要放在 WEB-INF 之下,须要添加 Filter 接管这类资源的请求,而后象 tomcat、jetty 同样将这类资源的内容自行加载并响应给客户端前端

静态资源文件应该都在webapp目录下,目录结构以下:java

假若有须要把静态资源出于安全之类的缘由放在了WEB-INF目录下,那么springmvc应该首先作以下配置:jquery

    <!--静态资源访问  -->
    <mvc:default-servlet-handler/>
    <!--把符合/js/**匹配规则的请求,映射到目录/WEB-INF/js/下-->
    <mvc:resources mapping="/js/**" location="WEB-INF/js/"/>
    <!--<mvc:resources mapping="/img/**" location="WEB-INF/img/"/>-->
    <mvc:resources mapping="/css/**" location="WEB-INF/css/"/>
    <!--<mvc:resources mapping="/commons/**" location="WEB-INF/commons"/>-->
    <!--<mvc:resources mapping="/upload/**" location="WEB-INF/upload/"/>-->

    <!-- 配置ViewResolver视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--这里配置的目的是,把controller返回的逻辑视图名,加入前缀/WEB-INF/jsp/,加入后缀.jsp.例如controller
               返回的是逻辑视图名为test,则会被拼接为/WEB-INF/jsp/test.jsp
        -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

而后在前端页面中调用静态资源.nginx

在调用静态资源的时候,会涉及到路径问题,相对路径和绝对路径.web

1、相对路径和绝对路径
        先解释下相对路径和绝对路径的区别:spring

         网上搜到的内容以下:浏览器

1.什么是绝对路径:tomcat

       你们都知道,在咱们平时使用计算机时要找到须要的文件就必须知道文件的位置,而表示文件的位置的方式就是路径,例如只要看到这个路径:c:/website/img/photo.jpg咱们就知道photo.jpg文件是在c盘的website目录下的img子目录中。相似于这样完整的描述文件位置的路径就是绝对路径。咱们不须要知道其余任何信息就能够根据绝对路径判断出文件的位置。而在网站中相似以http://www.pckings.net/img/photo.jpg来肯定文件位置的方式也是绝对路径。安全

       另外,在网站的应用中,一般咱们使用"/"来表示根目录,/img/photo.jpg就表示photo.jpg文件在这个网站的根目录上的img目录里。可是这样使用对于初学者来讲是具备风险性的,由于要知道这里所指的根目录并非你的网站的根目录,而是你的网站所在的服务器的根目录,所以当网站的根目录与服务器根目录不一样时,就会发生错误。
2.什么是相对路径:

       让咱们先来分析一下为何会发生图片不能正常显示的状况。举一个例子,如今有一个页面index.htm,在这个页面中联接有一张图片photo.jpg。他们的绝对路径以下:
  c:/website/index.htm 
  c:/website/img/photo.jpg

       若是你使用绝对路径c:/website/img/photo.jpg,那么在本身的计算机上将一切正常,由于确实能够在指定的位置即c:/website/img/photo.jpg上找到photo.jpg文件,可是当你将页面上传到网站的时候就极可能会出错了,由于你的网站可能在服务器的c盘,可能在d盘,也可能在aa目录下,更可能在bb目录下,总之没有理由会有c:/website/img/photo.jpg这样一个路径。那么,在index.htm文件中要使用什么样的路径来定位photo.jpg文件呢?对,应该是用相对路径,所谓相对路径,顾名思义就是本身相对与目标位置。在上例中index.htm中联接的photo.jpg可使用img/photo.jpg来定位文件,那么不论将这些文件放到哪里,只要他们的相对关系没有变,就不会出错。

       另外咱们使用“../”来表示上一级目录,“../../”表示上上级的目录,以此类推。(学习过dos的朋友可能更容易理解)

总结:
        我的简单来讲,绝对路径说白了就是完整路径,好比我在同一目录(C:\Users)有A.TXT和B.TXT两个文件,那么绝对路径就是C:\Users\A.txt和C:\Users\B.txt  而绝对路径就是A.txt和B.txt,由于它们两都在C:\Users这个目录下的。

      而咱们经常在页面会用到引用CSS或者图片的,js的,这个时候在页面的前面就须要引用,路径的不对,会致使相关引用也不对。

2、引用路径
那么针对路径,咱们是如何引用呢?这就是第二个问题,引用。

1.${pageContext.request.contextPath}是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%> 

好比个人项目名称叫project,那么${ctx}就是/project

说明下:

假定你的名称为project,你在浏览器中输入请求路径:  
http://localhost:8088/project/list.jsp
则执行下面向行代码后打印出以下结果:  
一、 System.out.println(request.getContextPath()); //可返回站点的根路径。也就是项目的名字  
打印结果:/project
二、System.out.println(request.getServletPath());  
打印结果:/list.jsp  
三、 System.out.println(request.getRequestURI());  
打印结果:/project/list.jsp  
四、 System.out.println(request.getRealPath("/"));  

打印结果:C:\Tomcat 7.0\webapps\project\test 

2.<base href="<%=basePath%>"> 所谓的小脚本

这里的${basePath}得到是绝对路径,好比http://localhost:8088/project/list.jsp,这里的${basePath}是http://localhost:8088/project/ 注意包含最后一个‘/’的。
---------------------

通常状况下,项目最好用绝对路径 <%=basePath%>/js/jquery.js
其中basePath是下面的值
<%
 String path = request.getContextPath();
 String basePath = request.getScheme() + "://"
  + request.getServerName() + ":" + request.getServerPort()
  + path + "/";
%>

为何要这么作?由于从静态的jsp路径来看它和js的路径相对关系是../js/,可是每每不少时候咱们不是直接访问jsp页面的,是经过其余的jsp页面或者servlet,或者struts的action经过forward的方式转发过来访问的,这时候请求的当前路径就不是该jsp的路径,而是转发过来以前那个jsp,servlet或action的路径,因此和js的相对路径关系就可能再也不是../js/了,而在实际使用中,访问同一个jsp可能由不少不一样的来源,那么它的相对路径关系可能随时均可能改变,这时候jsp页面里写死的相对路径就没法访问到对应的资源了。因此要使用绝对路径访问。

例如:
假如咱们要访问这个页面,http://localhost:8080/web/jsp/abc.jsp
abc.jsp的相对路径是http://localhost:8080/web/jsp/,abc.jsp里引用了../js/jquery.js,这时候直接访问abc.jsp是没有问题的。
但若是由如下三个请求转发到abc.jsp来访问
1. http://localhost:8080/web/business/test/test.jsp  
相对路径是http://localhost:8080/web/business/test/,访问js须要使用../../js/jquery.js
2. http://localhost:8080/web/struts/action/test.action
相对路径是http://localhost:8080/web/struts/test/,(?)访问js须要使用../../js/jquery.js

相对路径是http://localhost:8080/web/struts/action/ 3. http://localhost:8080/web/servlet相对路径是http://localhost:8080/web/,访问js须要使用js/jquery.js这时候abc.jsp里的../js/jquery.js的死路径就不能正确访问到js了。===========================================而真正的相对于web工程的绝对路径写法是:/ 表明url根路径,例如http://localhost:8080/web/js/jquery.js里的http://localhost:8080/,而./表明web工程根路径http://localhost:8080/web/因此你还能够这么写:1. /web/js/jquery.js2. ./js/jquery.js

相关文章
相关标签/搜索