zoukankan      html  css  js  c++  java
  • Servlet中的转发

    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();//刷缓存就是要Tomcat帮我们输出信息。而Tomcat只会输出一次,因此输出之后流就关闭了,无法再转发

    String name = request.getParameter("name");
    //GET方式下,中文乱码只能通过 byte b[] = name.getBytes("iso8859-1"); name= new String(b,"utf-8");
    String age = request.getParameter("age");
    System.out.println("OneServlet: "+name+","+age);

    request.setAttribute("addr", "GET中国北京");
    //request.setAttribute("studs", new ArrayList<Map<String, Object>>());//可以把集合数据设置到attribue中

    RequestDispatcher rd = request.getRequestDispatcher("/servlet/TowServlet");//转发时,路径不要带项目名
    rd.forward(request, response);

    //response.sendRedirect("jsps/res.jsp");//

    }

    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();//刷缓存就是要Tomcat帮我们输出信息。而Tomcat只会输出一次,因此输出之后流就关闭了,无法再转发

    request.setCharacterEncoding("utf-8");//只对POST方式有效
    String name = request.getParameter("name");
    //GET方式下,中文乱码只能通过 byte b[] = name.getBytes("iso8859-1"); name= new String(b,"utf-8");
    String age = request.getParameter("age");
    System.out.println("OneServlet: "+name+","+age);

    request.setAttribute("addr", "POST中国北京");

    RequestDispatcher rd = request.getRequestDispatcher("/servlet/TowServlet");//转发时,路径不要带项目名
    rd.forward(request, response);
    }

    }

    ------------------------------------------------------------------------------------------

    public class TowServlet 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城院!");

    String name = request.getParameter("name");
    //GET方式下,中文乱码只能通过 byte b[] = name.getBytes("iso8859-1"); name= new String(b,"utf-8");
    String age = request.getParameter("age");
    System.out.println("TwoServlet: "+name+","+age);

    String addr = (String) request.getAttribute("addr");
    System.out.println("addr:"+addr);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    out.println("POST城院!");

    String addr = (String) request.getAttribute("addr");
    System.out.println("addr:"+addr);
    }

    }

    -------------------------------------------------------------------------------------------------------------------------------------------------------


    <a href="<%=request.getContextPath()%>/servlet/OneServlet?name=Jack&age=22">转发时,两个servlet的访问顺序, 读取页面数据, 传参</a>
    <form action="<%=request.getContextPath()%>/servlet/OneServlet" method="post">
    姓名:<input type="text" name="name"/>
    <input type="submit" value="提交">
    </form>

    ---------------------------------------------------------------------------------------------------------------------------------------------------------

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

    -----------------------------------------------------------------------------------------------------------------------------------------------------------

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

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

  • 相关阅读:
    板邓:php获取数组元素个数
    板邓:PHP解决Using $this when not in object context in【转】
    板邓:MYSQL distinct关键字查询重复值只显示一条记录
    板邓: php 过滤文章的html标签方法
    板邓:PHP使用mb_strimwidth截取中文字符串方法大全
    板邓:php str_replace单双引号的替换问题
    板邓:PHP下利用PHPMailer配合QQ邮箱下的域名邮箱发送邮件(转)
    板邓:wordpress自定义伪静态 WP_Rewrite
    板邓:wordpress获取当前页面的id、别名
    获取文件夹名
  • 原文地址:https://www.cnblogs.com/1314wamm/p/5951489.html
Copyright © 2011-2022 走看看