Servlet路径
绝对路径:一个资源的完整路径;
相对路径:相对于当前资源的路径;
在进行路径说明的时候首先声明一点,如果新建的项目工程中带有WebRoot目录,那么js、css、img都应该放
到WebRoot目录下,否则访问会有问题。千万不要放在WEB-INF下,因为WEB-INF下的内容只有服务器转发可以访
问到,处于安全考虑;如果新建的项目工程中不带有WebRoot目录,那么可以放在WEB-INF外面建立的文件夹中。
那么使用Eclipse创建的Web工程项目是下面的目录结构:
JSP中的路径问题
在JSP页面中加入basePath:
<% //获取项目名 String path = request.getContextPath(); /* http://localhost:8080/项目名/ */ String basePath= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>
在JSP页面中的<head>标签中加入:
<!-- 相当于所有的href相对路径前面都加入了:http://localhost:8000/项目名/ --> <base href="<%=basePath%>">
创建一个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("<h1>Hello PathServlet!</h1>"); } /** * @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+"/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <!-- 相当于所有的href相对路径前面都加入了:http://localhost:8000/项目名/ --> <base href="<%=basePath%>"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Servlet</title> </head> <body> <h1>Servlet路径问题</h1> <hr/> <%-- href属性中隐含了basePath,因为<base href="<%=basePath%>"> --%> <!-- 使用相对路径访问PathServlet --> <a href="PathServlet">get方式请求PathServlet</a> </body> </html>
运行结果:
跳转的路径: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配置文件中的<url-pattern></url-pattern>标签之间的路径问
题。只不过是Servlet3.0更简单了。
我们上面的例子中的注解为:
@WebServlet(name="PathServlet" ,urlPatterns={"/PathServlet"})
注解中的urlPatterns中的第一个斜线表示项目的根目录,如果不加会报很严重的错误。这里需要我们小心谨慎一
定不要忘了加。Servlet3.0以下的版本只能在web.xml中配置,同样是小心。
Servlet中的路径问题
新建一个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+"/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <!-- 相当于所有的href相对路径前面都加入了:http://localhost:8000/项目名/ --> <base href="<%=basePath%>"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>跳转页面</title> </head> <body> <h1>我是test.jsp页面!</h1> </body> </html>
继续修改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