Web服务器

目录

什么是Web服务器?

Web容器

Servlet

Servlet 规范

Servlet 的API结构

编写Servlet

servlet生命周期(产生到销毁的过程)

服务器产生响应信息的两种格式


什么是Web服务器?

        Web服务器是一个程序,用于接收客户端的请求并将响应发送回客户端。它通常用于处理静态内容,例如HTML文件、图像和CSS样式表等。

缺陷

        传统 Web服务器 的缺陷:产生响应信息时,只能产生静态的html页面。一旦内容更改,就需要修改网页内容,极大影响了响应信息的灵活性。

辅助应用

        在Web服务器之后增加辅助应用,辅助应用可以在Web服务器接收到客户端请求以后,进行一大堆的业务处理,然后,以数据库为介质动态返回数据库中的信息。大大增加响应信息的灵活性。

        Java利用 Web容器+servlet 方式作为辅助应用的解决方案。由Web容器进行底层操作,然后预留servlet接口,交给开发者完成业务操作。

Web容器

        Web容器是Web服务器的一部分,用于处理动态内容。它们一起工作,为Web应用程序提供服务。常见的Web容器包括Tomcat、Jetty和WebLogic等。

        通常,Web服务器会将静态内容发送到客户端,而动态内容会通过Web容器进行处理,然后再将响应发送回Web服务器,并由Web服务器发送回客户端。

特点

通讯支持 按照http协议,将请求信息和响应信息,封装请求对象响应对象,以便更好的接收和发送数据。
Servlet 生命周期管理 Servlet接口的实现类,由Web容器产生、初始化、方法调用、销毁
线程支持 线程的创建、启动、运行、同步、销毁都由Web容器执行
JSP 支持 负责编写JSP引擎,对JSP页面进行翻译

好处

提供动态内容处理 Web容器可以处理动态内容,内容可以根据用户请求实时生成
提高性能 Web容器通过使用线程池和请求管道等技术,可以提高Web应用程序的性能吞吐量
提供安全性 Web容器可以提供对Web应用程序的安全性保护,例如通过对访问进行认证和授权,防止跨站点脚本攻击和SQL注入攻击等
简化开发 Web容器可以简化Web应用程序的开发和部署,提供基础设施和应用程序接口的实现,使开发人员可以更快速地构建Web应用程序
可扩展性 Web容器可以支持多个Web应用程序,这些应用程序可以在同一个Web容器中运行,从而实现共享资源和更高的可扩展性

Servlet

        Servlet是运行在Web服务器或应用服务器上的Java程序,是Web容器和开发者业务组件通信的标准。它可以处理来自Web客户端的请求并生成响应。

        开发者通过实现Servlet接口书写业务操作,Web容器通过Servlet接口调用方法,可以屏蔽开发者业务类的差异。

Servlet 规范

        java对辅助应用的实现,由 WEB 容器+servlet完成。各个厂商在完成具体实现时,各自有各自的标准。这样,对于不同的容器厂商,就会有 API、WEB应用程序结构、以及性能的差异。同一个 WEB应用程序,也就不能在不同厂商的WEB容器运行。

        为了规范不同厂家之间的差异,Sun公司制定了Servlet规范。该规范定义了一系列的标准和一系列的接口。由不同的厂商提供实现类开发者根据接口调用方法,就可以屏蔽不同厂家的差异。WEB应用程序也就有了移植性。

HttpServletRequest、HttpServletResponse 都是接口 ,实现类由 容器厂商提供

Servlet 的API结构

Web服务器_第1张图片

        

Servlet 定义Servlet的行为,包括生命周期方法和处理客户端请求的方法

ServletConfig

定义了Servlet的初始化参数和ServletContext对象的配置
GenericServlet 通用的Servlet实现,实现了Servlet和ServletConfig接口,并提供了一些通用的方法
HttpServlet GenericServlet的子类,专门用于处理HTTP请求,提供了处理HTTP请求的方法

        在Servlet 规范中,定义了Servlet业务接口,提供了service()业务方法交给开发者实现。同时,定义了ServletConfig配置接口,用于读取Servlet初始化信息

        GenericServlet同时实现了Servlet和ServletConfig两个接口,并且重写了大部分方法。但是,没有重写service()方法,该方法应该由子类根据协议的特点去重写。

        HtppServlet是GenericServlet的子类,根据http协议的特点重写了service方法。在service

方法中,根据不同的请求方式,分别去调用doXXX(),处理请求。

编写Servlet

一、继承HttpServlet接口,实现doxxx方法

public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //doGet()方法调用doPost()方法,以便在处理GET请求时也能响应相同的逻辑
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //向客户端 输出文本数据
        resp.getWriter().println("hello,world");
    }
}

二、创建tomcat容器,并且注册servlet,完成tomcat启动

 tomcat依赖
 
        
            org.apache.tomcat.embed
            tomcat-embed-core
            9.0.36
        
  
public class MainTomcat {
    public MainTomcat(){
        Tomcat tomcat = new Tomcat();
        //设置启动端口
        tomcat.setPort(8088);
        //引导http引擎
        tomcat.getConnector();
        //创建上下文对象
        Context context = tomcat.addContext("",null);
        //注册servlet
        Wrapper wrapper = Tomcat.addServlet(context,"testServlet",new TestServlet());
        //设置servlet访问路径
        wrapper.addMapping("/test");
        try {
            //启动tomcat
            tomcat.start();
        } catch (LifecycleException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        new MainTomcat();
    }
}

Servlet的URL映射路径有三种

一、精准匹配  /

  wrapper.addMapping("/test");

 客户端以/test 来请求服务器,就能找到对应的servlet

二、拓展匹配  *.

  wrapper.addMapping("*.test");

客户端以.test结尾的请求,都能找到对应的servlet

三、 路径匹配 / /*

  wrapper.addMapping("/test/* ");

客户端以/test/开始的请求,都能找到对应的servlet

servlet生命周期(产生到销毁的过程)

1.web容器加载并实例化servlet

2.调用 init() 方法 完成初始化

wrapper.setLoadOnStartup(0);
  • 如果设置了setLoadOnStartup,且值为0或正数。那么,web容器启动就初始化。(0,1,2为执行顺序,0优先执行)
  • 如果没有设置,或者值为负数。那么web容器会在第一次访问servlet时初始化。

3.当请求到达时,调用service方法,完成业务处理,产生响应信息(每次请求都会执行)

4.销毁阶段,调用destory方法,完成资源清理

服务器产生响应信息的两种格式

1、向客户端 发送文本数据

Witer w = resp.getWiter(); 
  • 得到打印字符流,向客户端输出文本数据

2、向客户端 发送二进制数据

OutputStream out = resp.getOutputStream();
  • 得到字节流,向客户端 输出二进制数据

你可能感兴趣的:(JavaWeb,servlet,web)