JavaWeb-JS 5-3 Web核心(HTTP、Tomcat、 Servlet)

1、技术栈

在这里插入图片描述

在这里插入图片描述

2、HTTP请求数据格式

在这里插入图片描述
请求分为两种:GET和POST
在这里插入图片描述

3、HTTP响应数据格式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里需要记住:200、404和500.

4、Web服务器软件 Tomcat

在这里插入图片描述

4.1Tomcat简介

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2 tomcat安装

在这里插入图片描述
在这里插入图片描述
这里我改成了8081端口,然后启动tomcat,在浏览器窗口输入url:localhost:8081,即可访问tomcat服务器软件自带的web页面,非常滴帅
在这里插入图片描述

在这里插入图片描述

4.3 IDEA中创建Maven Web项目

在这里插入图片描述

4.3.1 IDEA中创建Maven Web项目(使用骨架)

在这里插入图片描述

  • 下面我们使用骨架创建一个Maven Web项目
    1、创建maven模块,选中create from archetype,找到web-app选项
    在这里插入图片描述
    2、起名字,使用默认的配置
    在这里插入图片描述
    3、最后确认一下
    在这里插入图片描述
    4、配置一下项目,先打开pom.xml配置文件,删除一些无用的插件
    在这里插入图片描述
    5、看一下骨架结构,缺少啥东西,就添加啥东西,缺少java目录和resources目录
    在这里插入图片描述
    那么补齐这两个目录,在src下右键选中Directory,会有提示如下图所示,那么我们挨个创建好java目录和resources目录。
    在这里插入图片描述
4.3.2 IDEA中创建Maven Web项目(使用骨架)

在这里插入图片描述
1、选择web项目,不使用骨架创建
2、pom.xml中手动添加打包方式war
在这里插入图片描述
然后点右上角的刷新maven项目,表示我这个项目是web项目,不然在后面添加webapp目录的时候不会显示这个项目名字。
在这里插入图片描述

3、补齐缺失的目录,打开Project Structure,选择Facets,选中红框,双击
在这里插入图片描述
一路yes,就可以创建好
在这里插入图片描述
创建好了长这样
在这里插入图片描述

4、往web目录下添加WEB-INF和index.jsp,点击web.xml
在这里插入图片描述
自动补齐的目录不对,请手动添加\src\main\webapp,后选择ok
在这里插入图片描述
最后apply,ok就创建好了。最后的目录长这样
在这里插入图片描述

4.4 IDEA集成到本地tomcat

方式1:
在这里插入图片描述
1、点击右上角 edit configurations
在这里插入图片描述
在这里插入图片描述
选择配置到本地。
2、选择server的配置,选到tomcat的安装路径。

在这里插入图片描述
3、tomcat部署到项目
在这里插入图片描述
最终配置效果注意红框都是要配置的
在这里插入图片描述
4、 apply 然后ok就好了
5、写个测试页面,测试一下
在这里插入图片描述
运行后出现404找不到,没关系,我们后面追加url:a.html
在这里插入图片描述大功告成~

方式2:Maven-tomcat插件

在这里插入图片描述
在这里插入图片描述

注意修改端口号,最后运行一下
在这里插入图片描述
在这里插入图片描述
拿着这个url去网页复制打开,并添加/a.html出现我们想要访问的html
在这里插入图片描述

5、Servlet动态资源开发技术

在这里插入图片描述
前端三剑客HTML、CSS、JS是静态资源,也就是说 每个用户访问到的效果都是一样的。而Servlet是动态资源,根据输入参数不同给予不同的局部效果
在这里插入图片描述

在这里插入图片描述

5.1 Servlet快速入门

在这里插入图片描述
我们在之前创建好的Maven web 项目(tomcat-demo2)中实现上述servlet的快速入门

1、导入Servlet依赖坐标
在这里插入图片描述
2、定义一个类,实现Servlet接口,重写接口的所有方法,并在service方法中添加打印信息
在这里插入图片描述
3、注解配置: 在类上使用@WebServlet("/demo1")配置该Servlet的访问路径
在这里插入图片描述
4、启动tomcat,浏览器输入URL,访问该网页,并返回IDEA查看结果
在这里插入图片描述
服务端显示打印结果,表示我们的项目成功了,只要访问了网页就会在服务端有显示。

5.2 Servlet执行流程

在这里插入图片描述

  • 两个事必须非常清楚:
    • 1、servlet由谁创建?Servlet方法由谁调用?
      • servlet由web服务器tomcat创建并由web服务器调用
    • 2、 服务器怎么知道Servlet中一定有service方法?
      • 因为我们自定义的servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法。

5.3 Servlet生命周期

在这里插入图片描述

  • 第一个阶段:加载和实例化

    • 如下图所示,在上面的注解写一个loadOnStartup=1,0或正整数,即表示服务器启动时创建Servlet对象,数字越小优先级越高
    • 当为负整数时,表示第一次访问时创建Servlet对象,当然,默认情况下就是第一次。 在这里插入图片描述
  • 2、初始化,在Servlet实例化之后,容器将调用servlet的init()方法来完成一些加载配置文件、连接处理等相关工作,注意该方法只会调用一次。

    • 我们到IEAD演示一下,首先在原来的项目上,重写写一个servlet实现类。如下图所示,并填写init方法中的代码,然后我们使用tomcat run这个实现类。
      在这里插入图片描述
      在这里插入图片描述
      我们接着到这个url去访问一下。如下图所示
      在这里插入图片描述
      成功打开网页表示访问成功,这也是我们第一次访问了Servlet
      相对应的,我们的init方法会被触发,那么信息会打印到控制台,我们回到控制台看一下。
      在这里插入图片描述
      意料之中,默认情况下,第一次访问Servlet时,会先调用Init()方法且只调用一次,接着调用service()方法。我们多访问几次看看,是否init()只会调用一次。
      多刷新几遍页面,代表多次访问。再回到控制台看结果。不出意外,会出现多条servlet hello~。
      在这里插入图片描述
      init()方法就先介绍到这里。
  • 3、 请求处理,这个service方法,不用多解释了,很直观,当网页访问servlet时,会调用service方法做出回应给页面,这个时候还没有学respone方法,所以先搁置。后面还会回到这里。

  • 4、服务终止
    destory方法:
    1、调用时机:内存释放或者服务器关闭的时候,Servlet对象被销毁,调用此方法。
    2、调用次数:1次
    试一下:模拟一下服务器关闭的场景:注意不要在IDEA点终止,这样相当于拔电源
    而是 在命令行中 用 ctrl+c的方法关闭服务器。
    先写一个提示代码
    在这里插入图片描述
    然后关闭服务器。
    首先来到命令行,再cd到当前路径,输入 mvn tomcat7:run,运行tomcat服务器
    在这里插入图片描述
    然后按ctrl C,运行destroy()方法。
    在这里插入图片描述

5.4 Servlet方法介绍&体系结构

在这里插入图片描述

  • 1、getServletinfo()方法,用来返回Servlet的作者,信息,还有版权,不常用

  • Returns information about the servlet, such as author, version, and copyright.

  • 2、getServletConfig() 方法,返回一个ServletConfig的对象,包含了Servlet的初始化和启动项的参数。下面我们来讲讲如何获得ServletConfig的对象

  • Returns a ServletConfig object, which contains initialization and startup parameters for this servlet.
    请砍下图。
    在这里插入图片描述
    体系结构:用来简化以上这5个方法的写作。
    通过上面的学习,我们知道要想编写一个Servlet就必须要实现Servlet接口,重写接口中的5个方法,虽然已经能完成要求,但是编写起来还是比较麻烦的,因为我们更关注的其实只有service方法,那有没有更简单方式来创建Servlet呢?

要想解决上面的问题,我们需要先对Servlet的体系结构进行下了解:
在这里插入图片描述
因为我们将来开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet,会通过继承HttpServlet
具体的编写格式如下:

@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //TODO GET 请求方式处理逻辑
        System.out.println("get...");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //TODO Post 请求方式处理逻辑
        System.out.println("post...");
    }
}
  • 要想发送一个GET请求,请求该Servlet,只需要通过浏览器发送http://localhost:8081/tomcat-demo2/demo4,就能看到doGet方法被执行了
  • 要想发送一个POST请求,请求该Servlet,单单通过浏览器是无法实现的,这个时候就需要编写一个form表单来发送请求,在webapp下创建一个a.html页面,内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/web-demo/demo4" method="post">
        <input name="username"/><input type="submit"/>
    </form>
</body>
</html>

启动测试,即可看到doPost方法被执行了。

Servlet的简化编写就介绍完了,接着需要思考两个问题:

  1. HttpServlet中为什么要根据请求方式的不同,调用不同的方法?
  2. 如何调用?

针对问题一,我们需要回顾之前的知识点前端发送GET和POST请求的时候,参数的位置不一致,GET请求参数在请求行中,POST请求参数在请求体中,为了能处理不同的请求方式,我们得在service方法中进行判断,然后写不同的业务处理.

小结
通过这一节的学习,要掌握:

  1. HttpServlet的使用步骤

继承HttpServlet

重写doGet和doPost方法

  1. HttpServlet原理

获取请求方式,并根据不同的请求方式,调用不同的doXxx方法

5.5 urlPattern配置

Servlet类编写好后,要想被访问到,就需要配置其访问路径(urlPattern

  • 1、 一个Servlet,可以配置多个urlPattern
  • 在这里插入图片描述
    在这里插入图片描述
  • 2、 urlPattern配置规则
  • 在这里插入图片描述
    很简单,一看看就行,注意一下 *.do,前面不要加/。
    在这里插入图片描述
    • 注意://*的区别?

      1. 当我们的项目中的Servlet配置了 “/”,会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet

      2. 当我们的项目中配置了"/*",意味着匹配任意访问路径

      3. DefaultServlet是用来处理静态资源,如果配置了"/"会把默认的覆盖掉,就会引发请求静态资源的时候没有走默认的而是走了自定义的Servlet类,最终导致静态资源不能被访问

小结

  1. urlPattern总共有四种配置方式,分别是精确匹配、目录匹配、扩展名匹配、任意匹配

  2. 五种配置的优先级为 精确匹配 > 目录匹配> 扩展名匹配 > /* > / ,无需记,以最终运行结果为准。

5.6 XML配置

前面对应Servlet的配置,我们都使用的是@WebServlet,这个是Servlet从3.0版本后开始支持注解配置,3.0版本前只支持XML配置文件的配置方法。

对于XML的配置步骤有两步:

  • 编写Servlet类
package com.itheima.web;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;

public class ServletDemo13 extends MyHttpServlet {

    @Override
    protected void doGet(ServletRequest req, ServletResponse res) {

        System.out.println("demo13 get...");
    }
    @Override
    protected void doPost(ServletRequest req, ServletResponse res) {
    }
}
  • 在web.xml中配置该Servlet
<?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>
        <!-- servlet的名称,名字任意-->
        <servlet-name>demo13</servlet-name>
        <!--servlet的类全名-->
        <servlet-class>com.itheima.web.ServletDemo13</servlet-class>
    </servlet>

    <!-- 
        Servlet 访问路径
    -->
    <servlet-mapping>
        <!-- servlet的名称,要和上面的名称一致-->
        <servlet-name>demo13</servlet-name>
        <!-- servlet的访问路径-->
        <url-pattern>/demo13</url-pattern>
    </servlet-mapping>
</web-app>

这种配置方式和注解比起来,确认麻烦很多,所以建议大家使用注解来开发。但是大家要认识上面这种配置方式,因为并不是所有的项目都是基于注解开发的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值