• day09 request 和response


    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。 request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向容器输出数据,只需要找response对象就行了。

    HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。

    response 常用的API

    设置编码格式

    response. setContentType(“text/html;charset=UTF-8”);

    客户端清理缓存

    response.addHeader("Pragma", "no-cache");

    response.setHeader("Cache-Control", "no-cache");

    response.setHeader("Expires", "0");

    请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。 地址栏会变,并发送2次请求,增加服务器负担 实现方式 response.sendRedirect()

    在response API中提供sendRedirect() --- 完成302+Location重定向效果
    例如:response.sendRedirect("/day06/welcome.html");

    状态:

    200 请求处理成功
    302 客户端重定向
    304 客户端访问资源没有被修改,客户端访问本地缓存
    404 访问资源不存在
    500 服务器内部出错

    response.sendRedirect("/day06/welcome.html");

    getOutputStream 和getWriter 区别

    1)getOutputStream和getWriter不能同时使用
    2)必须在getOutputStream喝getWriter之前设置响应编码
    3)getOutputStream和getWriter输出内容是HTTP响应体
    4)getOutputStream和getWriter存在缓冲区,在service方法结束时,自动关闭流,flush缓冲区内容

    例子:

    ServletOutputStream sos = response.getOutputStream();
    sos.write("你好123".getBytes("UTF-8"));//getBytes默认编码为本地编码(即:gbk)

    文件下载 

    response.setHeader("Content-Disposition","attachment;filename="+filename); ----设置文件以附件形式下载(对于浏览器识别格式文件)

    例如:

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    //通过路径得到一个输入流
    String path = this.getServletContext().getRealPath("/WEB-INF/classes/美女.jpg");

    FileInputStream fis = new FileInputStream(path);
    //创建字节输出流
    ServletOutputStream sos = response.getOutputStream();

    //得到要下载的文件名
    String filename = path.substring(path.lastIndexOf("\")+1);

    //设置文件名的编码
    filename = URLEncoder.encode(filename, "UTF-8");//将不安全的文件名改为UTF-8格式

    //告知客户端要下载文件
    response.setHeader("content-disposition", "attachment;filename="+filename);
    response.setHeader("content-type", "image/jpeg");

    //执行输出操作
    int len = 1;
    byte[] b = new byte[1024];
    while((len=fis.read(b))!=-1){
    sos.write(b,0,len);
    }

    sos.close();
    fis.close();
    }

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

    }

     刷新网页3秒钟之后重定向
    response.setHeader("refresh", "3;url=http://www.baidu.com");

    HttpServletRequest

    HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。 查看request的API文档

    getMethod(); 获得请求方式
    // ***getRequestURL();返回客户端发出请求时的完整URL。
    // ***getRequestURI(); 返回请求行中的资源名部分。
    // *****getContextPath(); 当前应用的虚拟目录 /day09_01_HttpServletRequest
    // getQueryString() ; 返回请求行中的参数部分。

    例如:

    System.out.println(request.getMethod());// GET
    System.out.println(request.getRequestURL()); // http://localhost:8080/day09_01_HttpServletRequest/servlet/demo1
    System.out.println(request.getRequestURI()); // /day09_01_HttpServletRequest/servlet/demo1
    System.out.println(request.getContextPath()); // /day09_01_HttpServletRequest
    System.out.println(request.getQueryString()); // username=tom

    获得客户机信息 getRequestURL方法返回客户端发出请求时的完整URL。

    获得客户机请求头

    getHead(name)方法

    getHeaders(String name)方法

    getHeaderNames方法 获得客户机请求参数(客户端提交的数据)

    getParameter(name)方法

    getParameterValues(String name)方法

    getParameterNames方法 getParameterMap方法 //做框架用,非常实用

    request常用方法2

    request对象实现请求转发:请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。 request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。 request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。 setAttribute方法 getAttribute方法 removeAttribute方法 getAttributeNames方法

    RequestDispather

    表示请求分发器,它有两个方法: forward():把请求转发给目标组件

    public void forward(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOException include():包含目标组件的响应结果

    public void include(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOException 得到RequestDispatcher对象

    1、ServletContext对象的getRequestDispather(String path1) path1必须用绝对路径,即以”/”开头,若用相对路径会抛出异常IllegalArgumentException

    2、ServletRequest对象的getRequestDispatcher(String path2) path2可以用绝对路径也可以用相对路径

    请求范围

    web应用范围内的共享数据作为ServeltContext对象的属性而存在(setAttribute),只要共享ServletContext对象也就共享了其数据。 请求范围内的共享数据作为ServletRequest对象的属性而存在(setAttribute),只要共享ServletRequest对象也就共享了其数据。

    重定向

    重定向机制的运作流程 1、用户在浏览器端输入特定URL,请求访问服务器端的某个组件 2、服务器端的组件返回一个状态码为302的响应结果。 3、当浏览器端接收到这种响应结果后,再立即自动请求访问另一个web组件 4、浏览器端接收到来自另一个web组件的响应结果。 HttpServeltResponse的sendRedirect(String location)用于重定向

    Servlet源组件生成的响应结果不会被发送到客户端。response.sendRedirect(String location)方法一律返回状态码为302的响应结果。 如果源组件在进行重定向之前,已经提交了响应结果,会抛出IllegalStateException。为了避免异常,不应该在源组件中提交响应结果。 在Servlet源组件重定向语句后面的代码也会执行。 源组件和目标组件不共享同一个ServletRequest对象。 对于sendRedirect(String location)方法的参数,如果以“/”开头,表示相对于当前服务器根路径的URL。以“http"//”开头,表示一个完整路径。 目标组件不必是同一服务器上的同一个web应用的组件,它可以是任意一个有效网页。

    例子:

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

    response.setContentType("text/html;charset=UTF-8");
    response.getWriter().write("注册成功!3秒钟跳到主页");
    //设置3秒钟跳转
    response.setHeader("refresh", "3;url=/day09_00_HttpServletResponse/servlet/demo6");
    }

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

    }

    Request 的例子

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    //告诉服务器要使用什么编码,注:浏览器使用的是什么编码传过来的就是什么编码
    request.setCharacterEncoding("UTF-8");//只能解决post方式的乱码
    test1(request);
    }

    private void test1(HttpServletRequest request) {
    //获取所有的表单name的名子
    Enumeration names = request.getParameterNames();
    while(names.hasMoreElements()){
    String name = (String) names.nextElement();//得到每一个name名
    String[] values = request.getParameterValues(name);//根据name名,得到value值
    for (int i = 0;values!=null && i < values.length; i++) {
    System.out.println(name+" "+values[i]);
    }
    }
    }

    //test1 方法

    private void test1(HttpServletRequest request) throws UnsupportedEncodingException {
    //获取表单数据

    //根据表单中name属性的名,获取value属性的值方法
    String userName = request.getParameter("userName");
    String pwd = request.getParameter("pwd");
    String sex = request.getParameter("sex");
    String[] hobbys = request.getParameterValues("hobby");

    String city = request.getParameter("city");

    userName = new String(userName.getBytes("iso-8859-1"),"UTF-8");
    System.out.println(userName);
    System.out.println(pwd);
    System.out.println(sex);

    for (int i = 0;hobbys!=null && i < hobbys.length; i++) {
    System.out.print(hobbys[i]+" ");
    }
    System.out.println();

    System.out.println(city);
    }

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


    }

    请求重定向例子:

    A:

    public class ServletDemo7 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    System.out.println("A:我要借钱!");
    System.out.println("B:我不有,但是我可以告诉你谁有");
    /*//告诉客户端要重新定向新的资源
    response.setStatus(302);
    //告诉浏览器要去访问哪个URL
    response.setHeader("location", "/day09_00_HttpServletResponse/servlet/demo8");*/
    //请求重定向
    response.sendRedirect("/day09_00_HttpServletResponse/servlet/demo8");
    System.out.println("A: 我去了");
    }

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

    }

    B:

    public class ServletDemo8 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    System.out.println("我有钱,我借你!");
    }

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

    }

    结果:

    A:我要借钱!
    B:我不有,但是我可以告诉你谁有
    A: 我去了
    我有钱,我借你!

    include 例子:

    ServletDemo5 

    public class ServletDemo5 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");

    String str = "aaaaa";

    System.out.println("A:我想办事");
    System.out.println("B:我办不了,但我可以找人帮你办");

    //将非表单的数据添加到request的域中
    request.setAttribute("s", str);
    //将请求转发到demo6中
    //request.getRequestDispatcher("/servlet/demo6").forward(request, response);
    //注:请求转发不能跳转到其它应用
    //使用重定向
    //response.sendRedirect(request.getContextPath()+"/servlet/demo6");
    System.out.println("B:事办完了");

    //请求包含
    request.getRequestDispatcher("/servlet/demo6").include(request, response);
    }

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

    }

    ServletDemo6:

    public class ServletDemo6 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    System.out.println("这个事我能办");
    //从request对象中获取s的值
    String s = (String) request.getAttribute("s");
    System.out.println(s);
    }

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

    }

    结果为:

    A:我想办事
    B:我办不了,但我可以找人帮你办
    B:事办完了
    这个事我能办
    aaaaa

    重定向和转发的区别

    区别一:

      重定向时浏览器上的网址改变
      转发是浏览器上的网址不变
    区别二:
      重定向实际上产生了两次请求
    转发只有一次请求
    重定向:
      发送请求 -->服务器运行-->响应请求,返回给浏览器一个新的地址与响应码-->浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址-->服务器运行-->响应请求给浏览器
    转发:
      发送请求 -->服务器运行-->进行请求的重新设置,例如通过request.setAttribute(name,value)-->根据转发的地址,获取该地址的网页-->响应请求给浏览器
    区别三:
      重定向时的网址可以是任何网址
      转发的网址必须是本站点的网址
    详解:
      重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
    转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
    正文开始:
      先是看上去不同,他们的调用分别如下:
    request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jsp
    response.sendRedirect("apage.jsp");//重定向到apage.jsp

  • 相关阅读:
    19 C#循环语句的跳过和中断 continue和break
    18 C#中的循环执行 for循环
    一种绝对提高开发水平的方法(推荐英语)
    大数据知识普及
    全链路压测压测报告
    QuickSearch快排
    二分查找
    算法
    基于领域驱动设计的业务中台架构设计
    【科普】Scrum——从橄榄球争球到敏捷开发
  • 原文地址:https://www.cnblogs.com/lixiaowei395659729/p/7258960.html
Copyright © 2020-2023  润新知