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

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


<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'reg.jsp' starting pagetitle>

    <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">
    

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


<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'regRequest.jsp' starting pagetitle>

    <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">
    

  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服务器,运行:
用户注册页面:

JSP——请求重定向与请求转发_第1张图片

点击“submit”提交,发现地址栏URL地址不是 reg.jsp 指定处理请求的 response.jsp , 而且 regRequest.jsp 无法取得用户信息。说明用户的请求由 response.jsp 变为 regRequest.jsp ,相当于用户提出了2次请求,并且没有保存第一次的请求对象:

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——请求重定向与请求转发_第3张图片

你可能感兴趣的:(jsp,javaweb)