XML部分

1. 概念定义

  • 基本概念

    1. - **可扩展的标签语言**
    2. - **标签自定义**
    3. - **作用**:储存数据。(配置文件)
    4. - **书写规范:**
    5. - **区分大小写**
    6. - **应该有一个根标签**
    7. - **标签必须关闭**
    8. - <xx></xx>
    9. - <xx/>
    10. - **属性必须用引号引起来**
    11. - <xx att="value"/>
    12. - **标签体中的空格或者换行或者制表符等内容都是数据**。
    13. - <xx>aa</xx>
    14. - <xx> aa </xx>
    15. - **特殊字符必须转义**
    16. - < > &
    17. - **后缀名**
    18. - .xml
    19. - 满足上面规范的文件我们称为一个格式良好的xml文件,可以通过浏览器浏览
    20. - **xml组成部分:**
    21. - **声明**:
    22. - **作用:**告诉别人我是一个xml文件
    23. - **格式:**<br /> <?xml ....... ?>
    24. - **例如:**<br /> <?xml version="1.0" encoding="UTF-8"?><br /> <?xml version="1.0" encoding="UTF-8" standalone="yes|no"?><br /> //最后一个东西是用来判断这个文件是否是独立的文件
    25. - **要求:**<br /> 必须在xml文件的第一行<br /> 必须顶格写
    26. - **元素(标签)**:
    27. - **格式**:<br /> <xx></xx><br /> <xx/>
    28. - **要求:**<br /> 1.必须关闭<br /> 2.标签名不能 xml Xml XML 等等开头<br /> 3.标签名中不能出现" "或者":"等特殊字符(加空格意思是属性)
    29. - **属性:**
    30. - **格式:**<br /> <xx 属性名="属性值"/>
    31. - **要求:**<br /> 属性必须用引号引起来
    32. - **注释:**
    33. - **和html一样**<br /> <!-- 注释内容 -->
    34. - **CDATA:**
    35. - **xml文件的特殊字符必须转义**(转移炒鸡麻烦)<br /> 通过cdataky保证数据原样输出
    36. - **格式**:<br /> <![CDATA[<br /> 原样输出的内容<br /> ]]>
    37. - **xml解析:**
    38. - **解析方式(常用)**: <br /> dom:一次性将文档加载到内容中,形成一个dom树,可以对domcurd操作
    39. - **解析技术(常用)**: <br /> dom4j:比较常用的解析开发包,hibernate底层使用。
    40. - **使用dom4j技术进行查询操作**
    41. - 导入jar
    42. - 创建一个核心对象 SAXReader
    43. - xml文档加载到内存中形成一棵树
    44. - 获取根节点
    45. - 通过根节点就可以获取其他结点(文本节点,属性节点,元素节点)

    Web概念

    1. 概念简述

    1. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581594830777-53a1b137-6994-412a-a67d-7bc753431ee1.png#align=left&display=inline&height=280&name=image.png&originHeight=559&originWidth=948&size=508056&status=done&style=none&width=474)

    2. 服务器软件分类

    1. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581595773363-79a9c8a6-8cd3-47ca-bb11-059dcb469533.png#align=left&display=inline&height=238&name=image.png&originHeight=476&originWidth=1182&size=674420&status=done&style=none&width=591)

    tomcat服软

    1. 目录介绍

    1. - 文件夹概述
    2. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581599930122-aa4fee1e-1a93-4a02-a810-8dd641382251.png#align=left&display=inline&height=179&name=image.png&originHeight=357&originWidth=645&size=275983&status=done&style=none&width=322.5)
    3. - 启动
    4. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581600755650-d87bf88c-0d16-4182-be91-2a51af529be7.png#align=left&display=inline&height=297&name=image.png&originHeight=593&originWidth=1081&size=581324&status=done&style=none&width=540.5)
    5. - 关闭
    6. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581600859046-4a3e8fda-76d2-4ab3-8967-cac5abbd676e.png#align=left&display=inline&height=81&name=image.png&originHeight=162&originWidth=318&size=69490&status=done&style=none&width=159)

    2. 使用

    1. - 配置
    2. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581601921311-f05ee87d-e9ad-4fb4-99bd-85bf3f26170d.png#align=left&display=inline&height=235&name=image.png&originHeight=470&originWidth=941&size=456914&status=done&style=none&width=470.5)
    3. - 启动注意点
    4. - 左上角新建模组(注意这几点)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581602837034-9664b591-cb7b-4a61-b0ed-926692a9dedd.png#align=left&display=inline&height=382&name=image.png&originHeight=764&originWidth=654&size=73031&status=done&style=none&width=327)
    5. - 项目更新(勾上这两个会自动更新)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581602894652-89c8006b-2bc2-42e1-be44-e1c607b8284b.png#align=left&display=inline&height=240&name=image.png&originHeight=479&originWidth=985&size=46429&status=done&style=none&width=492.5)
    6. - 新建html<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581602946150-16b4db18-44d6-4d34-894c-78f5a6954fdc.png#align=left&display=inline&height=131&name=image.png&originHeight=262&originWidth=800&size=27386&status=done&style=none&width=400)
    7. - 默认文件<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581602970565-86c5dcf2-9115-488c-b3ca-2470f4cb3686.png#align=left&display=inline&height=75&name=image.png&originHeight=150&originWidth=301&size=6218&status=done&style=none&width=150.5)

    Servlet概述

    1. 执行原理

    1. - 机制
    2. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581662158668-99a9cd22-88b1-4cc9-a361-7d51e10339d5.png#align=left&display=inline&height=165&name=image.png&originHeight=165&originWidth=1110&size=264230&status=done&style=none&width=1110)
    3. - 方法
    4. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581662129274-3f3e6949-aa52-4f0b-a3f8-13b63cd66351.png#align=left&display=inline&height=335&name=image.png&originHeight=335&originWidth=335&size=16021&status=done&style=none&width=335)
    5. - 类中实现接口并重载<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581662198659-63c11779-bec0-4550-a71f-90ebdc6816f8.png#align=left&display=inline&height=47&name=image.png&originHeight=47&originWidth=351&size=1999&status=done&style=none&width=351)
    6. - 路径的配置
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    5. version="3.1">
    6. <servlet>
    7. <servlet-name>demo1</servlet-name>
    8. <servlet-class>sss</servlet-class>
    9. </servlet>
    10. <servlet-mapping>
    11. <servlet-name>demo1</servlet-name>
    12. <url-pattern>/demo1</url-pattern>
    13. </servlet-mapping>
    14. </web-app>
    1. - 运行之后直接在网址的后边加上名字就可以运行了,运行结果在编译器中。<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581662343860-8b6d8e74-4d7e-4e2a-b4de-e150cc0e4b9a.png#align=left&display=inline&height=49&name=image.png&originHeight=49&originWidth=376&size=3506&status=done&style=none&width=376)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581662375133-6f9e0dfc-a83a-45c4-94bb-ca1fe777f0cd.png#align=left&display=inline&height=52&name=image.png&originHeight=52&originWidth=432&size=4195&status=done&style=none&width=432)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581662385283-87e60719-a62c-4c70-8b77-274089f74de9.png#align=left&display=inline&height=71&name=image.png&originHeight=71&originWidth=234&size=2565&status=done&style=none&width=234)

    2. 方法详解

    1. - 方法中有三个比较重要,其余了解<br />

    ```java import javax.servlet.*; import java.io.IOException;

public class sss implements Servlet {

  1. //初始化方法
  2. //在servlet被创建时执行,只会执行一次 ------重点
  3. @Override
  4. public void init(ServletConfig servletConfig) throws ServletException {
  5. System.out.println("init.....");
  6. }
  7. //获取servletConfig对象
  8. //ServletConfig:servlet的配置对象
  9. @Override
  10. public ServletConfig getServletConfig() {
  11. return null;
  12. }
  13. //提供服务的方法
  14. // 每一次Servlet被访问时执行,执行多次。------重点
  15. @Override
  16. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
  17. System.out.println("asdasdasd");
  18. }
  19. //获取Servlet的一些信息(版本作者啥的)
  20. @Override
  21. public String getServletInfo() {
  22. return null;
  23. }
  24. //服务器正常退出时执行一次。------重点
  25. @Override
  26. public void destroy() {
  27. System.out.println("destroy.....");
  28. }

}

  1. - 生命周期方法(还是放在老地方)
  2. - 被创建:执行init方法,只执行一次(默认时第一次访问时被被创建)![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581663949871-2f8e0e8a-8eb9-4826-94ed-263212a7f8e3.png#align=left&display=inline&height=352&name=image.png&originHeight=352&originWidth=908&size=257621&status=done&style=none&width=908)<br />init方法只执行一次说明,servlet在内存只有一个对象,是单例的<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581664454925-16709972-74a7-4186-bd9c-f004eccc5e7f.png#align=left&display=inline&height=68&name=image.png&originHeight=68&originWidth=989&size=139129&status=done&style=none&width=989)
  3. - 提供服务:执行service方法,执行多次<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581664642680-24c3322b-0971-462e-b1c8-0fea0e75fdd1.png#align=left&display=inline&height=39&name=image.png&originHeight=39&originWidth=631&size=59414&status=done&style=none&width=631)
  4. - 被销毁:执行destroy方法,只执行一次<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581664666705-11e219af-8ace-4664-a218-9123a4463266.png#align=left&display=inline&height=98&name=image.png&originHeight=98&originWidth=723&size=172819&status=done&style=none&width=723)
  5. - Servlet3.0
  6. - 好处:支持注解配置,可以不需要web.xml
  7. - 步骤<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581669327892-4b9e6502-58f8-4d90-a660-1d772b80153a.png#align=left&display=inline&height=166&name=image.png&originHeight=166&originWidth=826&size=173556&status=done&style=none&width=826)<br />注意虚拟路径<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581669396919-eba74c0f-68a8-4e28-9e02-7c6a27b3d070.png#align=left&display=inline&height=68&name=image.png&originHeight=68&originWidth=405&size=3812&status=done&style=none&width=405)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581669411640-69828d64-62b8-4552-8618-ec53cf60a761.png#align=left&display=inline&height=97&name=image.png&originHeight=97&originWidth=208&size=5780&status=done&style=none&width=208)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581669451770-630c8765-ec18-415c-b25b-1310e95b977f.png#align=left&display=inline&height=666&name=image.png&originHeight=666&originWidth=732&size=29891&status=done&style=none&width=732)
  8. - IDEAtomcat的相关配置
  9. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581670759720-620b13dd-fa2b-4afc-8c6d-9cf491fba977.png#align=left&display=inline&height=162&name=image.png&originHeight=162&originWidth=1046&size=205206&status=done&style=none&width=1046)
  10. - Servlet的体系结构
  11. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581672143362-1458b3d9-da69-40ba-b8d7-996e13826d3a.png#align=left&display=inline&height=377&name=image.png&originHeight=377&originWidth=1117&size=338502&status=done&style=none&width=1117)
  12. - 路径的配置(http直接复写方法即可,doget)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581673246389-0e0c4fd6-bf46-4467-84b9-5e05d2355369.png#align=left&display=inline&height=167&name=image.png&originHeight=167&originWidth=627&size=168234&status=done&style=none&width=627)
  13. - 实验<br />
  14. ```java
  15. package cn.demo1;
  16. import javax.servlet.ServletException;
  17. import javax.servlet.annotation.WebServlet;
  18. import javax.servlet.http.HttpServlet;
  19. import javax.servlet.http.HttpServletRequest;
  20. import javax.servlet.http.HttpServletResponse;
  21. import java.io.IOException;
  22. @WebServlet("/user")
  23. public class Servlet2 extends HttpServlet {
  24. @Override
  25. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  26. System.out.printf("大傻子");
  27. }
  28. }

HTTP

1. 概念

  1. - 传输协议:定义了,客户端和服务器端通信时,发送数据的格式
  2. - 特点:
  3. - 基于TCP/IP的高级协议
  4. - 默认端口号:80
  5. - 基于请求/响应模型的:一次请求对应一次响应
  6. - 无状态的:每次请求之间相互独立,不能交互数据
  7. - 历史版本:
  8. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581678088962-6b03032c-c132-4d37-9fb0-5a049417aab2.png#align=left&display=inline&height=65&name=image.png&originHeight=65&originWidth=490&size=51130&status=done&style=none&width=490)

2. 请求

  1. - 请求消息数据格式
  2. - 请求行![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581678867526-db0d6e26-bdb0-4388-a66e-45ae149fc096.png#align=left&display=inline&height=409&name=image.png&originHeight=409&originWidth=600&size=265479&status=done&style=none&width=600)<br />演示(在web/html中写入get时)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581683167198-93abac95-27b8-4b55-ab09-e0f53e67eaf2.png#align=left&display=inline&height=234&name=image.png&originHeight=234&originWidth=821&size=30758&status=done&style=none&width=821)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581683186883-4815aec0-0660-4ed9-9d23-c2e942cc6573.png#align=left&display=inline&height=82&name=image.png&originHeight=82&originWidth=501&size=7961&status=done&style=none&width=501)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581683436795-dda9849d-398b-48d9-b4ea-13a37ebe4002.png#align=left&display=inline&height=309&name=image.png&originHeight=309&originWidth=438&size=19413&status=done&style=none&width=438)<br />**演示(在web/html中写入post时)**<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581683303737-8022722d-7c4f-4857-905f-5dfacf76d0ba.png#align=left&display=inline&height=220&name=image.png&originHeight=220&originWidth=844&size=29773&status=done&style=none&width=844)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581683328865-e3aec903-d2dd-4bd0-93a1-198cd7e69cad.png#align=left&display=inline&height=95&name=image.png&originHeight=95&originWidth=354&size=7294&status=done&style=none&width=354)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581683387059-d80e3cce-9875-4166-9ee9-7d2153a185cf.png#align=left&display=inline&height=310&name=image.png&originHeight=310&originWidth=569&size=21891&status=done&style=none&width=569)
  3. - **请求头(客户端浏览器告诉服务器一些信息)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581683714153-634dabcf-f276-4509-b9b3-ac517113bf0c.png#align=left&display=inline&height=318&name=image.png&originHeight=318&originWidth=864&size=289791&status=done&style=none&width=864)**
  4. - **请求空行:用来分隔post请求的请求头和请求体的**
  5. - **请求体(正文):封装post请求消息的请求参数的**
  6. - 请求格式<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581684120734-0bcebf07-5d30-41ba-bce0-597e210578d2.png#align=left&display=inline&height=385&name=image.png&originHeight=385&originWidth=1326&size=453371&status=done&style=none&width=1326)

3. HTTP协议

  1. - 请求消息:客户端发送给服务器端的数据
  2. - 数据格式
  3. - 请求头
  4. - 请求头
  5. - 请求空行
  6. - 请求体
  7. - 响应消息:服务器端发送给客户端的数据
  8. - 数据格式
  9. - 响应行<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581762024832-0182d95c-24ea-476b-81e5-969924838f4b.png#align=left&display=inline&height=376&name=image.png&originHeight=376&originWidth=1111&size=461091&status=done&style=none&width=1111)
  10. - 响应头<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581762386469-e3a9e9f5-2152-44df-9c57-e3bc17651efb.png#align=left&display=inline&height=222&name=image.png&originHeight=222&originWidth=946&size=294516&status=done&style=none&width=946)
  11. - 响应空行
  12. - 响应体:传输的数据
  13. - 响应字符串格式(响应头+响应尾)<br />
  14. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581761168799-b985677a-b8a0-45bb-85c4-e7734fc42205.png#align=left&display=inline&height=447&name=image.png&originHeight=447&originWidth=565&size=233128&status=done&style=none&width=565)

request功能

1. 获取请求消息数据

(1)获取请求行数据

  1. - URI:统一资源定位符:http//localhost/day14/demo1 ---中华人民共和国<br />URL:统一资源标识符:/day14/demo1 ---共和国
  2. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581685517484-0874a62c-b8cf-44d3-8244-5e41ec799504.png#align=left&display=inline&height=566&name=image.png&originHeight=566&originWidth=982&size=541701&status=done&style=none&width=982)
  3. - 快速创建servlet<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581685752166-800b1eaf-6ebb-4a36-a13f-255c8f80c07e.png#align=left&display=inline&height=691&name=image.png&originHeight=691&originWidth=799&size=81384&status=done&style=none&width=799)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581685819549-2b64e79a-7f3b-4f17-bda5-33554c4676e1.png#align=left&display=inline&height=263&name=image.png&originHeight=263&originWidth=433&size=15856&status=done&style=none&width=433)
  4. - 请求方法示例<br />
  1. package Servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. @WebServlet("/servletDemo1")
  9. public class ServletDemo1 extends HttpServlet {
  10. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  11. }
  12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. //1.获取请求方式:get
  14. String method = request.getMethod();
  15. System.out.println(method);
  16. //2.获取虚拟目录 ---重要
  17. String contextPath = request.getContextPath();
  18. System.out.println(contextPath);
  19. //3.获取servlet路径
  20. String servletPath = request.getServletPath();
  21. System.out.println(servletPath);
  22. //4.获取get方式请求参数
  23. String queryString = request.getQueryString();
  24. System.out.println(queryString);
  25. //5.获取请求URI ---重要
  26. String requestURI = request.getRequestURI();
  27. StringBuffer requestURL = request.getRequestURL();
  28. System.out.println(requestURI);
  29. System.out.println(requestURL);
  30. //6.获取协议以及版本
  31. String protocol = request.getProtocol();
  32. System.out.println(protocol);
  33. //7.获取客户机的IP地址
  34. String remoteAddr = request.getRemoteAddr();
  35. System.out.println(remoteAddr);
  36. }
  37. }
  1. - 结果(网址后边加上?name=lisi)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581686796771-b63d60be-85cc-4d00-b6cb-52491d75a8ce.png#align=left&display=inline&height=210&name=image.png&originHeight=210&originWidth=326&size=6602&status=done&style=none&width=326)

(2)获取请求头数据

  1. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581692822909-b4329e34-eefd-4a0f-9c85-764a4f4dac2d.png#align=left&display=inline&height=95&name=image.png&originHeight=95&originWidth=942&size=146561&status=done&style=none&width=942)
  1. package Servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.util.Enumeration;
  9. @WebServlet("/ServletDemo2")
  10. public class ServletDemo2 extends HttpServlet {
  11. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  12. }
  13. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14. //演示获取所有请求头数据
  15. //1.获取所有请求头名称
  16. Enumeration<String> headerNames = request.getHeaderNames();
  17. //2.遍历
  18. while(headerNames.hasMoreElements()){
  19. String name = headerNames.nextElement();
  20. //根据名称获取请求头的值
  21. String value = request.getHeader(name);
  22. System.out.println(name+"---"+value);
  23. }
  24. }
  25. }
  1. - 结果<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581693021015-bb5de302-3734-41ab-a55e-a0b7d87759b7.png#align=left&display=inline&height=315&name=image.png&originHeight=315&originWidth=510&size=19128&status=done&style=none&width=510)

(3)单独获取头数据

  1. - user-agent 代码(获取浏览器信息)
  1. package Servlet;
  2. ximport sun.management.resources.agent;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. import java.util.Enumeration;
  10. @WebServlet("/ServletDemo3")
  11. public class ServletDemo3 extends HttpServlet {
  12. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. }
  14. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. //演示获取所有请求头数据:user-agent
  16. String agent = request.getHeader("user-agent");
  17. //判断agent的浏览器版本
  18. if(agent.contains("Chrome")){
  19. //谷歌
  20. System.out.println("谷歌浏览器来了");
  21. }else{
  22. //其他浏览器
  23. System.out.println("这是什么鬼浏览器");
  24. }
  25. }
  26. }
  1. - 结果<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581693636175-8594b238-7b54-4afc-8212-e1b8c6c18ff3.png#align=left&display=inline&height=30&name=image.png&originHeight=30&originWidth=136&size=1381&status=done&style=none&width=136)
  2. - referer 代码(获取转跳网址的信息,盗链直接通过这个处理)<br />先配置转跳信息,通过login转跳到那里才能获取<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581694988358-12763e39-011f-4e02-88c3-7a97863c2453.png#align=left&display=inline&height=265&name=image.png&originHeight=265&originWidth=869&size=32481&status=done&style=none&width=869)
  1. package Servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. @WebServlet("/ServletDemo4")
  9. public class ServletDemo4 extends HttpServlet {
  10. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  11. }
  12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. //演示获取所有请求头数据:referer
  14. String referer = request.getHeader("referer");
  15. System.out.println(referer);
  16. }
  17. }
  1. - 结果<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581695053520-ee8c2ff7-9a60-446e-93ae-7943dbed9b16.png#align=left&display=inline&height=30&name=image.png&originHeight=30&originWidth=322&size=1810&status=done&style=none&width=322)<br />

(4)获取请求体数据

  1. - 请求体:只有post请求方法,才有请求体,在请求体中封装了post请求的请求参数
  2. - 步骤
  3. - 获取流对象<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581696437140-533e3518-2b0c-4cb4-9407-878d410f983e.png#align=left&display=inline&height=101&name=image.png&originHeight=101&originWidth=1040&size=175633&status=done&style=none&width=1040)
  4. - 再从流对象中拿数据
  5. - 演示(html文件)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581697549974-807df5db-6e5f-4826-a0e1-f5f36500230c.png#align=left&display=inline&height=355&name=image.png&originHeight=355&originWidth=714&size=25775&status=done&style=none&width=714)<br />demo5数据<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581697588524-33b0a5d8-ecbf-40c7-bac8-532d5c64fc14.png#align=left&display=inline&height=239&name=image.png&originHeight=239&originWidth=390&size=12363&status=done&style=none&width=390)<br />页面+结果<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581697624453-ae7e3100-b451-4cc4-ab23-147433cf0339.png#align=left&display=inline&height=193&name=image.png&originHeight=193&originWidth=408&size=10384&status=done&style=none&width=408)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581697605791-b302f1ae-8a94-4ebe-b144-3fdc5edbd631.png#align=left&display=inline&height=57&name=image.png&originHeight=57&originWidth=355&size=3515&status=done&style=none&width=355)

2. 其他功能

(1)获取请求参数的通用方式:无论get或post

  1. - String getParameterString name):根据参数名称获取参数名(单独获取多个)
  2. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581751227340-0eb687da-30d8-4e73-b5a7-638e27ad6fa1.png#align=left&display=inline&height=172&name=image.png&originHeight=172&originWidth=667&size=15460&status=done&style=none&width=667)
  3. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581751255463-b0737c31-73a4-486a-ace8-c1e2dcddf1f3.png#align=left&display=inline&height=428&name=image.png&originHeight=428&originWidth=700&size=31505&status=done&style=none&width=700)
  4. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581751278193-f44c5a61-06b0-4b71-b3e7-a53c6166b364.png#align=left&display=inline&height=102&name=image.png&originHeight=102&originWidth=132&size=1941&status=done&style=none&width=132)
  5. - String[ ] getParameterValuesString name):根据参数名称获取参数值的数组(打勾)
  6. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581752664790-817d84fd-d5e5-4475-9a03-b4f2f5157a45.png#align=left&display=inline&height=246&name=image.png&originHeight=246&originWidth=648&size=21208&status=done&style=none&width=648)
  7. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581752676871-84a89aa2-f1a7-4aae-a0fa-9711f1f7eaab.png#align=left&display=inline&height=131&name=image.png&originHeight=131&originWidth=573&size=10041&status=done&style=none&width=573)
  8. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581752686641-5f4899b9-d09b-4285-a0da-68b459ace85c.png#align=left&display=inline&height=46&name=image.png&originHeight=46&originWidth=89&size=774&status=done&style=none&width=89)
  9. - Enumeration<String> getParameterNames():获取所有请求的参数名称(继而获取值)
  10. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581753117269-b301173e-af2f-4f3c-be7e-93b15423e6e2.png#align=left&display=inline&height=252&name=image.png&originHeight=252&originWidth=662&size=21439&status=done&style=none&width=662)
  11. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581753127017-c4077d33-f92b-4b5d-af36-484273cd442c.png#align=left&display=inline&height=229&name=image.png&originHeight=229&originWidth=610&size=17749&status=done&style=none&width=610)
  12. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581753135997-e9c7e558-627d-46b4-93ce-c2927f071a9a.png#align=left&display=inline&height=233&name=image.png&originHeight=233&originWidth=127&size=3425&status=done&style=none&width=127)
  13. - Map<String,String[ ]> getParameterMap():获取所有参数的map集合(有效获取所有数据)
  14. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581753509833-b850f159-ef1b-401b-9aa2-72bfce9ec67f.png#align=left&display=inline&height=255&name=image.png&originHeight=255&originWidth=627&size=21163&status=done&style=none&width=627)
  15. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581753524262-e89c8086-569b-4fc0-9557-95fade8e4d33.png#align=left&display=inline&height=338&name=image.png&originHeight=338&originWidth=576&size=22128&status=done&style=none&width=576)
  16. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581753534305-3e846228-3b89-44a7-92ae-00e2d49c7964.png#align=left&display=inline&height=245&name=image.png&originHeight=245&originWidth=143&size=4248&status=done&style=none&width=143)
  17. - 注:
  18. - 修改getpost的方式是再html中修改类型
  19. - doget中的方法体其实与dopost一样所以直接(可以结案哼)![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581751898567-fb02a56c-2a01-423a-807a-6d2c4d9840e5.png#align=left&display=inline&height=40&name=image.png&originHeight=40&originWidth=398&size=32855&status=done&style=none&width=398)
  20. - 中文乱码问题
  21. - get方式中不会乱码(内部解决)
  22. - post方式中会乱码![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581753966587-da573467-ad83-4990-a4c9-b0c303c68b40.png#align=left&display=inline&height=29&name=image.png&originHeight=29&originWidth=93&size=327&status=done&style=none&width=93)<br />在设置参数之前设置编码即可<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581754087658-a63b4f46-ac58-49b3-8b17-047388998117.png#align=left&display=inline&height=182&name=image.png&originHeight=182&originWidth=604&size=12557&status=done&style=none&width=604)<br />然后就行了<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581754124406-6b7b728c-ccd0-4de9-b770-ff35cf1a9a9d.png#align=left&display=inline&height=33&name=image.png&originHeight=33&originWidth=118&size=1201&status=done&style=none&width=118)

(2)请求转发

  1. - 概念:一种在服务器内部的资源转跳方式
  2. - 步骤:
  3. - 通过request对象获取请求转发器对象
  4. - 使用requestDispatcher对象来进行转发<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581755362192-e438ca2f-7cc7-4a50-8301-b3023caceb88.png#align=left&display=inline&height=133&name=image.png&originHeight=133&originWidth=747&size=15438&status=done&style=none&width=747)<br />demo4<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581755383863-f102f6a6-cb9c-41fc-8464-dba1f1496d36.png#align=left&display=inline&height=87&name=image.png&originHeight=87&originWidth=478&size=5783&status=done&style=none&width=478)<br />结果<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581755398339-8c126c0b-7fec-45f8-9571-5cb1a3049f7c.png#align=left&display=inline&height=57&name=image.png&originHeight=57&originWidth=176&size=2272&status=done&style=none&width=176)
  5. - 特点:
  6. - 浏览器地址栏路径没发生变化
  7. - 只能转发到当前的服务器内部的资源中(不能跳转到外网)
  8. - 转发是一次请求,另一次请求在内部实现

(3)共享数据

  1. - 域对象:一个有作用范围的对象,可以共享数据
  2. - request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
  3. - 方法
  4. - void setAttributeString nameObject obj):储存数据
  5. - object getAttributeString name):通过键获取值
  6. - void removeAttributeString name):通过键移除键值对 <br />添加<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581756541559-e8e79c03-1d6d-4cda-a0f7-7b92e63a0546.png#align=left&display=inline&height=180&name=image.png&originHeight=180&originWidth=732&size=19672&status=done&style=none&width=732)<br />获取<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581756609133-89f6b9c8-45ab-4f23-8056-da7f9558f9cd.png#align=left&display=inline&height=129&name=image.png&originHeight=129&originWidth=517&size=9955&status=done&style=none&width=517)<br />结果<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581756622556-31bdb48d-cf36-44e0-b03a-914b1ce77411.png#align=left&display=inline&height=76&name=image.png&originHeight=76&originWidth=170&size=2714&status=done&style=none&width=170)
  7. - 获取ServletContext
  8. - 获取并输出<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581756824701-54b4a060-e3db-44f3-a6ab-342bd92ebf1a.png#align=left&display=inline&height=135&name=image.png&originHeight=135&originWidth=610&size=10132&status=done&style=none&width=610)<br />输出<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581756868726-b3381a6e-e036-4154-a2f2-bae1be10b222.png#align=left&display=inline&height=26&name=image.png&originHeight=26&originWidth=549&size=2703&status=done&style=none&width=549)

Response对象

1. 设置响应行

  1. - 格式与状态码的设置
  2. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581762735407-68a0324e-201b-4cdb-a530-d546a680353d.png#align=left&display=inline&height=67&name=image.png&originHeight=67&originWidth=400&size=51833&status=done&style=none&width=400)
  3. - **案例一**:完成重定向(重定向是网址访问的推诿,从一个网站转跳到另一个网站)
  4. - 复杂的重定向<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581767951786-9f494ec3-f165-4c8c-9f6a-2711999a236e.png#align=left&display=inline&height=181&name=image.png&originHeight=181&originWidth=523&size=12744&status=done&style=none&width=523)
  5. - 简单的重定向<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581768062867-b8aed99a-dc25-477f-9f11-0c92caa3468c.png#align=left&display=inline&height=57&name=image.png&originHeight=57&originWidth=388&size=3928&status=done&style=none&width=388)
  6. - 结果<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581768100182-e61c7e0e-2e02-4e64-ae64-b47d3722d2a5.png#align=left&display=inline&height=52&name=image.png&originHeight=52&originWidth=156&size=1297&status=done&style=none&width=156)
  7. - 重定向的特点
  8. - 地址栏发生变化
  9. - 重定向可以访问其他站点(服务器)的资源
  10. - 重定向是两次请求(中间返回,不能用request共享对象)
  11. - 转发的特点
  12. - 转发地址栏路径不发生改变
  13. - 转发只能访问当前服务器下的资源
  14. - 转发是一次请求(可以共享数据)
  15. - 路径的写法
  16. - 相对路径<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581769126954-048c2de6-8e01-411a-a6b6-e50493dbbce4.png#align=left&display=inline&height=188&name=image.png&originHeight=188&originWidth=866&size=141561&status=done&style=none&width=866)
  17. - 绝对路径<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581769109017-758431a8-739e-4363-9832-9037b8fdd68a.png#align=left&display=inline&height=63&name=image.png&originHeight=63&originWidth=988&size=86971&status=done&style=none&width=988)
  18. - 获取动态虚拟目录(然后直接拼接到重定向方法中)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581769956798-63f11e1f-0dc2-4cf7-8d94-cb886a6a631a.png#align=left&display=inline&height=135&name=image.png&originHeight=135&originWidth=928&size=126085&status=done&style=none&width=928)
  19. - 路径使用注意点
  20. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581770108373-719c0b44-a282-442a-aac2-acd531249855.png#align=left&display=inline&height=191&name=image.png&originHeight=191&originWidth=932&size=256936&status=done&style=none&width=932)

2. 设置响应头

  1. - 格式
  2. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581762779440-8b2eddb5-a583-47f8-a14f-72790bec9463.png#align=left&display=inline&height=30&name=image.png&originHeight=30&originWidth=511&size=34672&status=done&style=none&width=511)
  3. - **案例三:向浏览器输出验证码**
  4. - **创建图片对象<br />美化图片<br />将图片输出到页面展示**
  5. - **代码**
  1. package Servlet;
  2. import javax.imageio.ImageIO;
  3. import javax.servlet.ServletContext;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.ServletOutputStream;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import javax.swing.*;
  11. import java.awt.*;
  12. import java.awt.image.BufferedImage;
  13. import java.io.BufferedReader;
  14. import java.io.IOException;
  15. import java.io.PrintWriter;
  16. import java.util.Enumeration;
  17. import java.util.Map;
  18. import java.util.Random;
  19. import java.util.Set;
  20. @WebServlet("/ServletDemo5")
  21. public class ServletDemo5 extends HttpServlet {
  22. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  23. int height=50;
  24. int width=100;
  25. //1.创建一对象,在内存中存储(验证码图片对象)
  26. BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  27. //2.美化图片
  28. //2.1填充背景色
  29. Graphics g = image.getGraphics(); //画笔对象
  30. g.setColor(Color.pink); //设置画笔颜色
  31. g.fillRect(0,0,width,height); //填充长方形
  32. //2.2画边框
  33. g.setColor(Color.blue);
  34. g.drawRect(0,0,width-1,height-1);
  35. String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefjhijklmnopqrstuvwxyz0123456789";
  36. //生成随机角标
  37. Random ran = new Random();
  38. for(int i = 1;i<=4;i++){
  39. int index=ran.nextInt(str.length());
  40. //获取字符
  41. char ch = str.charAt(index); //生成随机字符
  42. //2.3写验证码
  43. g.drawString(ch+"",width/5*i,height/2);
  44. }
  45. //2.4画干扰线
  46. g.setColor(Color.green);
  47. //随机生成坐标点
  48. for(int i = 0 ; i < 10; i++){
  49. int x1 = ran.nextInt(width);
  50. int x2 = ran.nextInt(width);
  51. int y1 = ran.nextInt(height);
  52. int y2 = ran.nextInt(height);
  53. g.drawLine(x1,y1,x2,y2);
  54. }
  55. //3.将图片输出到页面展示
  56. ImageIO.write(image,"jpg",response.getOutputStream());
  57. }
  58. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  59. this.doPost(request,response);
  60. }
  61. }

3. 设置响应体

  1. - 获取输出流
  2. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581762825119-81086eff-e5c8-4ead-ad8d-22659a1e020d.png#align=left&display=inline&height=98&name=image.png&originHeight=98&originWidth=715&size=96905&status=done&style=none&width=715)
  3. - 使用输出流,将数据输出到客户端浏览器
  4. - **案例二:**服务器输出字符数据到浏览器(注意中文乱码问题,这里设置了编码格式)(主要输出字符)
  5. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581775637636-0db336cc-2eb5-4298-b191-caa1aa75e58e.png#align=left&display=inline&height=182&name=image.png&originHeight=182&originWidth=532&size=17018&status=done&style=none&width=532)
  6. - 服务器输出字节数据到浏览器(主要输出照片等格式)
  7. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581776213443-4db5ee07-68e1-4b76-b99e-e16c07a7b63b.png#align=left&display=inline&height=158&name=image.png&originHeight=158&originWidth=514&size=12484&status=done&style=none&width=514)

ServletContext对象

  1. - 概念:代表整个web应用,可以和程序的容器(服务器)通信
  2. - 获取:
  3. - 通过request对象获取
  4. - 通过HHttpServlet获取(静态方法)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581788068618-115b1f97-f781-4175-b37d-0da18366bbd5.png#align=left&display=inline&height=215&name=image.png&originHeight=215&originWidth=521&size=15435&status=done&style=none&width=521)<br />结果<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581788387788-d967129d-b331-4eec-878b-8ec60c443002.png#align=left&display=inline&height=72&name=image.png&originHeight=72&originWidth=535&size=5977&status=done&style=none&width=535)
  5. - 功能
  6. - **获取MIME类型**<br />类型介绍<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581788655889-7db667d1-2510-4832-878e-6e73a51d167a.png#align=left&display=inline&height=124&name=image.png&originHeight=124&originWidth=862&size=148135&status=done&style=none&width=862)<br />使用<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581788563275-b96320c8-7589-4e6e-8cb1-1c709789e973.png#align=left&display=inline&height=178&name=image.png&originHeight=178&originWidth=610&size=12544&status=done&style=none&width=610)<br />结果<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581788577088-e517537b-387d-4abc-bda7-649a06d5f5f0.png#align=left&display=inline&height=32&name=image.png&originHeight=32&originWidth=134&size=774&status=done&style=none&width=134)
  7. - **域对象:共享数据(所有用户都可以共享数据,不推荐,会造成数据压力)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581789039156-08ce7bd8-ef38-4d9d-859c-6f9d7ee31b67.png#align=left&display=inline&height=90&name=image.png&originHeight=90&originWidth=809&size=95924&status=done&style=none&width=809)<br />演示(需要先启动4,再使用5才能获取到)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581789130832-62ce640a-c7fc-4000-b8e9-9460fcb99f45.png#align=left&display=inline&height=106&name=image.png&originHeight=106&originWidth=616&size=7616&status=done&style=none&width=616)<br />使用<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581789144810-9ef48f44-e1b6-4b77-9f05-98cdadde2098.png#align=left&display=inline&height=130&name=image.png&originHeight=130&originWidth=610&size=9523&status=done&style=none&width=610)**
  8. - **获取文件的真实(服务器)路径(情况挺多的)**![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581790133538-fd4116c6-c8df-458a-af04-9b0752095969.png#align=left&display=inline&height=289&name=image.png&originHeight=289&originWidth=729&size=27387&status=done&style=none&width=729)

会话

1. 概念

  1. - **会话**:一次会话中包含多次请求和响应(一次会话从第一次请求开始,直到一方断开)
  2. - **功能**:在一次会话范围内的多次请求间共享数据
  3. - **方式**:
  4. - **客户端对话技术**:Cookie
  5. - **服务端对话技术**:Session

2. Cookie

(1)基本概念

  1. - **概念**:客户端会话技术,将数据保存到客户端
  2. - **入门:**
  3. - **创建Cookie对象,绑定数据**<br />new CookieString nameString value
  4. - **发送Cookie对象**<br />response.addCookieCookie cookie
  5. - **获取Cookie,拿到数据**<br />Cookie[ ] request.getCookies()
  6. - **使用示例<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581793902613-7649c5d7-5649-448f-8363-30754c18d3b1.png#align=left&display=inline&height=110&name=image.png&originHeight=110&originWidth=523&size=7597&status=done&style=none&width=523)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581793918435-36299053-e596-4611-9858-7999d2ae40f0.png#align=left&display=inline&height=255&name=image.png&originHeight=255&originWidth=455&size=12785&status=done&style=none&width=455)<br />结果<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581793938728-47730ee5-e2f3-4d4a-8365-2269333ae48f.png#align=left&display=inline&height=75&name=image.png&originHeight=75&originWidth=476&size=5640&status=done&style=none&width=476)**
  7. - **实现原理:基于响应头set-cookie和响应头cookie实现**

(2)细节及实现

  1. - **cookie的细节**
  2. - 一次可不可以发送多个cookie
  3. - 可以
  4. - 可以创建多个cookie对象,使用response调用多次addCookie方法发送cookie
  5. - cookie可以在浏览器中保存多长时间
  6. - 默认情况下当浏览器关闭之后,cookie数据被销毁
  7. - 持久化储存
  8. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581796014569-92a8fd1a-4d3e-4f6f-9e6c-670c721761ee.png#align=left&display=inline&height=127&name=image.png&originHeight=127&originWidth=954&size=132708&status=done&style=none&width=954)<br />关闭浏览器30秒之后cookie无法访问(储存到本地之后又删除了)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581796418338-85366324-b705-4b1d-9aaa-b64b3ed86ba9.png#align=left&display=inline&height=181&name=image.png&originHeight=181&originWidth=566&size=14985&status=done&style=none&width=566)
  9. - cookie能不能存中文?
  10. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581796775260-38527b48-4925-4ca9-b0e5-21c37fe37988.png#align=left&display=inline&height=92&name=image.png&originHeight=92&originWidth=937&size=115265&status=done&style=none&width=937)
  11. - cookie共享问题?
  12. - 假设在一个tomcat服务器中,部署了多个web项目,那么可否共享cookie?![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581797424991-4e8d14e5-2261-4a51-a88b-af1811c5ba81.png#align=left&display=inline&height=130&name=image.png&originHeight=130&originWidth=1002&size=132643&status=done&style=none&width=1002)
  13. - 不同的tomcat服务器间cookie共享问题?<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581797485143-7dab406b-379b-489e-a374-3a5bd4d7490b.png#align=left&display=inline&height=67&name=image.png&originHeight=67&originWidth=1135&size=141507&status=done&style=none&width=1135)
  14. - **Cookie的特点和作用**
  15. - **特点**
  16. - **cookie存储数据在客户端浏览器**
  17. - **浏览器对于单个cookie的大小有限制(4KB)以及对同一个域名下的cookie总数(20)**
  18. - **作用**
  19. - **cookie一般用于存储少量的不太敏感的数据**
  20. - **在不登陆的情况下,完成服务器对客户端的身份识别**
  21. - **使用:**
  22. - **注意:cookie的名称如果相同的话,值就会被覆盖掉**
  23. - **注意:正常的cookie无法储存特殊字符,需要转码为URL编码然后储存<br />**
  1. package Servlet;
  2. import javax.imageio.ImageIO;
  3. import javax.servlet.ServletContext;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.ServletOutputStream;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.Cookie;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import javax.swing.*;
  12. import java.awt.*;
  13. import java.awt.image.BufferedImage;
  14. import java.io.BufferedReader;
  15. import java.io.File;
  16. import java.io.IOException;
  17. import java.io.PrintWriter;
  18. import java.net.URLDecoder;
  19. import java.net.URLEncoder;
  20. import java.text.SimpleDateFormat;
  21. import java.util.*;
  22. @WebServlet("/ServletDemo5")
  23. public class ServletDemo5 extends HttpServlet {
  24. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  25. //设置响应的消息体的数据格式+编码
  26. response.setContentType("text/html;charset=utf-8");
  27. //1.获取所有cookie
  28. Cookie[] cookies = request.getCookies();
  29. boolean flag = false; //没有cookie为lastTime
  30. //2.遍历cookie数组
  31. if(cookies != null && cookies.length > 0){
  32. for (Cookie cookie : cookies) {
  33. //3.获取cookie的名称
  34. String name = cookie.getName();
  35. //4.判断名称是否是:lastTime
  36. if("lastTime".equals(name)){
  37. //有该cookie,不是第一次访问
  38. flag = true;
  39. //设置cookie的value
  40. //获取当前时间,重新设置cookie的值,重新发送cookie
  41. Date date = new Date();
  42. SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
  43. String str_date = sdf.format(date);
  44. System.out.println("编码前: "+str_date);
  45. //URL编码
  46. str_date = URLEncoder.encode(str_date,"utf-8");
  47. System.out.println("编码后: "+str_date);
  48. cookie.setValue(str_date);
  49. //设置cookie的存活时间一个月
  50. cookie.setMaxAge(60*60*24*30);
  51. response.addCookie(cookie);
  52. //响应数据
  53. //获取cookie的value时间
  54. String value = cookie.getValue();
  55. System.out.println("解码前: "+value);
  56. //URL解码
  57. value = URLDecoder.decode(value,"utf-8");
  58. System.out.println("解码后: "+value);
  59. response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");
  60. break;
  61. }
  62. }
  63. }
  64. if(cookies==null||cookies.length==0||flag==false){
  65. //第一次访问
  66. //设置cookie的value
  67. //获取当前时间,重新设置cookie的值,发送cookie
  68. Date date = new Date();
  69. SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
  70. String str_date = sdf.format(date);
  71. System.out.println("编码前: "+str_date);
  72. //URL编码
  73. str_date = URLEncoder.encode(str_date,"utf-8");
  74. System.out.println("编码后: "+str_date);
  75. Cookie cookie = new Cookie("lastTime",str_date);
  76. //设置cookie的存活时间一个月
  77. cookie.setMaxAge(60*60*24*30);
  78. response.addCookie(cookie);
  79. response.getWriter().write("<h1>欢迎首次访问</h1>");
  80. }
  81. }
  82. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  83. this.doPost(request,response);
  84. }
  85. }
  1. - 效果(舒服)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581839903483-f5d2dd18-5b92-4207-bba3-b4fadf8db7c0.png#align=left&display=inline&height=158&name=image.png&originHeight=158&originWidth=994&size=27343&status=done&style=none&width=994)

3. Session

(1)概念+入门

  1. - **概念**:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。
  2. - **快速**(和cookie很像):
  3. - 获取HttpSession对象<br />**HttpSession session = request.getSession();**
  4. - 使用HttpSession对象<br />**object getAttributeString name)<br />void setAttributeString nameObject value)<br />void removeAttributeString name)**
  5. - **原理**
  6. - **session的实现依赖于cookie(使用cookie来存储ID来确认身份)**
  7. - **细节**
  8. - **当客户端关闭后,服务器不关闭,两次获取session是否为同一个?**
  9. - 不是!!!
  10. - **如果想要相同,必须储存cookie来村春ID<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581927975385-0ba8cada-d34a-461a-bb6e-b2c8b3606c0b.png#align=left&display=inline&height=157&name=image.png&originHeight=157&originWidth=1131&size=211854&status=done&style=none&width=1131)**
  11. - **客户端不关闭,服务器关闭后,两次获取的session是否相同**
  12. - 不是!!!,但是这个一定要确保数据不能丢失
  13. - **session的钝化:**
  14. - 在服务器关闭之前将session对象序列化到硬盘上
  15. - **session的活化:**
  16. - 在服务器启动后,将session文件转化为内存中的session对象
  17. - **使用tomcat服务器直接启动的话会自动完成session的钝化和活化,以后不必担心**
  18. - **客户端什么时候被销毁**
  19. - 服务器被关闭
  20. - session对象调用invalidate();
  21. - session默认失效时间:30(打开30分钟不做任何操作,但是可以进行修改)**<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581929493541-573e8529-2a37-4335-bc05-fefd14a8059b.png#align=left&display=inline&height=131&name=image.png&originHeight=131&originWidth=596&size=97260&status=done&style=none&width=596)**
  22. - **特点:**
  23. - session用于存储一次会话的多次请求的数据,存在服务器端
  24. - session可以存储任意类型 任意大小的数据
  25. - **sessionCookie的区别**
  26. - session存储在服务器端,Cookie存储在客户端
  27. - session没有数据大小限制,Cookie
  28. - session数据安全,Cookie相对不安全 **<br />