绝对路径:一个资源的完整路径;
相对路径:相对于当前资源的路径;
在进行路径说明的时候首先声明一点,如果新建的项目工程中带有WebRoot目录,那么js、css、img都应该放
到WebRoot目录下,否则访问会有问题。千万不要放在WEB-INF下,因为WEB-INF下的内容只有服务器转发可以访
问到,处于安全考虑;如果新建的项目工程中不带有WebRoot目录,那么可以放在WEB-INF外面建立的文件夹中。
那么使用Eclipse创建的Web工程项目是下面的目录结构:
在JSP页面中加入basePath:
<%
//获取项目名
String path = request.getContextPath();
/* http://localhost:8080/项目名/ */
String basePath= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
在JSP页面中的标签中加入:
创建一个PathServlet
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class PathServlet
*/
@WebServlet(name="PathServlet" ,urlPatterns={"/PathServlet"})
public class PathServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public PathServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("Hello PathServlet!
");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
创建一个default.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//获取项目名
String path = request.getContextPath();
/* http://localhost:8080/项目名/ */
String basePath= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
Servlet
Servlet路径问题
<%-- href属性中隐含了basePath,因为 --%>
get方式请求PathServlet
运行结果:
跳转的路径:http://localhost:8080/ServletDemo1/PathServlet
修改default.jsp页面:
运行结果:
跳转的路径:http://localhost:8080/PathServlet
因为在JSP页面中第一个斜线表示服务器的根目录,也就是http://localhost:8080/,所以会报404错误,因此找
不到路径。
继续修改default.jsp页面:
运行结果:
跳转的路径:http://localhost:8080/ServletDemo1/PathServlet
request.getContextPath()得到的是项目的根目录,同样表单中的action属性的URL地址的写法与超链接相同。
注解中的路径也就是我们通常所说的web.xml配置文件中的
题。只不过是Servlet3.0更简单了。
我们上面的例子中的注解为:
@WebServlet(name="PathServlet" ,urlPatterns={"/PathServlet"})
注解中的urlPatterns中的第一个斜线表示项目的根目录,如果不加会报很严重的错误。这里需要我们小心谨慎一
定不要忘了加。Servlet3.0以下的版本只能在web.xml中配置,同样是小心。
新建一个test.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//获取项目名
String path = request.getContextPath();
/* http://localhost:8080/项目名/ */
String basePath= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
跳转页面
我是test.jsp页面!
继续修改default.jsp页面代码:
新建的TestServlet:
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class TestServlet
*/
@WebServlet(name="TestServlet" ,urlPatterns={"/TestServlet"})
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public TestServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//使用请求重定向方式跳转到test.jsp页面
/*
* 请求重定向,将方法中的地址参数传递给浏览器,让浏览器重新发送请求,
* "/"代表(相对于)服务器根目录http://localhost:8000/
* 所以相当于浏览器重新请求了绝对路径http://localhost:8000/项目名/test.jsp
*/
//使用request.getContextPath()获取项目名
response.sendRedirect(request.getContextPath() +"/test.jsp");
//response.sendRedirect("/test.jsp");//错误的
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
运行结果:
跳转路径为:http://localhost:8080/ServletDemo1/test.jsp
修改TestServlet:
运行结果:
跳转路径为:http://localhost:8080/ServletDemo1/TestServlet
因此我们推荐使用的是:
*************************************************************************************
请求重定向
response.sendRedirect(request.getContextPath() +"/test.jsp");
服务器内部转发
request.getRequestDispatcher("/test.jsp").forward(request.response)
*************************************************************************************
推荐的关于路径问题的博文:
http://blog.csdn.net/app19830306/article/details/8510545