• servlet工具类 response,request,cookie,session


    概述:

    1. HttpServeltResponse接口:负责将运行结果写入到响应包

    2. HttpServletRequest接口: 负责读取请求协议包信息

    3.ServletContext接口:可以为当前网站中所有的Servlet提欧【共享数据】

    4.Cookie: 在一次会话过程中,存储浏览器在服务端产生的私人数据

    5.HttpSession接口:在一次会话过程中,存储浏览器在服务端产生的私人数据

    HttpServeltResponse接口的使用:设置response响应头的参数,在响应体中写入内容

      1)一个来自于Servlet规范中接口;由Tomcat负责提供这个接口实现类

      2)负责在Servlet运行完毕后,将相关的数据写入到【响应头】和【响应体】

      3)开发人员习惯于将HttpServletResponse接口修饰对象,称为【响应对象】

    response.setCharacterEncoding() 与 response.setContentType()

      1)相同点: 都可以设置响应头中【字符集】

      2)不同点:response.setContentType()还可以设置【内容类型】

    public class OneServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            String str="Hello HttpServletResponse";//OneServlet运行后的结果,写到响应体里
    
            /**
             * 1.浏览器根据【响应头】中设置的【字符集】对接受内容进行解码
             * 2.在默认情况下【响应头】中字符集【ISO-8859-1】
             * 3.显示【中文】要把响应头中字符集设置为【GBK】
             */
            resp.setContentType("text/html;charset=utf-8");
            String msg = "明天休息";
            resp.getWriter().write(msg);
    
    
            /**
             * 从resp中得到一个【输出流】
             * 【输出流】将字符串写入到【响应体】中
             */
            PrintWriter out = resp.getWriter();
            out.write(str);
    
            /**
             * out.write()只能将字符串或者unicode码写入响应体中
             * out.print()则会按原本的特征写入
             * */
            int num=50;
            out.write(num);
            out.println(num);
    
            /**
             * 富文本:既有文字内容又有html标签
             * 1.浏览器根据【响应头】的【内容类型】处理接受结果
             * 2.默认情况下【响应头】的【内容类型】是"text"
             * 3.如果要成功显示html标签,需要通知浏览器,重新设置响应头的内容类型集
             *       resp.setContentType("text/html");
             */
            resp.setContentType("text/html");
            msg = "apple<br/>orange<br/>egg";
            resp.getWriter().write(msg);
    
        }//tomcat 会在 OneServlet调用完毕后将响应包推送到浏览器上
    }


    HttpServeltRequest接口的使用

      1.来自于Servlet规范中一个接口,接口实现类由Tomcat负责提供的

      2.由HttpServletRequest接口修饰对象,可以帮助开发人员读取【请求协议包】信息相当于[Scanner]

      3.一般习惯于将HttpServletRequest接口修饰对象称为【请求对象】

    使用

      1.读取【请求行】信息
        String url = request.getRequstURL();
        String method = request.getMethod();

      2. 读取【请求头】或则【请求体】中所有的【请求参数名】

        request.getParameterNames();

      3. 读取请求头或则请求体中【参数内容】

        http://localhost:555/myWeb/two.do?uname=mike
        String value = request.getParameter("请求参数名")


        http://localhost:555/myWeb/two.do?uname=mike&uname=allen&uname=smith
        String array []=request.getParameterValues("请求参数名")

    中文请求参数乱码问题:

      1.[原因]: 跟浏览器采用【请求方式】有关

          如果浏览器以【GET方式】发送请求,【请求参数】在【请求头】存放
          在请求协议包到达服务端之后,【请求头】内容是由Tomcat负责解析Tomcat9.0在解析数据时,默认采用的字符集[utf-8].

          所以如果浏览器以【GET】方式发送中文参数,此时在服务端不会出现中文乱码问题


          如果浏览器以【POST方式】发送请求,【请求参数】在【请求体】存放
          在请求协议包到达服务端之后,【请求体】内容是由对应【请求对象request】
          负责解码的。request对象默认使用【ISO-8859-1】字符集
          所以如果浏览器以【POST】方式发送中文参数,此时在服务端必须会出现中文乱码问题


      2.【解决方案】:在request对象解析数据之前,重新设置request对象字符集【utf-8】即可.

            request.setCharacterEncoding("utf-8");
            String value =request.getParameter("参数");

    使用例子

    public class TwoServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
            //1.读取【请求行】中【请求的资源文件地址】
            String url = req.getRequestURI().toString();
            //2.读取【请求行】中的【请求方式】
            String method = req.getMethod();
    
            System.out.println("浏览器访问的资源文件地址"+url);
            System.out.println("浏览器访问时采用的请求方式"+method);
    
            //3.读取请求协议包中所有请求参数名称
            Enumeration paras = req.getParameterNames();
            while(paras.hasMoreElements()){
                System.out.println(paras.nextElement());
            }
    
            //4.读取【单个请求参数内容】
            String userAge = req.getParameter("age");
            System.out.println(userAge);
    
            //5.读取【一个参数关联多个内容】****复选框作为参数时往往带有多个值
            String[] homes = req.getParameterValues("home");
            for(String home:homes){
                System.out.println(home);
            }
        }
    }

    请求对象与响应对象生命周期:

      1.都是由Tomcat负责创建的
      2.每当Tomcat收到一个【请求协议包】时,就会为这个请求协议包创建一对【请求对象和响应对象】
      3.一次请求对应 一对【请求对象和响应对象】
      4.在Tomcat调用被请求的Servlet中服务方法(doGet/doPost)时,负责将本次【请求对象和响应对象】作为参数传入到服务方法
      5.在服务方法工作完毕后,Tomcat 销毁本次请求相关的request和response
      6.Tomcat 负责将【响应包】推送到浏览器上

    ServletContext接口

      1.Servlet规范中一个接口,接口实现类由Tomcat负责提供
      2.负责为当前工程中所有Servlet提供【共享数据】
      3.开发人员习惯于将ServletContext接口修饰对象称为【全局作用域对象】

    【生命周期】:网站被创建->网站被销毁

      1.【全局作用域对象】在Tomcat启动时,由Tomcat为当前网站来创建的

      2.一个网站中只能有一个全局作用域对象

      3.从网站启动开始一直到网站关闭时,由Tomcat负责销毁当前网站的全局作用域对象

    【使用】

      1.如何得到当前工程中【全局作用域对象】

        ServletContext application= request.getServletContext():
        向Tomcat索要当前工程的全局作用域对象

    【共享数据来源方式一】:

      在网站启动之前。开发人员可以将网站中绝大多数Servlet需要使用的数据添加到web.xml

        <context-param>
          <param-name>共享数据名称</param-name>
          <param-value>共享数据内容</param-value>
        </context-param>

      在网站启动时:Tomcat首先为当前网站创建一个【全局作用域对象】,Tomcat然后将web.xml配置共享数据添加到【全局作用域对象】

      在网站运行时,当前某一个Servlet需要使用【共享数据】时,可以从全局作用域对象索要数据

        共享数据内容= application.getInitParameter("共享数据名称")

        *****此时共享数据只能读取使用,不能修改

    【共享数据来源方式二】:

        在Tomcat运行期间,可以将某一个Servlet提供的数据保存到全局作用域对象中,供当前网站中其他的Servlet来使用

          AServlet: 提供共享数据

            application.setAttribute("共享数据名",共享数据数据); object

          BServlet:

            共享数据数据 = application.getAttribute("共享数据")


          *****由Servlet存入共享数据可以被修改。

    Cookie:

      在参与一个会话过程中Servlet之间,进行【数据共享】,Cookie存储在浏览器上,保存本次会话的【共享数据】

    【工作原理】:

      1.在浏览器访问【OneServelt】时。
       【OneServelt】负责将当前浏览器产生的私人数据保存到Cookie。
       然后【OneServelt】负责将Cookie推送到当前浏览器上.
      2. 在浏览器再次来访问当前网站【TwoServlet】时,需要无条件的将服务端之前推送过来的【Cookie】在推送回去。
        这样TwoSerelt得到【OneSerelt】提供的共享数据

    【cookie使用】

      1.如何创建一个Cookie对象,来保存共享数据

        Cookie c1 = new Cookie("key","共享数据");

        ***一个Cookie对象只能有一个键值对
        ***Cookie对象只能存储String类型共享数据

       2.如何将Cookie写入到响应包【响应头】

        response.addCookie(c1);

      3. 如何从请求协议包的【请求头】读取浏览器返还的cookie

        Cookie array []= request.getCookies()

    【cookie对象的生命周期】:

      1.[默认情况]: cookie是保存在浏览器的内存中。所以在浏览器关闭时,cookie会被windows进行销毁。

      2.[人工干预]: 要求将Cookie保存到客户端计算机的【硬盘上】,同时制定cookie在硬盘上存活时间。
       在存活时间范围之内,关闭浏览器甚至关闭计算机,都不会导致cookie被销毁。

        cookie.setMaxAge(以秒为单位时间)

    [cookie缺点]:

      1.一个cookie对象只能存放一个键值对,如果存储的数据较多,需要管理多个Cookie

      2.cookie只能存放String类型数据,无法存放【高级类型Java数据,比如List,Map】

    应用:

    OneServlet用来新建Cookie,存到响应头中返回给浏览器

    public class OneServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1.读取当前用户基本信息
            String name = req.getParameter("username");
            String jiaozi = req.getParameter("jiaozi");
            //2.将当前用户私人数据保存到Cookie里
            Cookie c1 = new Cookie("key1",name);
            Cookie c2 = new Cookie("key2",jiaozi);
            //3.c1需要在硬盘上存活60秒
            c1.setMaxAge(60);
            //4.将Cookie写入到【响应包】的【响应头】中
            resp.addCookie(c1);
            resp.addCookie(c2);
    
        }
    }

    TwoServlet用来接收浏览器推送回来的Cookie,读取其中的用户信息

    public class TwoServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1.读取当前来访浏览器推送回来的Cookie
            Cookie array[] = req.getCookies();
            //2.根据得到的Cookie,招待当前用户
            for(Cookie cookie:array){
                String keyName = cookie.getName();//读取cookie中关键字名称
                String value = cookie.getValue();//读取cookie中的共享数据
                if("key1".equals(keyName)){
                    System.out.println("您好"+value);
                }else if("key2".equals(keyName)){
                    System.out.println("这是您喜欢的"+value);
                }
            }
        }
    }

    网页初始页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <center>
            <h1>新用户点餐页面</h1>
            <form action="/myWeb/one.do">
    
                客人名称:<input type="text" name="username"><br/>
                饺子类型:<input type="radio" name="jiaozi" value="三鲜饺子">三鲜饺子
                          <input type="radio" name="jiaozi" value="西葫芦饺子">西葫芦饺子
                          <input type="radio" name="jiaozi" value="虾仁饺子">虾仁饺子
                          <input type="submit" name="jiaozi" value="点餐"/>
            </form>
    
            <h1>VIP通道</h1>
            <a href="/myWeb/two.do">贵客里面请</a>
    
        </center>
    </body>
    </html>
    View Code

    网页初始化设置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <servlet>
            <servlet-name>OneServlet</servlet-name>
            <servlet-class>com.bjpowernode.controller.OneServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>OneServlet</servlet-name>
            <url-pattern>/one.do</url-pattern>
        </servlet-mapping>
    
        <servlet>
            <servlet-name>TwoServlet</servlet-name>
            <servlet-class>com.bjpowernode.controller.TwoServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>TwoServlet</servlet-name>
            <url-pattern>/two.do</url-pattern>
        </servlet-mapping>
    
    </web-app>
    View Code

    HttpSession接口

      1. 为参与同一个会话的servlet之间提供共享数据

      2. 习惯于将HttpSession接口修饰的对象称为【会话作用域对象】也可以叫做【session对象】

    【HttpSession与Cookie区别】:

      【相同点】:为参与同一个会话的servlet之间提供共享数据

      【不同点】:
        [存储位置]: cookie存储在客户端浏览器内存中或则硬盘上,HttpSession存储在服务端计算机的内存中

        [存储内容]: cookie只能存储String类型数据,HttpSession可以存储任意类型数据

        [存储数量]: 一个Cookie只可以存储一个键值对,一个HttpSession对象可以任意个数的键值对

    【使用】 :

      1.在浏览器来访时,Tomcat不会主动为当前浏览器创建对应的HttpSession对象

      2.只有浏览器所访问的Servelt向Tomcat提出要求时,Tomcat才会为当前浏览器创建一个HttpSession对象

      3.如何在Servelt中为当前浏览器,申请一个HttpSession对象

        1) HttpSession session = request.getSession();

        2) HttpSession session = request.getSession(true);

        3) HttpSession session = request.getSession(false);

       4.getSession() 与 request.getSession(true) 与 getSession(false)

        1) getSession(): 如果当前浏览器在服务端中已经拥有了一个SESSION对象,此时Tomcat需要将这个session对象进行返回
                如果当前浏览器在服务端中尚未拥有SESSION对象,此时Tomcat需要创建一个全新的session对象返回

        2)getSession(true): 与getSession()完全一致。

        3)getSession(false):如果当前浏览器在服务端中已经拥有了一个SESSION对象,此时Tomcat需要将这个session对象进行返回

                  如果当前浏览器在服务端中尚未拥有SESSION对象,此时返回一个null

      
        ******** 如果来访的用户身份已经确认合法了,此时可以使用getSesion()或则getSession(true)

        如果来访的用户身份尚未确认,此时只可以使用getSession(false)

        5.Tomcat是如何将浏览器与SESSION对象关联:利用cookie

          在Tomcat创建了一个SESSION对象时,为SESSION对象生成一个唯一编号
          然后将这个编号保存到cookie中,推送到当前的浏览器内存中

          等到浏览器再次发送请求时,Tomcat就可以通过读取浏览器返回的cookie
          来判断浏览器在服务端中是否有session对象

        6.如何使用HttpSession对象

          在本次会话过程中 AServlet需要为本次会话中其他Servelt提供共享数据

            session.setAttribute("key",共享数据)

          在本次会话过程中,BServlet需要得到当前浏览器session的数据

            session.getAttribute("key")

    应用:

    OneServlet模拟一个简单购物车,每次打开浏览器进入该页面,tomcat就会为其建立一个session来保存购物车的物品和数量

    public class OneServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.读取浏览器推送过来的【商品名称】
            String goodsName = req.getParameter("name");
            //2.向tomcat索要当前浏览器在服务端的session对象
            HttpSession session = req.getSession();
            //3.将用户所选商品保存到当前用户session中
            Integer goodsNum = (Integer)session.getAttribute(goodsName);
            if(goodsNum==null){//之前没买过
                session.setAttribute(goodsName,1);
            }else {
                session.setAttribute(goodsName,goodsNum+1);
            }
        }
    }

    网站初始配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        
        <servlet>
            <servlet-name>OneServlet</servlet-name>
            <servlet-class>com.bjpowernode.controller.OneServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>OneServlet</servlet-name>
            <url-pattern>/one.do</url-pattern>
        </servlet-mapping>
        
    </web-app>
    View Code

    网站初始页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <center>
            <h1>商品展示页面</h1>
            <table border="2">
                <tr>
                    <td>面包</td>
                    <td>15.00</td>
                    <td><a href="/myWeb/one.do?name=面包">放入购物车</a></td>
                </tr>
    
                <tr>
                    <td>啤酒</td>
                    <td>10.00</td>
                    <td><a href="/myWeb/one.do?name=啤酒">放入购物车</a></td>
                </tr>
    
                <tr>
                    <td>烤肠</td>
                    <td>30.00</td>
                    <td><a href="/myWeb/one.do?name=烤肠">放入购物车</a></td>
                </tr>
    
            </table>
        </center>
    </body>
    </html>
    View Code
  • 相关阅读:
    软件安装
    ARIMA
    解决数据分析中的小知识点及问题
    Django详解之路由系统、中间件
    hdoj 1018
    程序员编程技术迅速提高终极攻略 (转自csdn)
    chapter 5:一个简单的规律问题。
    chapter 4:贪心
    7种qsort排序方法
    chapter 2:hdoj 1031(结构体的使用)
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12657076.html
Copyright © 2020-2023  润新知