请求重定向
客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。
请求转发
服务器行为,request.getRequestDispatcher().forward(req,resp);是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。
案例:
写一个用户注册页面 reg.jsp , 点击“提交”按钮时跳转到 response.jsp 页面,在 response.jsp 页面中分别设置请求重定向和请求转发到 regRequest.jsp 页面。
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
用户注册
regRequest.jsp 页面:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
request内置对象
<%
//解决页面显示中文乱码问题,无法解决URL传递中文出现的乱码问题
request.setCharacterEncoding("utf-8");
%>
用户名:<%=request.getParameter("username") %>
兴趣:<%
if(request.getParameterValues("favorite")!=null){
String[] favorites=request.getParameterValues("favorite");
for(String str:favorites){
out.println(str+" ");
}
}
%>
在 response.jsp 中设置请求重定向:
<%@ page language="java" import="java.util.*,java.io.*" contentType="text/html; charset=utf-8"%>
<%
//请求重定向
response.sendRedirect("regRequest.jsp");
%>
保存所有程序,启动tomcat服务器,运行:
用户注册页面:
点击“submit”提交,发现地址栏URL地址不是 reg.jsp 指定处理请求的 response.jsp , 而且 regRequest.jsp 无法取得用户信息。说明用户的请求由 response.jsp 变为 regRequest.jsp ,相当于用户提出了2次请求,并且没有保存第一次的请求对象:
在 response.jsp 中设置请求转发
<%@ page language="java" import="java.util.*,java.io.*" contentType="text/html; charset=utf-8"%>
<%
//请求转发
request.getRequestDispatcher("regRequest.jsp").forward(request,response);
%>
保存所有,刷新用户注册页面,用户注册页面注册信息不变,点击“submit”提交按钮,页面跳转下图,发现地址栏地址仍为 reg.jsp 第一次请求的 response.jsp , 而且 regRequest.jsp 也取得了用户信息。说明客户端的请求没有改变,一直都是 response.jsp , 只做了一次请求,并且保存了该次的请求对象,实际上是由服务器端替客户端完成了到 regRequest.jsp 页面的请求: