重定向异常

重定向异常

built_in.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/servlet_advanced/servlet/enquery" method="get">
<input type="text" name="key1" id="key1" placeholder="请输入要查询的单词"/>
<input type="submit" value="查询">



</form>
</body>
</html>

EnqueryServlet.java


package com.imooc.servlet.enquire;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import java.util.Set;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class EnqueryServlet
 */
@WebServlet({ "/EnqueryServlet", "/servlet/enquery" })
public class EnqueryServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public EnqueryServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Map<String,String> map=new HashMap<String,String>();
        map.put("apple","苹果");
        map.put("android","安卓");
        map.put("HuaWei", "华为");
        Set<String> keySet=map.keySet();
        String key1=request.getParameter("key1");
        //boolean flag=false;
        
        String res=null;
        String res1=null;
        for(String key:keySet) {
            if(key.equals(key1)) {
                
                    res=map.get(key1);
                    request.setAttribute("value", res);
                    request.getRequestDispatcher("/success.jsp").forward(request, response);
            }else if(!(keySet.contains(key1))){
              res1=" 没有找到对应的单词解释!";
              HttpSession session=request.getSession();
                session.setAttribute("value1", res1);
                response.setContentType("text/html;charset:utf-8");
                response.sendRedirect("/servlet_advanced/fail.jsp");
            }
        }
        
        
        
        
        
    }

}

success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% response.getWriter().println("<h2 style='color:blue'>"+(String)request.getAttribute("value")+"</h2>");
%>
</body>
</html>

fail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>




<% out.println("<h2 style='color:red'>"+(String)session.getAttribute("value1")+"</h2>");

%>
</body>
</html>


http://img1.sycdn.imooc.com//climg/6063267d09886b5607440543.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕小班 2021-03-31 15:07:20

同学你好,这里同学可以这样理解:

http://img1.sycdn.imooc.com//climg/60641f2009539dc708200661.jpg

如上所示,对于第一遍执行已经提交过的resposne方法,这个方法并不会结束,它依然会继续往下执行,就会执行第二遍response.sendRedirect,此时就会报出提交响应后不能调用sendRedirect()。

祝学习愉快!

  • 提问者 qq_慕神0589333 #1

    是受到强for循环的影响吗?需要两遍执

    2021-03-31 21:18:11
  • 提问者 qq_慕神0589333 #2

    还有之前讲过重定向方法内本来不就得需要两次请求吗?这里真是不解

    2021-03-31 21:23:00
  • 好帮手慕小班 回复 提问者 qq_慕神0589333 #3

    同学你好,1、是的,这里是受for循环的影响,response.sendRedirect会重复执行。

    而​Cannot call sendRedirect() after the response has been committed这个报错的意思就是在重定向或者转发后,又进行了重定向或转发,就会抛出这个异常。

        ​2、sendRedirect是重定向请求。重定向是浏览器会发送两次请求,先去服务器端拼好请求地址以后,再由浏览器重新发起的请求,这是重定向在底层自己执行的操作,并不是说我们需要执行两边sendRedirect重定向。

    祝学习愉快!

    2021-04-01 10:11:22
好帮手慕小班 2021-03-31 11:16:39

同学你好,根据同学贴出的报错信息,Cannot call sendRedirect() after the response has been committed-->提交响应后不能调用sendRedirect()


对于http的response,如果已经进行了提交(重定向,请求转发),则不能对response再进行任何操作,比如修改,比如再次提交。而对于已经提交的resposne或者请求转发,该方法并不会结束,它依然会继续往下执行,所以如果你在提交后继续执行response.sendRedirect就会报出这个错误。

http://img1.sycdn.imooc.com//climg/6063e92409ddf2b207580580.jpg

所以同学可以在response.sendRedirect后加一个return表示执行完成,不再继续

http://img1.sycdn.imooc.com//climg/6063e98409a010f306410295.jpg

如上所示修改后来试试。

祝学习愉快!

  • 提问者 qq_慕神0589333 #1

    对于已经提交的resposne或者请求转发,该方法并不会结束,它依然会继续往下执行

    这句话还是不太理解,已经提交的response是指重定向吗?为什么提交后还要往下执行?

    2021-03-31 13:49:36
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师