您的位置:首页 > Web前端 > JavaScript

JSP——请求重定向与请求转发

2017-08-24 10:57 141 查看
请求重定向

客户端行为,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+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'reg.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

</head>

<body>
<h1>用户注册</h1> <hr>
<form name="regForm" action="response.jsp" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>兴趣:</td>
<td>
<input type="checkbox" name="favorite" value="sports"/>运动
<input type="checkbox" name="favorite" value="read"/>看书
<input type="checkbox" name="favorite" value="paint"/>画画
<input type="checkbox" name="favorite" value="sing"/>唱歌
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="submitBnt" value="submit"/></td>
</tr>
</table>
</form>
</body>
</html>


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+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'regRequest.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

</head>

<body>
<h1>request内置对象</h1><hr>

<%
//解决页面显示中文乱码问题,无法解决URL传递中文出现的乱码问题
request.setCharacterEncoding("utf-8");
%>

用户名:<%=request.getParameter("username") %><br/>

兴趣:<%
if(request.getParameterValues("favorite")!=null){
String[] favorites=request.getParameterValues("favorite");
for(String str:favorites){
out.println(str+"  ");
}
}
%>
</body>
</html>


在 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 页面的请求:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jsp