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 ...
随机推荐
- sql server 2008 对字段的操作
添加,刪除字段 通用式: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数 增加字段: 增加数字字段,整型,缺省值为0 增加数字 ...
- 关于webpack打包图片的路径问题
在webpack打包的时候,用css-loader的时候,在css文件里用的引用的背景的图片的时候,如果是url()...那么里面的路径不能用相对路径,得用绝对路径,而且必须是带http的,幸好,,, ...
- 删除datatable中的行
今天遇到一问题,无论如何也删除不干净datatable.我想全部删除.但总是得不到想要的结果. ; i < dt.Rows.Count; i++) { //dt.Rows.Remove(dt.R ...
- 在Tomcat配置JNDI数据源的三种方式
最近使用到了在tomcat下配置数据源的内容,在这里转载一篇文章记录下 转载自: http://blog.csdn.net/dyllove98/article/details/7706218 在我过去 ...
- element-UI ,Table组件实现拖拽效果
拖拽效果,先放效果图,步骤放在后面~~ 一.引入三方插件 1.引入sortable.js的包: npm install sortable.js --save 2.或者npm i -S vuedragg ...
- spring(13)------全面深入解析spring的AOP
一,AOP的基本思想 AOP(Aspect Oriented Programming)翻译成中文的大意是面向切面编程,主要目的解决让不该牵扯在一起的代码分离开来. (1)认识AOP 应用程序中通常包含 ...
- 003-Spring 中的StreamUtils
一.概述 StreamUtils是spring中用于处理流的类,是java.io包中inputStream和outputStream,不是java8中Steam.使用时仅依赖spring-core 二 ...
- linux下增加swap分区
Swap交换分区概念 什么是Linux swap space呢?我们先来看看下面两段关于Linux swap space的英文介绍资料: Linux divides its physical RAM ...
- 剑指offer 面试35题
面试35题: 题目:复杂链表的复制 题:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中 ...
- python读写Excel文件--使用xlrd模块读取,xlwt模块写入
一.安装xlrd模块和xlwt模块 1. 下载xlrd模块和xlwt模块 到python官网http://pypi.python.org/pypi/xlrd下载模块.下载的文件例如:xlrd-0.9. ...