首页 > 程序开发 > 软件开发 > Java >

java--重定向和转发的小细节

2018-01-03

java--重定向和转发的小细节。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>
  <head>
    <title>转发/重定向的一些小细节</title>
  </head>
  <body>
    <!-- 
            1.转发时,两个servlet都输出信息的问题:  转发是通过request进行----助理解是呼叫转移  , 转发时,路径不要带项目名
            1)OneServlet的输出信息只是保存到缓存中,会被TwoServlet清空。因此OneServlet中的内容无法输出
            2)如果在OneServlet中调用"out.flush();",那么OneServlet中的信息会输出,而TwoServlet不会输出。不但如此,OneServlet中的转发都会出异常,因为:
                              刷缓存就是要Tomcat帮我们输出信息。而同一个请求,Tomcat只会输出一次,因此输出之后流就关闭了,无法再转发。
            3)该方式下,地址栏中始终显示的是第1个的访问地址

        2.转发时(共享同一个request和response),两个servlet的访问顺序,传参:
            1)访问顺序:OneServlet中是GET方式,TwoServlet走的是doGet()。 OneServlet中是POST方式,TwoServlet走的是doPost()。
            2)在OneServlet中转发代码之后,不能再调用类似 转发或重定向 的代码。否则会500异常,因为转发之后,不能再回到此处进行跳转到别的页面        
            3)读取页面参数: 由于是共享同一个request,请求页面的参数在两个servlet当中都可以读取出来。---请求页面中,GET方式的参数是在地址栏中通过"?name=Jack&age=22"上传,POST方式是通过<input>组件上传的。
            4)两个servlet之间传参: 在OneServlet中request.setAttribute(),在TwoServlet中request.getAttribute()可以读取到

        3.重定向(两个不同的request和response),两个servlet的访问顺序,传参:
            1)重定向是通过response实现的: response.sendRedirect()   //重定向时的路径一定要带项目名称
            2)第1个servlet中的内容会输出,但瞬间就会被第2个覆盖。因为浏览器接收到第1个的响应时,立刻会自动发起第2次请求,进而接收并显示第2次请求的响应结果。
            3)在第1个servlet重定向代码之后,不能再调用类似 转发或重定向 的代码。否则会500异常,因为转发之后,不能再回到此处进行跳转到别的页面        
            4)访问顺序: 无论第1个是GET方式还是POST方式,第2个走的是doGet()。----该方式下,地址栏中最终会显示成第2个的访问地址

            5)读取页面参数: 由于是不同的request,请求页面的参数在第1个servlet当中能够读取出来,而第2个servlet中不能读取出来。
            6)两个servlet之间传参: “无法”通过  在第1个中request.setAttribute(),在第2个中request.getAttribute();  ----通过attribute的路中走不通的
                               如果非要传参,可以通过:在第1个servlet当中给重定向地址添加“?name=Jack&age=25”实现---该方式下地址栏会显示参数信息,明文传输信息,因此敏感数据要加密
            7)站外跳转 只能通过重定向来实现,而且地址必须以“https://”开头,否则会被识别成站内。



     -->

    <h2>转发</h2>
    GET:<a href="servlet/one?name=湖南">转发--两个servlet的访问顺序,读取页面数据,传参</a><br/>
    POST:<form action="<%=request.getContextPath()%>/servlet/one" method="post">
        姓名:<input type="text" name="name"/><br/>
        <input type="submit" value="提交"/>
    </form>
    <h2>重定向</h2>
    GET:<a href="servlet/oneServlet?name=rose湖南">重定向--两个servlet的访问顺序,读取页面数据,传参</a><br/>
    POST:<form action="<%=request.getContextPath()%>/servlet/oneServlet" method="post">
        姓名:<input type="text" name="name"/><br/>
        <input type="submit" value="提交"/>
    </form>


  </body>
</html>

转发演示
cn.hncu.servlet.one.OneServlet

package cn.hncu.servlet.one;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OneServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("GET城院!");
//      out.flush();//刷完之后,本页面输出,而TwoServlet不会输出,转发会出异常(转发及之后的代码都不会执行)
        System.out.println("GET城院!");

        String name=request.getParameter("name");
        //有中文
        byte bs[]=name.getBytes("ISO-8859-1");
        name=new String(bs,"utf-8");
        request.setAttribute("age", "10城院");
        String age=(String) request.getAttribute("age");
        System.out.println("OneServlet-GET:name="+name+",age="+age);

        request.getRequestDispatcher("/servlet/two").forward(request, response);

//      response.sendRedirect("/servletDemo_4/servlet/two");//500异常

        out.println("GET城院2...");
        System.out.println("GET城院2...");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("POST城院!");
//      out.flush();//刷完之后,本页面输出,而TwoServlet不会输出,转发会出异常(转发及之后的代码都不会执行)
        System.out.println("POST城院!");

        String name=request.getParameter("name");
        //有中文
        byte bs[]=name.getBytes("ISO-8859-1");
        name=new String(bs,"utf-8");
        request.setAttribute("age", "10城院");
        String age=(String) request.getAttribute("age");
        System.out.println("OneServlet-POST:name="+name+",age="+age);

        request.getRequestDispatcher("/servlet/two").forward(request, response);
//      response.sendRedirect("/servletDemo_4/servlet/two");//500异常
        out.println("POST城院2...");
        System.out.println("POST城院2...");
    }

}

cn.hncu.servlet.one.TwoServlet

package cn.hncu.servlet.one;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TwoServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();
        out.println("TwoServlet-GET城院!");

        String name=request.getParameter("name");
        //有中文
        if(name!=null){

            byte bs[]=name.getBytes("ISO-8859-1");
            name=new String(bs,"utf-8");
        }
        String age=(String) request.getAttribute("age");
        out.println("<br/>name="+name+",age="+age);
        System.out.println("TwoServlet-GET:name="+name+",age="+age);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("TwoServlet-POST城院!");

        String name=request.getParameter("name");
        //有中文
        if(name!=null){

            byte bs[]=name.getBytes("ISO-8859-1");
            name=new String(bs,"utf-8");
        }
        String age=(String) request.getAttribute("age");
        out.println("<br/>name="+name+",age="+age);
        System.out.println("TwoServlet-POST:name="+name+",age="+age);
    }

}

这里写图片描述

重定向演示
cn.hncu.servlet.two.OneServlet

package cn.hncu.servlet.two;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OneServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("GET城院!");
//      out.flush();//刷完之后,本页面输出,而TwoServlet不会输出,转发会出异常(转发及之后的代码都不会执行)
        System.out.println("GET城院!");

        String name=request.getParameter("name");
        //有中文
        byte bs[]=name.getBytes("ISO-8859-1");
        name=new String(bs,"utf-8");
        request.setAttribute("age", "10城院");
        String age=(String) request.getAttribute("age");
        System.out.println("OneServlet-GET:name="+name+",age="+age);


        response.sendRedirect("/servletDemo_4/servlet/two");
        //在地址后面或者地址栏信息后面添加参数--不安全(明文传输消息),所以敏感信息选哟加密
//      request.getRequestDispatcher("/servlet/two").forward(request, response);//500异常

        out.println("GET城院2...");
        System.out.println("GET城院2...");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("POST城院!");
//      out.flush();//刷完之后,本页面输出,而TwoServlet不会输出,转发会出异常(转发及之后的代码都不会执行)
        System.out.println("POST城院!");

        String name=request.getParameter("name");
        //有中文
        byte bs[]=name.getBytes("ISO-8859-1");
        name=new String(bs,"utf-8");
        request.setAttribute("age", "10城院");
        String age=(String) request.getAttribute("age");
        System.out.println("OneServlet-POST:name="+name+",age="+age);

        response.sendRedirect("/servletDemo_4/servlet/two");
//      request.getRequestDispatcher("/servlet/two").forward(request, response);//500异常
        out.println("POST城院2...");
        System.out.println("POST城院2...");
    }

}

cn.hncu.servlet.two.TwoServlet

package cn.hncu.servlet.two;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TwoServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();
        out.println("TwoServlet-GET城院!");

        String name=request.getParameter("name");
        //有中文
        byte bs[]=name.getBytes("ISO-8859-1");
        name=new String(bs,"utf-8");
        String age=(String) request.getAttribute("age");
        out.println("<br/>name="+name+",age="+age);
        System.out.println("TwoServlet-GET:name="+name+",age="+age);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("TwoServlet-POST城院!");

        String name=request.getParameter("name");
        //有中文
        byte bs[]=name.getBytes("ISO-8859-1");
        name=new String(bs,"utf-8");
        String age=(String) request.getAttribute("age");
        out.println("<br/>name="+name+",age="+age);
        System.out.println("TwoServlet-POST:name="+name+",age="+age);
    }

}

这里写图片描述

输出:
这里写图片描述

相关文章
最新文章
热点推荐