zoukankan      html  css  js  c++  java
  • web应用路径问题(相对路径,绝对路径,动态获取路径)

    1、相对路径和绝对路径

    绝对路径:以 “ / ” 开头的路径,是完整的路径。

    相对路径:不以 “ / ” 开头的路径,是相对于当前web资源目录的路径。

    在绝对路径中, “ / ” 的含义有两种解释:

      (1)如果是服务器端解析, “ / ” 代表相对于当前web应用的绝对路径,即:协议名://服务器名(主机地址):端口号/项目名/,例如:http://localhost:8080/MyTest/。

      (2)如果是浏览器端解析(出现在地址栏里的路径), “ / ” 代表相对于当前服务器的绝对路径,即:协议名://服务器名(主机地址):端口号/,例如:http://localhost:8080/。

    常见的两种绝对路径的例子就是转发重定向

    转发:当浏览器向服务器发送请求的时候,服务器自己不处理,而是调用其他的web资源进行处理。
    重定向:当浏览器向服务器发送请求的时候,服务器返回给浏览器一个特殊的响应,这个特殊的响应告诉浏览器再向另一个地址发送一个请求。
    转发和重定向的区别: 发生在浏览器还是服务器 浏览器的请求次数 浏览器地址栏是否发生变化 浏览器能否感知到
    转发[request] 发生在服务器端 1 不发生变化 感知不到
    重定向[response] 发生在浏览器端 2 发生变化 能感知到

    假设在当前动态web项目MyTest中,项目根目录webContent下有两个页面src.html和des.html。

    src.html中,通过超链接访问项目中的Servlet,此时a标签的地址有浏览器端解析,路径的第一个 “ / ” 代表http://localhost:8080/,如果直接写 " /MyServlet " 就会报404错误。

    <a href="/MyTest/MyServlet">主页</a><!-- /MyTest/MyServlet等价于http://llocalhost:8080/MyTest/MyServlet -->

    在MyServlet中做如下处理,将请求转发到des.html做处理,此时转发器中的地址由服务器解析,路径的第一个 “ / ” 代表http://localhost:8080/MyTest/。

    如果是重定向,重定向中的地址由浏览器解析,路径的第一个 “ / ” 代表http://localhost:8080/,如果直接写 " /des.html " 就会报404错误。

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.getRequestDispatcher("/des.html").forward(request, response); //   /des.html 等价于 http://localhost:8080/MyTest/des.html
    //    response.sendRedirect("/MyTest/des.html"); //
    /MyTest/des.html 等价于 http://localhost:8080/MyTest/des.html
        }

    如果是相对路径的话较简单些,但相比绝对路径,相对路径更容易出错,当页面更换位置时,链接容易失效。

    <a href="MyServlet">主页</a>
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.getRequestDispatcher("des.html").forward(request, response);
    //    response.sendRedirect("des.html");
        }

    但是无论是相对路径还是绝对路径,都容易出问题。

    2、动态获取路径(最不容易出错的方法)

    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <body>
        <!-- 获取当前链接使用的协议;一般应用返回http;SSL返回https; -->
        request.getScheme()===<%=request.getScheme() %><!-- http  -->
        <br>
        <!-- 获取当前页面所在的服务器的名字,如果是在本地的话就是localhost -->
        request.getServerName()===<%=request.getServerName() %><!-- localhost  -->
        <br>
        <!-- 获得服务器的端口号 -->
        request.getServerPort()===<%=request.getServerPort() %><!-- 8080  -->
        <br>
        <!-- 获取当前web应用的根目录 -->
        request.getContextPath()===<%=request.getContextPath() %><!-- /MyTest  -->
        <br>
        basePath===<%=basePath %><!-- http://localhost:8080/MyTest/  -->
        <br>
    </body>

    在java后台同样可以这样获取到路径,但是更多的用于前台的访问路径和js、css、img等静态资源的访问路径问题。

     注意:如果在web.xml中配置了

     1 <servlet>
     2     <servlet-name>springDispatcherServlet</servlet-name>
     3     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     4     <init-param>
     5         <param-name>contextConfigLocation</param-name>
     6         <param-value>classpath:springmvc.xml</param-value>
     7     </init-param>
     8     <load-on-startup>1</load-on-startup>
     9 </servlet>
    10 <servlet-mapping>
    11     <servlet-name>springDispatcherServlet</servlet-name>
    12     <url-pattern>/</url-pattern>
    13 </servlet-mapping>

    优雅的REST风格的资源URL不希望带.html或.do等后缀,若将DispatcherServlet请求映射配置为“/”,

    则SpringMVC将捕获WEB容器的所有请求,包括静态资源的请求,SpringMVC会将他们当成一个普通请求处理,因此找不到对应处理器将导致错误。

    解决方法:在SpringMVC的配置文件springmvc.xml中配置

    <mvc:default-servlet-handler/>
    <mvc:annotation-driven></mvc:annotation-driven>
  • 相关阅读:
    第九周PSP
    c++的继承方式
    matlab的应用
    beta发布的评论
    本周psp
    历年作品点评
    JSON解析数据
    每周工作量及代码统计(第七周)
    词频统计(WEB)版
    评论alpha发布
  • 原文地址:https://www.cnblogs.com/lixiang1993/p/7327385.html
Copyright © 2011-2022 走看看