• Servlet的几个常用对象


    HttpServletRequest 对象

      HttpServletRequest 对象:主要作用是用来接收客户端发送过来的请求信息, 例如:请求的参数,发送的头信息等都属于客户端发来的信息,service()方法中 形参接收的是 HttpServletRequest 接口的实例化对象,表示该对象主要应用在 HTTP 协议上,该对象是由 Tomcat 封装好传递过来。

      几个常用的方法

        getRequestURL();客户端发出请求的时候完整的地址。

        getRequestURI();资源的部分名称,从站点名开始。

        getQueryString();请求行中的参数,从问好后面的参数。

        getHeader(String);获取特定的请求头内的内容。

        getParameter(String);获取参数。

        getparametervalues(String);获取指定参数的一系列值,返回一个String数组。

      HTTP Servlet Request的乱码解决

      由于现在的 request 属于接收客户端的参数,所以必然有其默认的语言编码, 主要是由于在解析过程中默认使用的编码方式为 ISO-8859-1(此编码不支持中 文),所以解析时一定会出现乱码。要想解决这种乱码问题,需要设置 request 中 的编码方式,告诉服务器以何种方式来解析数据。或者在接收到乱码数据以后, 再通过相应的编码格式还原。

      简单来说,需要将request中的编码进行设置为我们所需要的编码,request.setCharacterEncoding("UTF-8"),这样就不会出现乱码情况,但是这样只针对了post的形式

    在get形式的请求中,若是出现了乱码,则可以使用通用的形式,使用String的方法 new String(request.getparameter(name).getByte("ISO-8859-1","utf-8")。

      请求转发

      请求转发,是一种服务器的行为,当客户端请求到达后,服务器进行转发, 此时会将请求对象进行保存,地址栏中的 URL 地址不会改变,得到响应后,服 务器端再将响应发送给客户端,从始至终只有一个请求发出。实现方式如下,达 到多个资源协同响应的效果 ,判断是否是请求转发很简单,只需要看地址栏的地址变化与否就可以了,如果没变,就是请求转发。这里应该和重定向注意区分。
     

        request.getRequestDispatcher().forward(request,response)

       request 作为域对象

      通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即 服务器跳转有效。

      request.setAttribute();设置值

      request.getAttribute();获取值

      request.removeAttribute();删除于对象。

      

    HttpServletResponse 对象

      Web 服务器收到客户端的 http 请求,会针对每一次请求,分别创建一个用 于代表请求的 request 对象和代表响应的 response 对象。

      request 和 response 对象代表请求和响应:获取客户端数据,需要通过 request 对象;向客户端输出数据,需要通过 response 对象。

      HttpServletResponse 的主要功能用于服务器对客户端的请求进行响应,将 Web 服务器处理后的结果返回给客户端。service()方法中形参接收的是 HttpServletResponse 接口的实例 化对象,这个对象中封装了向客户端发送数据、 发送响应头,发送响应状态码的方法。

      定时跳转:response.setHeader("refresh", "2;URL=index.html");

      设置写出的格式,并且对客户端输出内容:

            // 设置响应的MIME类型
            response.setContentType("text/html;charset=UTF-8");
            // 获取输出字符流 (只能响应字符)
            PrintWriter pWriter = response.getWriter();
            pWriter.write("Hello World!");
            pWriter.write("<h1>Hello World!</h1>");
            
            pWriter.flush(); // 刷新
            pWriter.close(); // 关闭        

      获得response的outputStream对象,对客户端进行输出内容:

    // 获取输出字节流(能够响应任何类型的数据)
            ServletOutputStream outputStream = response.getOutputStream();
            outputStream.write("<h1>Hello World!</h1>".getBytes());
            outputStream.write("<a href='http://www.shsxt.com' target='_blank'>shsxt</a>".getBytes());
            
            outputStream.flush(); // 刷新
            outputStream.close(); // 关闭

      乱码解决

        response的乱码解决需要服务器和客户端的解码编码的格式统一

    response.setCharacterEncoding("UTF-8");
    response.setHeader("content-type", "text/html;charset=UTF-8");

      也可以一句话解决

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

      重定向

      重定向是一种服务器指导,客户端的行为。客户端发出第一个请求,被服务 器接收,经过处理服务器进行响应,与此同时,服务器给客户端一个地址(下次 请求的地址 resp.sendRedirect("url");),当客户端接收到响应后,立刻、马上、自动根据服务器 给的地址进行请求的发送第二个请求,服务器接收请求并作出 响应,重定向完成。从描述 中可以看出重定向当中有两个请求存在,并且属于 客户端行为。

      相应图片

      在客户端解析资源时默认是以文本(text/html)的形式,当 响应图片时 需要指定响应头信息,告知客户端响应内容为图片形式,使用一种 叫做 MIME 类型的东西来 指定。MIME 类型见 Tomcat 的 web.xml 文件。

    //设置为图片响应类型
            response.setContentType("image/jpeg;charset=UTF-8");
            
            // 得到图片的在服务器的真实路径
            String realPath  = request.getServletContext().getRealPath("/luffy.jpg");
            System.out.println(realPath);
            
            // 通过路径得到对应的 file对象
            File file = new File(realPath);
            
            // 判断file对象是否存在,并且是一个标准文件
            if (file.exists() && file.isFile()) {
                // 得到输入流
                InputStream inputStream = new FileInputStream(file);
                // 得到输入字节流
                ServletOutputStream outputStream = response.getOutputStream();
                
                byte[] car = new byte[1024];
                
                int len = 0;
                
                while ((len = inputStream.read(car)) != -1) {
                    outputStream.write(car, 0, len);
                }
            }
            

    Cookie对象

      Cookie 是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客 户端,或者 在客户端进行处理的数据,放在本地的计算机上,不需要通过网络 传输,因而提高网页处理的效率,并且能够减少服务器的负载,但是由于 Cookie 是服务器端保存在客户端的信息, 所以其安全性也是很差的。例如常见的记住 密码则可以通过 Cookie 来实现。
       

      简单创建Cookie对象

    // 创建Cookie对象
            Cookie cookie = new Cookie("uname", "zhangsan");
            Cookie cookie2 = new Cookie("uname2", "zhangsan2");
    // 响应Cookie对象给客户端
          response.addCookie(cookie);
          response.addCookie(cookie2);

       Cookie 的获取

      在服务器端只提供了一个 getCookies()的方法用来获取客户端回传的所有 cookie 组成的一个数组,如果需要获取单个 cookie 则需要通过遍历,getName() 获取 Cookie 的名称,getValue()获取 Cookie 的值。

    // 获取Cookie的值
            Cookie[] cookies = request.getCookies();
            // 判断数组是否为空
            if (cookies != null &&cookies.length > 0) {
                // 循环得到cookie对象
                for (Cookie cookie : cookies) {
                    System.out.println("key:" + cookie.getName() + ", value:" + cookie.getValue());
                }
            }

      Cookie 到期时间的设定

      从图中除了看到 Cookie 的名称和内容外,我们还需要关心一个信息,到期 时间,到期时间用来指定该 cookie 何时失效。默认为当前浏览器关闭即失效。 我们可以手动设定 cookie 的有效时间(通过到期时间计算),通过 setMaxAge(int time);方法设定 cookie 的最大有效时间,以秒为单位。

      负整数:cookie 的 maxAge 属性的默认值就是-1,表示只在浏览器内存中 存活,一旦关闭 浏览器窗口,那么 cookie 就会消失。

      正整数:表示 cookie 对象可存活指定的秒数。当生命大于 0 时,浏览器 会把 Cookie 保 存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie 也 会存活相应的时间。

      零:cookie 生命等于 0 是一个特殊的值,它表示 cookie 被作废!也就是 说,如果原来 浏览器已经保存了这个 Cookie,那么可以通过 Cookie 的 setMaxAge(0)来删除这个 Cookie。 无论是在浏览器内存中,还是在客户端硬盘 上都会删除这个 Cookie。

    HttpSession对象

      对于服务器而言,每一个连接到它的客户端都是一个 session,servlet 容器 使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的 时间段,跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该 用户可能多次访问一个站点。可以通过此接口查看和操作有关某个会话的信息, 比如会话标识符、创建时间和最后一次访问时间。在整个 session 中,最重要的 就是属性的操作。

      session 无论客户端还是服务器端都可以感知到,若重新打开一个新的浏览 器,则无法取得之前设置的 session,因为每一个 session 只保存在当前的浏览 器当中,并在相关的页面取得。

      如何获得一个HttpSession对象?

    HttpSession session= req.getSession();
    //获取Session的唯一id
    String sid = session.getid();

     Jsession

      每当一次请求到达服务器,如果开启了会话(访问了 session),服务器第一 步会查看是否从客户端回传一个名为 JSESSION 的 cookie,如果没有则认为这是 一次新的会话,会创建 一个新的 session 对象,并用唯一的 sessionId 为此次 会话做一个标志。如果有 JESSIONID 这 个 cookie 回传,服务器则会根据 JSESSIONID 这个值去查看是否含有 id 为 JSESSION 值的 session 对象,如果没有则 认为是一个新的会话,重新创建一个新的 session 对象,并标志此次会话; 如 果找到了相应的 session 对象,则认为是之前标志过的一次会话,返回该 session 对象,数据达到共享。

      这里提到一个叫做 JSESSION 的 cookie,这是一个比较特殊的 cookie,当用 户请求服务器时,如果访问了 session,则服务器会创建一个名为 JSESSION,值 为获取到的 session(无论是获取到的还是新创建的)的 sessionId 的 cookie 对 象,并添加到 response 对象中,响应给客户端,有效时间为关闭浏览器。


      作为域对象

      Session 用来表示一次会话,在一次会话中数据是可以共享的,这时 session 作为域对象存在,可以通过 setAttribute(name,value);方法向域对象中添加数据, 通过 getAttribute(name) 从域对象中获取数据,通过 removeAttribute(name)从域 对象中移除数据。

      即使通过重定向打开的网页,session中的数据依然存在,当然,只要session存在,这里的数据就不会丢失。

    //设置session对象的值
    session.setAttribute("uname", "周杰伦");

    Session 的销毁

      Session的默认存在事件是30min,这期间你不可以对网页进行任何操作,30min过后这个对象被销毁,生成新的对象,存在的数据也随着新的session的诞生就对象的销毁而销毁。

      我们也可以自己设置静默操作的销毁事件的值

    session.setMaxInactiveInterval(int);
    //int 为多少秒

      也可以让session即刻销毁

    session.invalidate();

      关闭浏览器,结束本次会话,sessio,n销毁

      非正常关闭服务器。若是正常关闭,服务器会把session对象写在磁盘上,下次启动,自动加载。

    ServletContext 对象

      每一个 web 应用都有且仅有一个 ServletContext 对象,又称 Application 对 象,从名称中可知,该对象是与应用程序相关的。在 WEB 容器启动的时候,会 为每一个 WEB 应用程序创 建一个对应的 ServletContext 对象。
      该对象有两大作用,第一、作为域对象用来共享数据,此时数据在整个应用 程序中共享; 第二、该对象中保存了当前应用程序相关信息。例如可以通过 getServerInfo();方法获取当前 服 务 器 信 息 , getResourceAsStream(String path); 方法以流的形式获取某个资源,getRealPath(String path);获取资源的真实路径等。

      如何使用ServletContext?

    // 获取服务器的版本
            String serverInfo = request.getServletContext().getServerInfo();
            System.out.println(serverInfo);
            
            // 获取当前项目的真实路径(在服务器上的路径)
            String realPath = request.getServletContext().getRealPath("/");
            System.out.println(realPath);
        

      获取ServletContext的多种方法

    /**
             * 获取 ServletContext 对象的途径有很多
             *     1、通过 request 对象可以
             *     2、通过 session 可以
             *     3、通过servletConfig可以,在 Servlet 标准中提供了获取 ServletConfig 的方法
             *     4、本身Servlet标准后期的实现类中也提供了直接获取 ServletContext 的方法
             */
            // 1、通过 request 对象可以
            ServletContext servletContext = request.getServletContext();
            
            // 2、通过 session 可以
            ServletContext servletContext2 = request.getSession().getServletContext();
            HttpSession session = request.getSession();
            ServletContext servletContext3 = session.getServletContext();
        // 3、通过servletConfig可以,在 Servlet 标准中提供了获取 ServletConfig 的方法
          ServletConfig servletConfig = getServletConfig();
          ServletContext servletContext4 = servletConfig.getServletContext();
      
          // 4、本身Servlet标准后期的实现类中也提供了直接获取 ServletContext 的方法
          ServletContext servletContext5 = getServletContext();

     ServletContext的域对象

      ServletContext 也可当做域对象来使用,通过向 ServletContext 中存取数据, 可以使得整个应用程序共享某些数据。当然不建议存放过多数据,因为 ServletContext 中的数据一旦存储进去没有手动移除将会一直保存。
     

     

      

  • 相关阅读:
    Git
    Spring
    Linux
    Linux
    Linux
    Linux
    Linux
    Linux
    Linux
    Linux
  • 原文地址:https://www.cnblogs.com/yxmgg/p/9142045.html
Copyright © 2020-2023  润新知