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
原文地址:https://www.cnblogs.com/zsben991126/p/12657076.html