一般使用如下几种方法
1.可以在servlet
的init()
方法里
String path = this.getServletContext().getRealPath("/");
这将获取web项目的全路径
例如 :H:\eclipse\wepapps\app\
app
是web
项目的根目录
2.通用获取路径方式获取 任意的class
的绝对路径
this.getClass().getClassLoader().getResource("/").getPath();
这将获取 到该 class
目录的全路径
例如 : H:\eclipse/webapps/app/com/server/Demon1
这个方法也可以不在web
环境里确定路径,比较好用
java Web url 路径映射
在JavaWeb
开发中,只要是写URL
地址,那么建议最好以/
开头,也就是使用绝对路径的方式
当/
是给服务器用的,则代表当前的web工程,如果/
是给浏览器用的,则代表webapps
目录。
示例
1.ServletContext.getRealPath(String path)
获取资源的绝对路径
/**
* ServletContext.getRealPath("/download/1.JPG")是用来获取服务器上的某个资源,
* 那么这个"/"就是给服务器用的,"/"此时代表的就是web工程
* ServletContext.getRealPath("/download/1.JPG")表示的就是读取web工程下的download文件夹中的1.JPG这个资源
*/
//得到 要访问的web资源的绝对路径(要在 init() 中使用)
this.getServletContext().getRealPath("/download/1.JPG");
2.在服务器端forward
传参跳转到其他页面
/**
* 客户端请求某个web资源,服务器跳转到另外一个web资源,这个forward也是给服务器用的,
* 那么这个"/"就是给服务器用的,所以此时"/"代表的就是web工程
*/
this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
3.使用include
指令或者<jsp:include>
标签引入页面
<%@include file="/jspfragments/head.jspf" %>
<jsp:include page="/jspfragments/demo.jsp" />
此时"/"代表的都是web工程。
“/”代表webapps目录的常见应用场景
示例
1.使用sendRedirect实现请求重定向
response.sendRedirect("/req/index.jsp");
服务器发送一个URL
地址给浏览器,浏览器拿到URL
地址之后,再去请求服务器,所以这个/
是给浏览器使用的
此时/
代表的就是webapps
目录,”/req/index.jsp这个地址指的就是
webapps\req\index.jsp`
response.sendRedirect("/项目名称/文件夹目录/页面");
这种写法是将项目名称写死在程序中的做法,不灵活,万一哪天项目名称变了,此时就得改程序,所以推荐使用下面的灵活写法:
将
response.sendRedirect("/req/index.jsp");
这种写法改成
response.sendRedirect(request.getContextPath()+"/index.jsp");
request.getContextPath()
获取到的内容就是/req
,这样就比较规范
使用request.getContextPath()
代替/项目名称
,推荐使用这种方式
2.使用超链接跳转
<a href="/JavaWeb_HttpServletResponse_Study_20140615/index.jsp">跳转到首页</a>
这是客户端浏览器使用的超链接跳转,这个”/”是给浏览器使用的,此时”/”代表的就是webapps目录。
使用超链接访问web资源,绝对路径的写法推荐使用下面的写法改进:
<a href="${pageContext.request.contextPath}/index.jsp">跳转到首页</a>
这样就可以避免在路径中出现项目的名称,使用${pageContext.request.contextPath}
取代”/req”
3.Form表单提交
<form action="/req/servlet/CheckServlet" method="post">
<input type="submit" value="提交">
</form>
这是客户端浏览器将form
表单提交到服务器,所以这个/
是给浏览器使用的,此时/
代表的就是webapps
目录。
对于form
表单提交中action
属性绝对路径的写法,也推荐使用如下的方式改进:
<form action="${pageContext.request.contextPath}/servlet/CheckServlet" method="post">
<input type="submit" value="提交">
</form>
${pageContext.request.contextPath}
的效果等同于request.getContextPath()
,两者获取到的都是/项目名称
4.js脚本和css样式文件的引用
<%--使用绝对路径的方式引用js脚本--%>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/index.js"> </script>
<%--${pageContext.request.contextPath}与request.getContextPath()写法是得到的效果是一样的--%>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/login.js"></script>
<%--使用绝对路径的方式引用css样式--%>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/index.css" type="text/css"/>