我经常被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文件
本文,根据慕课网整理而来。