Servlet(10)—请求转发和请求重定向

时间:2021-07-13 15:29:14

  1. 请求转发与请求重定向

    ①区别:

    • 本质区别:请求转发只发出一次请求,请求重定向则发出两次请求。
    • 请求转发:地址栏是初次发出请求的地址在最终的Servlet中,request对象和中转的那个request是同一个对象

      只能转发给当前web应用的资源

      /表示当前web应用的根目录
    • 请求重定向:地址栏不再是初次发出的请求地址,地址栏为最后响应的那个地址在最终的Servlet中,request对象和中转的那个request不是同一个对象可以重定向到任何资源

      /表示当前web站点的根目录

    ②源代码

    • 请求的转发:
public class ForWardServlet extends HttpServlet {

private static final long serialVersionUID = 1l;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException { System.out.println("ForWordServvlet's doGet"); req.setAttribute("name", "abcd"); System.out.println("ForWordServlet:" + req.getAttribute("name"));
//请求的转发
//调用HttpServletRequest的getRequestDispatcher(path)方法获取RequestDispatcher对象,
//调用getRequestDispatcher(path)需要填入转发的地址
String path = "TestServlet";
RequestDispatcher requestDispatcher = req.getRequestDispatcher(path);
//2.调用HttpSerlvetReuqest的forward(request, response)进行请求转发
requestDispatcher.forward(req, resp);
}
}
  • 请求的重定向
public class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 1l; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("RedirectServlet's doGet");
req.setAttribute("name", "efgh");
System.out.println("RedirectSerlvet's name:" + req.getAttribute("name")); //请求执行重定向,直接调用response的sendRedirect(path)方法,其中path为重定向的地址
String path = "testServlet";
resp.sendRedirect(path);
} }

2 . 请求转发与重定向和对象、属性一块使用(实例)

a.jsp

<body>
<h1>A page</h1> <!-- 方式一:include指令 -->
<%@ include file="b_1.jsp" %> <!-- 方式二:jsp标签 -->
<jsp:include page="b_2.jsp">
<jsp:param value="1234" name="username"/>
</jsp:include> <!-- 其作用与请求转发一致 -->
<%-- <jsp:forward page="b_3.jsp">
<jsp:param value="123" name="username"/>
</jsp:forward> --%> <!-- 乱码问题 -->
<form action="Attr_1.jsp" method="get">
<input type="text" name="username" value="中文">
<input type="submit" value="Submit">
</form> <%
//设置属性
pageContext.setAttribute("pageContextAttr", "pageContextValue");
request.setAttribute("requestAttr", "requestValue");
session.setAttribute("sessionAttr", "sessionValue");
application.setAttribute("applicationAttr", "applicationValue");
%> </body>

①Attr_1.jsp:

<h1>Attr_1 page</h1>

            <!-- 获取属性 -->
pageContextAttr:<%= pageContext.getAttribute("pageContextAttr") %>
<br><br>
requestAttr:<%= request.getAttribute("requestAttr") %>
<br><br>
session:<%= session.getAttribute("sessionAttr") %>
<br><br>
application:<%= application.getAttribute("applicationAttr") %> <br><br>
<a href="Attr_2_1.jsp">To Attr_2_1 Page</a>:请求转发到Attr_3.jsp
<br><br>
<a href="Attr_2_2.jsp">To Attr_2_2 Page</a>:请求重定向到Attr_3.jsp
<br><br>
<a href="Attr_2_3.jsp">To Attr_2_3 Page</a>:请求转发向到Attr_3.jsp,以获取request对象的属性值
<br><br><br><br>
<!-- 处理post请求的处理方式 -->
<%
request.setCharacterEncoding("UTF-8");
%>
username(处理post):<%= request.getParameter("username") %> <br><br><br>
<!-- 乱码问题 -->
<!-- 处理get请求处理方式 -->
<%
String val = request.getParameter("username");
String username = new String(val.getBytes("UTF-8"), "UTF-8");
out.println("username(处理get方法一):" + username);
%> <!-- 这样处理get请求非常麻烦,可以在apache中server.xml中和eclipse中Servlet项目中的servlet.xml文件相同的位置
设置usebodyEncoding的值 --> <br><br><br>
username(处理get方法二):<%= request.getParameter("username") %> ②Attr_2_1.jsp:
<h1>Attr_2_1 page</h1>
<%
//请求转发
request.getRequestDispatcher("/Attr_3.jsp").forward(request, response);
%> ③Attr_2_2.jsp:
<h1>Attr_2_2 page</h1>
<%
//请求重定向
response.sendRedirect("Attr_3.jsp");
%>
④Attr_2_3.jsp:
<h1>Attr_2_3 page</h1>
<%
//设置属性
pageContext.setAttribute("pageContextAttr", "pageContextValue");
request.setAttribute("requestAttr", "requestValue");
session.setAttribute("sessionAttr", "sessionValue");
application.setAttribute("applicationAttr", "applicationValue");
%>
<%
//请求转发
request.getRequestDispatcher("/Attr_3.jsp").forward(request, response);
%>
<br> ⑤Attr_3.jsp:
<h1>Attr_3 page</h1>
<!-- 获取属性 -->
pageContextAttr:<%= pageContext.getAttribute("pageContextAttr") %>
<br><br>
requestAttr:<%= request.getAttribute("requestAttr") %>
<br><br>
session:<%= session.getAttribute("sessionAttr") %>
<br><br>
application:<%= application.getAttribute("applicationAttr") %> ⑥页面访问:
请求的页面 到达的页面
——> Attr2_1.jsp ——>请求转发, ——> Attr_3.jsp 转发到Attr_3.jsp之后的地址http://localhost:8080/Demo5/Attr_2_1.jsp
Attr_1.jsp ——> Attr2_2.jsp ——>请求重定向, ——> Attr_3.jsp 到Attr_3.jsp之后的地址http://localhost:8080/Demo5/Attr_3.jsp
——> Attr2_3.jsp ——>请求转发 ——> Attr_3.jsp (request对象获取requestAttr属性值,以证实request的属性范围),转发后的
地址http://localhost:8080/Demo5/Attr_2_3.jsp

③Attr_2_1.jsp

<body>

    <h1>Attr_2_1 page</h1>
<%
//请求转发
request.getRequestDispatcher("/Attr_3.jsp").forward(request, response);
%>
</body>

④Attr_2_2.jsp

<body>

    <h1>Attr_2_2 page</h1>

    <%
//请求重定向
response.sendRedirect("Attr_3.jsp");
%>
</body>

⑤Attr_2_3.jsp

<body>

    <h1>Attr_2_3 page</h1>

    <%
//设置属性
pageContext.setAttribute("pageContextAttr", "pageContextValue");
request.setAttribute("requestAttr", "requestValue");
session.setAttribute("sessionAttr", "sessionValue");
application.setAttribute("applicationAttr", "applicationValue");
%>
<%
//请求转发
request.getRequestDispatcher("/Attr_3.jsp").forward(request, response);
%>
<br>
</body>

⑥Attr_3.jsp

<body>

    <h1>Attr_3 page</h1>
<!-- 获取属性 -->
pageContextAttr:<%= pageContext.getAttribute("pageContextAttr") %>
<br><br>
requestAttr:<%= request.getAttribute("requestAttr") %>
<br><br>
session:<%= session.getAttribute("sessionAttr") %>
<br><br>
application:<%= application.getAttribute("applicationAttr") %>
</body>

结果:

Attr_1.jsp中三个超链接的结果是

Servlet(10)—请求转发和请求重定向

超链接1:

Servlet(10)—请求转发和请求重定向

超链接2:

Servlet(10)—请求转发和请求重定向

超链接3:

Servlet(10)—请求转发和请求重定向