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

来源:互联网 发布:鲱鱼罐头 淘宝 编辑:程序博客网 时间:2024/05/22 11:29
  1. 请求重定向

    客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。

  2. 请求转发

    服务器行为,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+"&nbsp;&nbsp;");             }         }        %>  </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 页面的请求:

这里写图片描述

原创粉丝点击