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中配置了
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
优雅的REST风格的资源URL不希望带.html或.do等后缀,若将DispatcherServlet请求映射配置为“/”,
则SpringMVC将捕获WEB容器的所有请求,包括静态资源的请求,SpringMVC会将他们当成一个普通请求处理,因此找不到对应处理器将导致错误。
解决方法:在SpringMVC的配置文件springmvc.xml中配置
<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>
web应用路径问题(相对路径,绝对路径,动态获取路径)的更多相关文章
- Python获取路径下所有文件名
python 获取当前文件夹下所有文件名 os 模块下有两个函数: os.walk() os.listdir() 1 # -*- coding: utf-8 -*- 2 3 import os 4 ...
- JAVA文件中获取路径及WEB应用程序获取路径方法
JAVA文件中获取路径及WEB应用程序获取路径方法 1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了tes ...
- java web中servlet、jsp、html 互相访问的路径问题
java web中servlet.jsp.html 互相访问的路径问题 在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可 ...
- 完成一个servlet 就要在web.xml里面配一个映射,这样就有一个路径供我们 使用????? servlet从页面接收值?
最后,最容易忘记的是:在dao层中 调用xml里的删除sql语句 后面需要人为加上事务提交.一定要! sqlSession.commit();//jdbc是自动提交,但是mybatis中不是自动提交的 ...
- Java获取路径的方法分析详解(Application/Web)
1.利用System.getProperty()函数获取当前路径: System.getProperty("user.dir");//user.dir用户当前的工作目录,输出:D: ...
- web项目获取路径
Java获取路径的各种方法: (1).request.getRealPath("/"); //不推荐使用获取工程的根路径 (2).request.getRealPath(requ ...
- js相对路径相关(比如:js中的路径依赖导入该js文件的路径)
问题描述: 前几天调用同事的js接口文件,在他自己的html测试页面ok,在我这边调用时出现问题. debug过程中,将该测试html移到其他位置都不行,放到原html测试页面同层次路径下是OK的. ...
- JavaEE 获取路径全攻略
本篇博客是 JavaWeb 应用服务器端在不同环境下获取文件路径的全面总结. 获取文件路径后主要应用的场景,读取 JavaWeb 自定义配置文件.在特定路径下生成各种类型的文件提供下载...... 想 ...
- Java中获取路径的各种方法
1. java文件中获得路径 Thread.currentThread().getContextClassLoader().getResource("") //获得资源文件(.cl ...
随机推荐
- shell编程实战总结
最近复习一下shell,顺便高级进阶一下,之前写脚本能简单尽量简单来,发现好多高深的东西还是没有理解,因此在这里记录一下整个过程并做相应的总结. 通过上代码的方式来介绍,后续可能会调整相应的排版 1. ...
- Linux 的字符串截取很有用。有八种方法。
假设有变量 var=http://www.aaa.com/123.htm 1. # 号截取,删除左边字符,保留右边字符. echo ${var#*//} 其中 var 是变量名,# 号是运算符,*// ...
- 《从零开始学Swift》学习笔记(Day 33)——属性观察者
原创文章,欢迎转载.转载请注明:关东升的博客 为了监听属性的变化,Swift提供了属性观察者.属性观察者能够监听存储属性的变化,即便变化前后的值相同,它们也能监听到. 属性观察者主要有以下两个: l ...
- &#x编码转换成汉字
import java.io.UnsupportedEncodingException; public class UnicodeDecoder { public static String esca ...
- Log4j将不同Package的日志输出到不同的文件
转自:http://www.crazyant.net/1931.html 随着项目规模的越来越大,会不断的引入新的模块,不同的模块都会打印自己的日志,最后就造成日志根本没法查看,比如我自己的项目中,就 ...
- linux磁盘清理
一.背景: 1.由于linux系统空间是由挂载磁盘得来的,但有时装系统时挂载/根目录空间不大,现仅清除用户下载的大文件 二.方法: 1.输入命令df -h显示当前磁盘挂载(包含剩余空间)情况这里写图片 ...
- 普通java工程的resources目录寻址
问题: 普通java工程的src/main/resources目录下的配置文件如何寻址 在src/main/java目录下的代码中如何访问src/main/resources目录下的配置文件? Mav ...
- NSCache类的简单介绍
最近看SDWebImage,里面的内存缓存用到了NSCache这个类,由于以前没有使用过,特此记录学习一下. NSCache NSCache是苹果官方提供的缓存类,用法和NSMutableDicton ...
- a标签里面包含img标签,出现a标签的高度高于img标签好几个px
问题:a标签里面包含img标签,出现a标签的高度高于img标签好几个px 解决: a元素下有一个匿名文本,这个文本外有一个匿名行级盒子,它有的默认vertical-align是baseline的,而且 ...
- 并发 错误 java.lang.IllegalMonitorStateException: current thread not owner 分析
public class ThreadTest implements Callable<String> { public String call() throws Exception { ...