一、转发
主要对象和方法:
RequestDispatcher对象和它的forward方法
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./DataServlet" method="get">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
DataServlet的主要代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("request","1000");
System.out.println(request.getParameter("username"));
request.getRequestDispatcher("WEB-INF/a.jsp").forward(request, response);
}
a.jsp文件代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=request.getAttribute("request")%>
a.jsp
</body>
</html>
1、浏览器地址栏
- 使用转发的时候,浏览器的地址栏不会发生改变,但是响应的资源为转发的目的资源。
点击提交后的结果,地址栏的资源仍然是DataServlet的路径,并没有显示a.jsp的路径。
2、请求范围
同一个Web应用当前项目,可以转发到WEB-INF目录下的资源
- 请求只能转发到相同Web应用的项目资源,不可以跨应用或者服务器。
把DataServlet中转发路径变为"http://www.baidu.com"无法正常访问。
3、请求过程
一次请求一次响应
这里是转发的是同一个请求,所以只有一次请求,一次响应。这里显示的值为“1000”说明确实是同一个请求。
二、重定向
index.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./DataServlet" method="get">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
DataServlet代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("request","1000");
System.out.println(request.getParameter("username"));
response.sendRedirect("WEB-INF/a.jsp");
}
a.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=request.getAttribute("request")%>
a.jsp
</body>
</html>
1、浏览器地址栏
地址栏发生了改变****,变成了重定向资源的路径。
2、请求范围
可以跨Web应用和服务器来重新定位资源,但是不可以直接重定向到WEB-INF中的资源。
这里可以看出来如果直接重定向到WEB-INF下的资源,将会无法访问。
把DataServlet代码改成
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("request","1000");
System.out.println(request.getParameter("username"));
response.sendRedirect("http://www.baidu.com");
}
状态码为307,location就是重定向的路径
3、请求过程
两次请求,两次响应。
把DataServlet代码改成
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("request","1000");
System.out.println(request.getParameter("username"));
response.sendRedirect("./b.jsp");
}
点击提交