三、转发与重定向

一、储备知识

1.1在请求中存取属性

image.png

image.png

1.2转发与重定向语法

image.png

二、示例

2.1需求

如果用户的注册名为admin,则注册失败,因为该用户名已经存在。需要重新跳转到用户注册页面,重新注册。反之,注册成功,跳转到首页去。


作用域:
request作用域:请求的范围,在一次请求的范围内。


示例代码:

request.setAttribute("mess", "注册失败");
                    // 转发
request.getRequestDispatcher("userCreate.jsp").forward(request, response);

Dispatcher:调度器
上面这段代码的意思是:获得一个响应的调度器,这个后面跟要跳转到的页面的url地址。同时后面还要跟forward方法,意思是携带我的请求和响应过去,把我的请求和响应继续往下传。

2.2示例代码:

用户注册的jsp页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>用户注册</title>
</head>
<body>
   <form name="registerForm" id="registerForm" action="doUserCreate.jsp" method="get">
    <table class="tb" border="0" cellspacing="5" cellpadding="0" align="center">
        <tr><td align="center" colspan="2" style="text-align:center;" class="text_tabledetail2">用户注册</td></tr>
        <tr>
            <td class="text_tabledetail2">用户名</td>
            <td><input type="text" name="username" value=""/></td>
        </tr>
        <tr>
            <td class="text_tabledetail2">密码</td>
            <td><input type="password" name="password" value=""/></td>
        </tr>
        <tr>
            <td class="text_tabledetail2">确认密码</td>
            <td><input type="password" name="con_password" value=""/></td>
        </tr>
        <tr>
            <td class="text_tabledetail2">email</td>
            <td><input type="text" name="email" value=""/></td>
        </tr>
        <tr>
            <td class="text_tabledetail2">爱好</td>
            <td>
                <input type="checkbox" name="hobby" value="swim" />游泳<br/>
                <input type="checkbox" name="hobby" value="read" />阅读<br/>
                <input type="checkbox" name="hobby" value="climb" />爬山<br/>
                <input type="checkbox" name="hobby" value="travel" />旅游<br/>
            </td>
        </tr>
        <tr>
            <td style="text-align:center;" colspan="2">             
                <button type="submit" class="page-btn" name="save">注册</button>
                <button type="button" class="page-btn" name="return" onclick="javascript:location.href='<%=request.getContextPath() %>/index.jsp'">返回</button>
            </td>
        </tr>
    </table>
    </form>
    <%
        Object omess =  request.getAttribute("mess");
        if (omess != null) {
            out.println(omess);
        }
     %>
</body>
</html>

处理用户请求的jsp页面:

<%@ page language="java" import="java.util.*" pageEncoding="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 'doUserCreate.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>
    <%
        // 获取用户注册的数据:用户名、密码、email、爱好
        String username = request.getParameter("username");
        String pwd = request.getParameter("password");
        String email = request.getParameter("email");
        String[] hobbys = request.getParameterValues("hobby");
     %>
     用户名:<%
           if(username != null && !username.equals("")){
                if (username.equals("admin")){
                // 一次请求范围内
                    request.setAttribute("mess", "注册失败");
                    // 转发
                    request.getRequestDispatcher("userCreate.jsp").forward(request, response);
                } else {
                    request.setAttribute("mess", "注册成功");
                    // 重定向
                    response.sendRedirect(request.getContextPath() + "/index.jsp");
                }                
           } else {
              out.println("1");
           }

      %><br/>
     密码:<%=pwd %><br/>
     email:<%=email %><br/>
     爱好:<%
                if(hobbys != null && hobbys.length != 0){
                    // 用户选择了爱好,获得爱好并输出
                    for(String hobby : hobbys) {
                        out.println(hobby);
                    }
                }else{
                    out.println("没有选择任何爱好");
                }
           %><br/>
  </body>
</html>

注册成功后跳转到的jsp页面:

<%@page import="java.net.URLEncoder"%>
<%@ page language="java" import="java.util.*" pageEncoding="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 'doUserCreate.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="<%=request.getContextPath() %>/css/common.css">

  </head>
<body>
<!--页面顶部-->
<div id="header">
    <div class="main-top">
        <div class="logo"><a href=""><span>新闻大视野</span></a></div>
        <div class="login-box">
            <%
                Object omess =  request.getAttribute("mess");
                if (omess != null) {
                    out.println(omess);
                }
             %>
            <label>用户名</label><input type="text" name="uname" /><label>密码</label><input type="text" name="upassword" /><button>登录</button>
        </div>
        <div class="nav">
            <ul class="clearfix">
                <li><a href="#">首页</a></li>
                <li><a href="#">国内</a></li>
                <li><a href="#">国际</a></li>
                <li><a href="#">娱乐</a></li>
                <li><a href="#">军事</a></li>
            </ul>
        </div>
    </div>
    <!--banner-->
    <div class="main-banner">
    <img src="<%=request.getContextPath() %>/images/banner.png" />
    </div>
    <!--搜索横框-->
    <div class="search-box">
        <div class="sl">
            <div class="sr clearfix">
            
                <span class="left-search clearfix">
                    <label>站内搜索</label><input type="text" name="keyword" value="关键词" /><button class="go-btn"></button>
                </span>
                <span class="right-link">
                    <label>快速链接</label><select><option>-----专题选择-----</option></select><button class="go-btn"></button>
                </span>
                
            </div>
        </div>    
    </div>
</div>
<!--d页面主体-->
<div id="content" class="main-content clearfix">
    <!--主体的的左边部分-->
    <div class="main-content-left">
        <!--新闻专题分类-->
        <div class="class-box">
            <div class="class-box-header">
               <span class="fr"><a href="#">更多...</a></span>
               <h3>新闻专题</h3>
            </div>
            <div class="class-box-content">
                <ul>
                     <li><a href="#">国内</a></li>
                    <li><a href="#">国际</a></li>
                    <li><a href="#">娱乐</a></li>
                    <li><a href="#">军事</a></li>
                    <li><a href="#">财经</a></li>
                    <li><a href="#">天气</a></li>
                    <li class="clear-bottom-line"><a href="#">科技</a></li>
                </ul>
            </div>
        </div>
        <!--最新新闻-->
        <div class="left-box">
            <div class="left-box-tbg">
                <div class="left-box-bbg">
                    <div class="left-box-header"><h3><a href="#">最新新闻</a></h3></div>
                    <div class="left-box-content">
                        <ul>
                            <li><a href="#">课工场最靠谱的互联网教育 Java Web从入门到成就!</a></li>
                            <li><a href="#">课工场最靠谱的互联网教育 Java Web从入门到成就!</a></li>
                            <li><a href="#">课工场最靠谱的互联网教育 Java Web从入门到成就!</a></li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
        <!--最新评论-->
        <div class="left-box">
            <div class="left-box-tbg">
                <div class="left-box-bbg">
                    <div class="left-box-header"><h3>最新评论</h3></div>
                    <div class="left-box-content">
                        <ul>
                            <li><a href="#">课工场最靠谱的互联网教育 Java Web从入门到成就!</a></li>
                            <li><a href="#">课工场最靠谱的互联网教育 Java Web从入门到成就!</a></li>
                            <li><a href="#">课工场最靠谱的互联网教育 Java Web从入门到成就!</a></li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <!--页面主体的右部,包括新闻的列表和评论内容 -->
    <div class="main-content-right">
        <!--各专题的新闻列表-->
        <div class="main-text-box">
            <div class="main-text-box-tbg">
                <div class="main-text-box-bbg">
                    
                    <div class="main-text-box-header">
                        <h3>即时新闻</h3>
                    </div>
                    <div class="main-text-box-content">
                      <ul class="news-list-ul clearfix">
                        <li><span>2016-4-28 10:33:33</span><a href="#">课工场Java Web,璇女神带你学习</a></li>
                        <li><span>2016-4-28 10:33:33</span><a href="#">课工场UI节日回馈,送线下项目实战课程</a></li>
                        <li><span>2016-4-28 10:33:33</span><a href="#">利用响应式布局搭建自己的个人简介网站</a></li>
                        <li><span>2016-4-28 10:33:33</span><a href="#">网页设计师的福利:可视化操作无需程序</a></li>
                        <li class="li-line"><span>2016-4-28 10:33:33</span><a href="#">提交课工场Bug或者建议,送K币,礼品</a></li>

                          <li><span>2016-4-28 10:33:33</span><a href="#">课工场Java Web,璇女神带你学习</a></li>
                          <li><span>2016-4-28 10:33:33</span><a href="#">课工场UI节日回馈,送线下项目实战课程</a></li>
                          <li><span>2016-4-28 10:33:33</span><a href="#">利用响应式布局搭建自己的个人简介网站</a></li>
                          <li><span>2016-4-28 10:33:33</span><a href="#">网页设计师的福利:可视化操作无需程序</a></li>
                          <li class="li-line"><span>2016-4-28 10:33:33</span><a href="#">提交课工场Bug或者建议,送K币,礼品</a></li>

                          <li><span>2016-4-28 10:33:33</span><a href="#">课工场Java Web,璇女神带你学习</a></li>
                          <li><span>2016-4-28 10:33:33</span><a href="#">课工场UI节日回馈,送线下项目实战课程</a></li>
                          <li><span>2016-4-28 10:33:33</span><a href="#">利用响应式布局搭建自己的个人简介网站</a></li>
                          <li><span>2016-4-28 10:33:33</span><a href="#">网页设计师的福利:可视化操作无需程序</a></li>
                          <li class="li-line"><span>2016-4-28 10:33:33</span><a href="#">提交课工场Bug或者建议,送K币,礼品</a></li>

                          <li><span>2016-4-28 10:33:33</span><a href="#">课工场Java Web,璇女神带你学习</a></li>
                          <li><span>2016-4-28 10:33:33</span><a href="#">课工场UI节日回馈,送线下项目实战课程</a></li>
                          <li><span>2016-4-28 10:33:33</span><a href="#">利用响应式布局搭建自己的个人简介网站</a></li>
                          <li><span>2016-4-28 10:33:33</span><a href="#">网页设计师的福利:可视化操作无需程序</a></li>
                          <li class="li-line"><span>2016-4-28 10:33:33</span><a href="#">提交课工场Bug或者建议,送K币,礼品</a></li>
                      </ul>
                    </div>
                    <!--图片新闻-->
                    <div class="news-pic">
                        <dl>
                            <dt><img src="<%=request.getContextPath() %>/images/new-1.png" /></dt>
                            <dd>PHP从入门到放弃</dd>
                        </dl>
                        <dl>
                            <dt><img src="<%=request.getContextPath() %>/images/new-2.png" /></dt>
                            <dd>Java Web从绝望到希望</dd>
                        </dl>
                        <dl>
                            <dt><img src="<%=request.getContextPath() %>/images/new-3.png" /></dt>
                            <dd>课工场五一回馈</dd>
                        </dl>
                        <dl>
                            <dt><img src="<%=request.getContextPath() %>/images/new-2.png" /></dt>
                            <dd>Java Web从绝望到希望</dd>
                        </dl>
                    </div>
                    <div class="page-bar">
                        <ul class="page-num-ul clearfix">
                            <li><a href="#">上一页</a><li>
                            <li><a href="#" class="thisclass">1</a><li>
                            <li><a href="#">2</a><li>
                            <li><a href="#">3</a><li>
                            <li><a href="#">4</a><li>
                            <li><a href="#">5</a><li>
                            <li><a href="#">下一页</a><li>
                        </ul>
                        <span class="page-go-form"><label>跳转至</label><input type="text" name="numkey" class="page-key" />页<button type="submit" class="page-btn">GO</button></span>
                    </div>
                </div>
            </div>
        </div>
        <!--合作媒体-->
        <div class="main-text-box">
            <div class="main-text-box-tbg">
                <div class="main-text-box-bbg">
                    <div class="main-text-box-header">
                        <h3>合作媒体</h3>
                    </div>
                    <div class="main-text-box-content">
                      <ul class="link-text-ul clearfix">
                        <li><a href="#">中国政府网</a></li>
                        <li><a href="#">中国政府网</a></li>
                        <li><a href="#">中国政府网</a></li>
                        <li><a href="#">中国政府网</a></li>
                        <li><a href="#">中国政府网</a></li>
                        <li><a href="#">中国政府网</a></li>
                        <li><a href="#">中国政府网</a></li>
                        <li><a href="#">中国政府网</a></li>
                      </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>           
<!--页面底部-->
<div id="footer" class="main-footer-box">
    24小时客户服务热线:010-68988888 常见问题解答 新闻热线:010-627488888<br />
    文明办网文明上网举报电话:010-627488888 举报邮箱:jubao@bj-aptech.com.cn<br />
    Coyright&copy;1999-2007 News China gov,All Right Reserved.<br />
    新闻中心版权所有
</div>
</body></html>

分析:
1、在处理用户请求的jsp页面加上判断代码:如果用户名是admin,则注册失败,重定向到本页面;如果注册成功,则重定向到新闻界面。
2、在用户注册页面上加上读取request的属性内容的代码,如果注册失败,转发到这个页面的话则读取request的属性值。
3、在新闻页面上加上读取request的属性内容的代码,如果注册成功,重新定向到这个页面的话则读取request的属性值。

2.3问题一

当输入admin注册失败的时候,


image.png

可以看到在上面的地址栏的定位是doUserCreate页面,而不是在用户注册处理页面加的判断中的重定向的userCreate.jsp页面。

原因如下:当浏览器即userCreate.jsp界面的数据提交给doUserCreate.jsp的时候,在doUserCreate.jsp中处理数据,如果在该页面中有转发的话,则转发的过程是在服务器中完成的,服务器直接将转发后的界面返回给浏览器,浏览器端不需要进行转发操作。所以在这整个过程中,浏览器只是向服务器提交了一次请求,所以其在地址栏的url地址就是其form数据提交的action的地址,可以跟最后返回给浏览器的页面的地址不相符。

2.4问题二

注册成功之后拿不到request的属性值。

原因:这不是一次请求的范围内了,可以看跳转之后的地址栏。当服务器进行判断之后需要重定向的时候,不是服务器偷偷帮我跳好,而是服务器告诉浏览器你得发个请求重新定向到别的jsp页面,这时候浏览器会再重新发个请求去访问别的jsp页面。这时候服务器是发送了两个请求,这时候再第一次请求中设置的request值当然在第二次请求中拿不到了。

image.png

2.5总结:转发和重定向的区别

image.png

1、两者的写法不同。

转发后面还加了一个forward,这个方法的意思是把请求传递下去,即当服务器在偷偷地转发去别的页面的时候,把这一次请求的值也传过去。

2、两者最终结果显示的地址

转发最后结果页面显示的地址就是提交请求的那个地址,因为服务器偷偷地做了转发这个动作。而重定向最后结果的地址与页面的地址相符合,因为是浏览器自身又发出的请求。


image.png

image.png

实例:比如我让你帮我买个饼,你带上我的饭卡去了,然后爱吃饭的时候你基友比你先吃完,然后你就让你基友帮我买了,但是最终还是你带回来给我的,这就是转发。再比如我让你给我买个饼,你说你要陪你女票吃饭,你告诉我你基友可以帮我买,然后我就让你基友帮我买了,这就是重定向。

2.6我重定向了但是我还想拿到request怎么办?

第一个解决方案是;request作用域太小了,去放到一个更大的作用域。
第二个解决方案是:一参数的形式进行传递,
示例代码如下:


image.png

然后在新闻页面获取info参数:

image.png

结果:


image.png

但是这个地方如果是中文的话在传参数的过程中会出现乱码问题,会拿不到。但是如果非要传中文的话,需要重新编码一下,示例代码如下:


image.png

如果还是出现问题,则可以在新闻界面读取的时候进行解码,使用URLEncoder.decoder方法。

三、前三次笔记总结

image.png

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。