我经常被jsp和servlet页面之间跳转的时候因为路径问题弄得头晕,特地在此进行总结,给大家看也是给我自己看,共勉,一起加油,写的不好请留言,我会改正。
目录结构如下:
web.xml文件配置如下:
<servlet> <servlet-name>servlet</servlet-name> <servlet-class>servlet.Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>servlet</servlet-name> <url-pattern>/servlet/Servlet</url-pattern> </servlet-mapping>
servlet.java文件如下所示:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub this.doPost(request,response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //设置页面的编码格式 response.setContentType("text/html;charset=UTF-8"); //创建一个printWriter对象,用来在网页上输出内容 PrintWriter out=response.getWriter(); out.println("我是Servlet"); }
index.jsp文件如下:
<body> <!--使用相对路径访问HelloSevlet--> <a href="servlet/Servlet">访问Servlet</a> </body>
输出结果:
点击此链接(访问Servlet)
----------------------------------------------------------------------------------------------------------------
如果在超链接中一个一加了“/”会出现404错误,因为超链接中的第一个/表示服务器的根目录
<body> <!--使用相对路径访问HelloSevlet--> <!-- /servlet/Servlet表示服务器的根目录,会显示404错误 --> <a href="/servlet/Servlet">访问Servlet</a> </body>点击访问Servlet会出现如下情况,注意访问的地址显示为“http://localhost:8080/servlet/Servlet”
----------------------------------------------------------------------------------------------------------------
上面在jsp中的超链接方式是使用了相对定位方式,下面使用绝对定位,由于我用的是eclipse,所以直接填以下方式
<!-- 使用绝对路径访问servelt,可以使用path变量来使用,也就是request.getContextPath() --> <a href="<%=request.getContextPath()%>/servlet/Servlet">使用绝对路径访问Servlet</a><br>
显示结果:
----------------------------------------------------------------------------------------------------------------
另外表单中action的url地址写法和超链接方式相同,我就不在这里重复了。
----------------------------------------------------------------------------------------------------------------
在index.jsp页面中我新加一条语句,用来跳转至TestServlet(注意在web.xml中要配置servlet)
<a href="servlet/TestServlet">访问TestServlet,实现路径跳转问题</a><br>
test.jsp初始页面如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>test.jsp</h1> <hr> </body> </html>
在TestServlet中,我们先实验重定向方式,使用超链接中的相对路径看看会有什么效果
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub this.doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //请求重定向方式跳转到jsp页面 response.sendRedirect("test.jsp"); }
显示结果如下:
注意url地址为http://localhost:8080/dsf/servlet/test.jsp,使用相对路径会在当前文件下查找test.jsp文件,
当前路径为http://localhost:8080/dsf/servlet
----------------------------------------------------------------------------------------------------------------
我们应该在TestServet中使用request.getContextPath()方法再拼上后面的路径。
//请求重定向方式跳转到jsp页面 response.sendRedirect(request.getContextPath()+"/test.jsp");
显示结果:
----------------------------------------------------------------------------------------------------------------
当我们在TestServelt中使用服务器内部跳转时,使用相对路径跳转
request.getRequestDispatcher("test.jsp").forward(request,response);
显示结果如下:
因为是服务器内部跳转,因此上面的地址不变,此时我们要看报错的信息,HTTP Status 404 - /dsf/servlet/test.jsp
在dsf/servlet目录下找不到test.jsp
----------------------------------------------------------------------------------------------------------------
当我们使用一下方式时,加了一个"/"
request.getRequestDispatcher("/test.jsp").forward(request,response);显示结果如下
这个“/”表示项目的根目录。
我们也可以这样写
request.getRequestDispatcher("../test.jsp").forward(request,response);
返回上层目录再查找test.jsp文件
本文,根据慕课网整理而来。