java--servlet相关类(4)

来源:互联网 发布:投标书编制软件 编辑:程序博客网 时间:2024/06/11 10:21
<%@ 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)站外跳转 只能通过重定向来实现,而且地址必须以“http://”开头,否则会被识别成站内。     -->    <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>

转发演示
在某种情况下,一个Servlet类可能无法完成全部的工作,为了让各Servlet协同工作,Servlet规范为Web组件之间协同工作提供了两种途径:
        请求转发。-源组件将请求转发给目标组件。
        请求包含。-源组件将目录组件的结果包含到自身的响应结果中来。
注:转发和包含会共享同一个request的response对像
获取RequestDispatcher的两种方法
调用ServletContext.getRequestDispatcher(path)
调用HttpServletRequest.getRequestDispatcher(path)
以上两者的区别在于 (建议使用第二种并使用/开头)
        前者path参数必须是绝对路径,即必须以/开头。
        后者path即可以是绝对路径,也可以是相对路径
请求转发的处理流程
1、清空用于存放响应正文数据的缓冲区。
也正因此,源组件在转发之前的内容不会被发送的客户端。
2、如果目标组件为Servlet、Jsp就调用它们的Service方法。如果目标组件为html页面,就读取此文本将它发送到客户端。
3、关闭输出流。也正因此,源组件在调用之后发送的文本不会被发送的客户端。
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);    }}

这里写图片描述

重定向演示
注:重定向是浏览器自动又向服务器发起的新请求。所以不会共享之前的request和response对像。

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);    }}

这里写图片描述

输出:
这里写图片描述

0 0