• 【尚硅谷】JavaWeb


    XML

    一、xml简介

    什么是 xml? xml 是可扩展的标记性语言

    xml 的主要作用有:

    • 用来保存数据,而且这些数据具有自我描述性
    • 它还可以做为项目或者模块的配置文件
    • 还可以做为网络传输数据的格式(现在 JSON 为主)

    二、xml的语法

    1、文档申明

     
    
    • 1

    2、xml注释

    html 和 XML 注释 一样 : 
    
    • 1

    3、xml元素

    xml元素指的是从开始标签到结束标签的部分(包括标签)

    元素可包含其他元素,文本或者两者的混合物

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MvskcCGA-1658929339523)(JavaWeb尚硅谷.assets/image-20220726225815818.png)]

    4、xml属性

    xml 的标签属性和 html 的标签属性是非常类似的,属性可以提供元素的额外信息

    在标签上可以书写属性: 一个标签上可以书写多个属性。每个属性的值必须使用 引号 引起来。

    5、xml语法规则

    1)所有 XML 元素都须有关闭标签(也就是闭合)

    2)XML对大小写敏感

    3)XML 必须正确地嵌套

    4)XML 文档必须有根元素

    5)XML 的属性值须加引号

    6)XML 中的特殊字符

    > 特殊字符 : >
    < 特殊字符 : <
    
    • 1
    • 2

    7)文本区域 (CDATA区域)

    CDATA 语法可以告诉 xml 解析器,我 CDATA 里的文本内容,只是纯文本,不需要 xml 语法

    CDATA 格式:

    
    
    • 1

    三、xml解析技术

    xml 可扩展的标记语言。 不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的 dom 技术

    早期 JDK 为我们提供了两种 xml 解析技术 DOM 和 Sax 简介(已经过时,但我们需要知道这两种技术)

    dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。 Java 对 dom 技术解析标记也做了实现。

    第三方的解析:

    jdom 在 dom 基础上进行了封装 、

    dom4j 又对 jdom 进行了封装。

    pull 主要用在 Android 手机开发,是在跟 sax 非常类似都是事件机制解析 xml 文件。

    这个 Dom4j 它是第三方的解析技术。我们需要使用第三方给我们提供好的类库才可以解析 xml 文件。

    1、使用dom4j解析xml

    1)引入第三方类库
    在这里插入图片描述
    2)解析代码demo

    @Test
    public void test1() throws DocumentException {
        // 1、创建一个SaxReader输入流,来读取xml配置文件,生成document对象
        SAXReader reader = new SAXReader();
        Document document = reader.read("src/books.xml");
        // 2、通过Document获取根元素
        Element root = document.getRootElement();
        // 3、通过根元素获取book标签对象
        List<Element> books= root.elements("book");
        // 4、遍历 处理每个book标签转换为book类
        for (Element book : books) {
            //asXML是将标签对象转化为标签字符串
            Element name = book.element("name");
            // getText()获取标签中的文本内筒
            String nameText = name.getText();
            //获取属性的值
            String sn = book.attributeValue("sn");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    Tomcat

    一、JavaWeb的概念

    所有通过Java语言编写的可以通过浏览器访问的程序的总称,叫做JavaWeb 。 Java是基于请求和响应开发的

    二、web资源的分类

    web资源按照实现技术和呈现的效果不同,分为静态资源和动态资源

    • 静态资源 :html、css、js、txt、mp4 视频 , jpg 图片
    • 动态资源: jsp 页面、Servlet 程序

    三、常见的web服务器

    什么是web服务器: https://blog.csdn.net/HelloZEX/article/details/122810557

    • Tomcat:由 Apache 组织提供的一种 Web 服务器,提供对 jsp 和 Servlet 的支持。它是一种轻量级的 javaWeb 容器(服务 器),也是当前应用最广的 JavaWeb 服务器(免费)。
    • Jboss:是一个遵从 JavaEE 规范的、开放源代码的、纯 Java 的 EJB 服务器,它支持所有的 JavaEE 规范(免费)。
    • GlassFish: 由 Oracle 公司开发的一款 JavaWeb 服务器,是一款强健的商业服务器,达到产品级质量(应用很少)。
    • Resin:是 CAUCHO 公司的产品,是一个非常流行的服务器,对 servlet 和 JSP 提供了良好的支持, 性能也比较优良,resin 自身采用 JAVA 语言开发(收费,应用比较多)
    • WebLogic:是 Oracle 公司的产品,是目前应用最广泛的 Web 服务器,支持 JavaEE 规范, 而且不断的完善以适应新的开发要求,适合大型项目(收费,用的不多,适合大公司)

    四、Tomcat的使用

    1、安装

    去官网下载需要使用的Tomcat版本对应的zip压缩吧,解压到需要安装的目录即可

    2、Tomcat的目录介绍在这里插入图片描述

    bin 专门用来存放 Tomcat 服务器的可执行程序

    conf 专门用来存放 Tocmat 服务器的配置文件

    lib 专门用来存放 Tomcat 服务器的 jar 包

    logs 专门用来存放 Tomcat 服务器运行时输出的日记信息

    temp 专门用来存放 Tomcdat 运行时产生的临时数据

    webapps 专门用来存放部署的 Web 工程。

    work 是 Tomcat 工作时的目录,用来存放 Tomcat 运行时 jsp 翻译为 Servlet 的源码,和 Session的钝化目录

    3 启动Tomcat

    第一种方式

    找到 Tomcat 目录下的 bin 目录下的 startup.bat 文件,双击,就可以启动 Tomcat 服务器

    打开浏览器,访问 http://localhost:8080
    在这里插入图片描述
    第二种方式

    以命令行方式cd到 E:\apache-tomcat-8.5.38\bin,输入:catalina run , 发现Tomcat也成功启动
    在这里插入图片描述

    4、停止Tomcat

    1)点击 tomcat 服务器窗口的 x 关闭按钮

    2)把 Tomcat 服务器窗口置为当前窗口,然后按快捷键 Ctrl+C

    3)找到 Tomcat 的 bin 目录下的 shutdown.bat 双击,就可以停止 Tomcat

    5、如何修改Tomcat的端口号

    找到 Tomcat 目录下的 conf 目录,找到 server.xml 配置文件
    在这里插入图片描述

    6、如何部署web工程到Tomcat中

    把 web 工程的目录拷贝到 Tomcat 的 webapps 目录下即可

    ①、在webapps下新建目录book

    ②、放入静态页面
    在这里插入图片描述
    ③、访问相应的地址 http://localhost:8080/book/pages/user/login.html
    在这里插入图片描述

    7、ROOT 的工程的访问,以及 默认 index.html 页面的访 问

    当我们在浏览器地址栏中输入访问地址如下:

    ​ http://ip:port/ ====>>>> 没有工程名的时候,默认访问的是 ROOT 工程。

    ​ 例如:启动tomcat后访问localhost:8080,默认访问的是root工程下的index.html

    当我们在浏览器地址栏中输入的访问地址如下:

    ​ http://ip:port/工程名/ ====>>>> 没有资源名,默认访问 index.html

    Servlet

    一、Servlet

    1、什么是Servlet

    1)Servlet是JavaEE规范之一。规范就是接口

    2)Servlet是JavaWeb三大组件之一。三大组件分别是:Servlet程序,Filter过滤器,Linstener

    监听器

    3)Servlet是运行在服务器上的一个Java程序,它可以接收客户端发送过来的请求并响应数据给客户端

    2、手动实现一个servlet程序

    • 编写一个类去实现Servlet接口
    • 实现service方法,处理请求,并响应数据
    • 到web.xml中配置Servlet程序访问地址

    demo演示如下:

    1)新建web工程
    在这里插入图片描述
    2)编写HelloServlet类继承Servlet接口,并重写service方法

    public class HelloServlet implements Servlet {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        /**
         service方法是专门用来处理请求和响应的
         */
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("HelloServlet程序被访问了");
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    3)编写web.xml 配置HelloServlet程序的访问路径

    
    <servlet>
        
        <servlet-name>HelloServletservlet-name>
        
        <servlet-class>com.atguigu.servlet.HelloServletservlet-class>
    servlet>
    
    
    <servlet-mapping>
        
        <servlet-name>HelloServletservlet-name>
        
        <url-pattern>/hellourl-pattern>
    servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4)访问路径 http://localhost:8080/06_Servlet/hello
    在这里插入图片描述

    3、servlet-url地址如何定位到servlet程序

    在这里插入图片描述

    4、Servlet程序的生命周期

    • 执行Servlet构造器方法
    • 执行init初始化方法 (第一、二步是在第一次访问的时候创建Servlet的程序时会调用)
    • 执行service方法 (第三步每次访问servlet程序时都会执行)
    • 执行destory销毁方法 (Tomcat容器停止的时候才会执行)

    5、通过继承HttpServlet来实现Servlet接口

    一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。

    1)编写一个类去继承 HttpServlet 类

    2)根据业务需要重写 doGet 或 doPost 方法

    3)到 web.xml 中的配置 Servlet 程序的访问地址

    public class HelloServlet2 extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("get请求");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("post请求");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    6、使用IDEA创建Servlet程序

    在这里插入图片描述

    7、Servlet 类的继承体系

    在这里插入图片描述

    二、ServletConfig类

    1、ServletConfig类的三大作用

    • 可以获取 Servlet 程序的别名 servlet-name 的值
    • 获取初始化参数 init-param
    • 获取 ServletContext 对象

    2、如何获取到ServletConfig

    1)在重写Servlet的init方法时,参数列表中携带ServletConfig

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2 HelloServlet init方法");
        //1)可以获取 Servlet 程序的别名 servlet-name 的值
        String servletName = servletConfig.getServletName();
        System.out.println("servletName:"+servletName);
    
        //2)获取初始化参数 init-param
        String key = servletConfig.getInitParameter("key");
        System.out.println(key);
    
        //3)获取 ServletContext 对象
        servletConfig.getServletContext();
    }
    
    <!-- initparam的配置 -->
    <servlet>
        <!--servlet-name 给Servlet起一个别名-->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-classServlet程序的全类名-->
        <servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
        <init-param>
            <param-name>key</param-name>
            <param-value>i like reba</param-value>
        </init-param>
    </servlet>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    2)也可以在非init方法中获取到ServletConfig

    通过 ServletConfig servletConfig = getServletConfig() 获取到ServletConfig

    通过代码可以看到 这个方法是由GenericServlet 提供的,再往上走,就是tomcat在创建servlet程序时,创建了ServletConfig对象

    public class HelloServlet2 extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("get请求");
            ServletConfig servletConfig = getServletConfig();
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("post请求");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    【注意】但是此时,你如果重写了init方法,则必须调用父类的init方法,否则获取到的servletConfig 为null
    在这里插入图片描述

    三、ServletContext类

    1、什么是 ServletContext

    • ServletContext是一个接口,它表示Servlet上下文
    • 一个web工程,只有一个ServletContext对象实例
    • ServletContext是一个域对象
    • ServletContext在web工程部署启动的时候创建,在web工程停止的时候销毁

    什么是域对象?

    域对象,是可以像 Map 一样存取数据的对象,叫域对象。 这里的域指的是存取数据的操作范围,整个 web 工程。

    2、ServletContext类的四个作用

    • 获取 web.xml 中配置的上下文参数 context-param 2、获取当前的工程路径,格式: /工程路径
    • 获取当前的工程路径,格式: /工程路径
    • 获取工程部署后在服务器硬盘上的绝对路径
    • 像 Map 一样存取数
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = getServletConfig().getServletContext();
        String username = servletContext.getInitParameter("username");
        System.out.println("context-param 参数 username 的值是:" + username);
        System.out.println( "当前工程路径:" + servletContext.getContextPath() );
        System.out.println("工程部署的路径是:" + servletContext.getRealPath("/"));
    
        /*作为域保存数据*/
        servletContext.setAttribute("houchen", "帅哥");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    四、Http协议

    Cookie和Session

    一、Cookie

    1、什么是cookie?

    Cookie 是服务器通知客户端保存键值对的一种技术;当客户端有了Cookie之后,之后的每次请求都会携带cookie;

    【注意】每个cookie的大小不超过 4kb

    2、如何创建 cookie ?

    cookie是由服务器端进行创建,然后通知客户端保存cookie的
    在这里插入图片描述

    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
        //1 创建 Cookie 对象
        Cookie cookie = new Cookie("key4", "value4");
        //2 通知客户端保存 Cookie
        resp.addCookie(cookie);
        //1 创建 Cookie 对象
        Cookie cookie1 = new Cookie("key5", "value5");
        //2 通知客户端保存 Cookie
        resp.addCookie(cookie1);
        resp.getWriter().write("Cookie 创建成功");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3、服务器端如何获取cookie

    服务器端获取客户端的cookie只需要一行代码 :

    Cookie[] cookies = req.getCookies();
    
    • 1

    4、Cookie值的修改

    方式一: 直接使用相同的key覆盖原来的cookie对象,调用 response.addCookie()通知客户端保存修改

    Cookie cookie = new Cookie("key1","newValue1");
    // 3、调用 response.addCookie( Cookie ); 通知 客户端 保存修改
    resp.addCookie(cookie);
    
    • 1
    • 2
    • 3

    方式二:

    先查找到需要修改的 Cookie 对象;调用 setValue()方法赋于新的 Cookie 值;调用 response.addCookie()通知客户端保存修改

    Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());
    if (cookie != null) {
        // 2、调用 setValue()方法赋于新的 Cookie 值。
        cookie.setValue("newValue2");
        // 3、调用 response.addCookie()通知客户端保存修改
        resp.addCookie(cookie);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5、Cookie的生命控制

    Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)

    setMaxAge()

    • 正数 表示在指定的秒数后过期
    • 负数 表示浏览器一关,Cookie就会被删除
    • 0 表示马上删除cookie => 响应到了客户端就会被删除
    Cookie cookie = new Cookie("life3600", "life3600");
    cookie.setMaxAge(60 * 60); // 设置 Cookie 一小时之后被删除。无效
    resp.addCookie(cookie);
    resp.getWriter().write("已经创建了一个存活一小时的 Cookie");
    
    • 1
    • 2
    • 3
    • 4

    6、Cookie有效路径 Path的设置

    Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。
    在这里插入图片描述

    二、Session会话

    1、什么是Session会话?

    • Session本质上就是一个接口 (HttpSession)

    • Session是一个会话,它是用来维护客户端和服务器之间关联的一种技术;每个客户端都有自己的一个Session会话,

      session会话中,经常用来你保存用户登录之后的信息

    2、如何创建Session 和 获取

    创建和获取Session ,它们的api是一样的。

    request.getSession()

    ​ 第一次调用是:创建Session会话

    ​ 第二次调用是:获取前面创建好的Session会话对象

    isNew(); 判断到底是不是刚创建出来的(新的)

    ​ true 表示刚创建

    	false 表示获取之前创建
    
    • 1

    每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。getId() 得到 Session 的会话 id 值。

    3、Session的生命周期

    session超时的理解

    浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了,但服务器与客户端会产生一个新的会话,之前的session里的属性值全部丢失,产生新的sesssionId

    public void setMaxInactiveInterval(int interval) 设置 Session 的超时时间(以秒为单位),超过指定的时长,Session就会被销毁。
    值为正数的时候,设定 Session 的超时时长。
    负数表示永不超时(极少使用)
    public int getMaxInactiveInterval()获取 Session 的超时时间
    public void invalidate() 让当前 Session 会话马上超时无效
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Session 默认的超时时长是多少! Session 默认的超时时间长为 30 分钟。 因为在 Tomcat 服务器的配置文件 web.xml中默认有以下的配置,它就表示配置了当前 Tomcat 服务器下所有的 Session 超时配置默认时长为:30 分钟。

    <session-config>
    	<session-timeout>30session-timeout>
    session-config>
    
    • 1
    • 2
    • 3

    如果说。你希望你的 web 工程,默认的 Session 的超时时长为其他时长。你可以在你自己的 web.xml 配置文件中做 以上相同的配置。就可以修改你的 web 工程所有 Seession 的默认超时时长。

    
    <session-config>
    	<session-timeout>20session-timeout>
    session-config>
    
    • 1
    • 2
    • 3
    • 4

    如果你想只修改个别 Session 的超时时长。就可以使用上面的 API。setMaxInactiveInterval(int interval)来进行单独的设 置。 session.setMaxInactiveInterval(int interval)单独设置超时时长

    4、浏览器和session直接关联的技术内幕

    Session 技术,底层其实是基于 Cookie 技术来实现
    在这里插入图片描述

  • 相关阅读:
    mongoDB安装教程
    Empty suite
    HSDC和独立生成树相关
    基于Syntiant TinyML Board与Edge Impulse的LED语音控制(Arduino/C++)
    buildadmin+tp8表格操作(7)表格的事件监听
    C++面试经典题型
    C++ Qt开发:StringListModel字符串列表映射组件
    希尔排序超详细讲解C语言
    使用HTTPS模式建立高效爬虫IP服务器详细步骤
    Linux V4L2编程和驱动底层分析
  • 原文地址:https://blog.csdn.net/hc1285653662/article/details/126023851