servlet 的原理以及应用,没有多难

本文详细介绍了Servlet的工作原理,包括用户通过HTTP请求与服务器交互,Servlet引擎如何处理请求并调用相应的Servlet。重点阐述了Servlet的生命周期,包括第一次和第二次访问时的不同处理。同时,讲解了Servlet在web.xml中的配置,强调了映射路径的唯一性和通配符的使用,以及如何处理404错误。

大家好,今天分享一下 servlet 的原理

可以看这个(如果从流程的角度上去解释)

在这里插入图片描述

或者这个
在这里插入图片描述

看的懂哪个看哪个

如果是从代码实现的角度上

在这里插入图片描述

servlet的核心就是在服务器端创建用户请求的对象

我在下面使用大白话讲一遍

用户通过浏览器访问网站

首先使用浏览器向网站的服务器发送http 请求

服务器使用servlet引擎来处理请求,然后会选择响应的servlet 来响应这个请求,并且将响应的结果交给浏览器

servlet 引擎访问servlet的过程分为两种情况

  1. 第一次访问

servlet 引擎创建servlet实例,之后定义servlet init 方法对servlet进行初始化,再调用servlet的service 方法来响应用户请求

2… 第二次访问

再次访问的时候,servlet引擎会自动检查servlet是否已经存在,如果存在,就直接调用servtice法来响应用户请求,不需要再进行初始化

servlet引擎在调用service方法之前,会创建request的请求对象以及response响应对象,service方法会读取request 请求信息,处理service请求,并将处理结果响应到响应对象response中

这就是service方法要做的工作,servlet引擎会将响应对象response中存放的信息通过浏览器发送给用户

在它的整个过程当中,有4 个生命周期

在这里插入图片描述

还有关于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"
         metadata-complete="true">


<!--  这是注册servlet-->
    <servlet>
        <servlet-name>hi</servlet-name>
<!--        hi 可以随便写,是一个别名-->
        <servlet-class >ceshi.FirstServlet</servlet-class>
<!--        这里一定要指向我们自己刚才写的类,写清楚它所在的具体路径-->
    </servlet>


<!--    这是配置它的请求路径-->
    <servlet-mapping>
        <servlet-name   > hi</servlet-name>
<!--        可以随便写,就是一个别名-->
        <url-pattern >/hi</url-pattern>
        <!-- 通过别名引用一个类,给它设置一个网络访问路径(网名),它必须以/开头。 -->
    </servlet-mapping>

</web-app>





<!--我们把这个文件换一下,因为它这个太老了-->

这是我们上次在web.xml 上写的代码

在这个里面,我们的注意点是

<!--    这是配置它的请求路径-->
    <servlet-mapping>
        <servlet-name   > hi</servlet-name>
<!--        可以随便写,就是一个别名-->
        <url-pattern >/hi</url-pattern>
        <!-- 通过别名引用一个类,给它设置一个网络访问路径(网名),它必须以/开头。 -->
    </servlet-mapping>

这里的路径可以随便改的

第一个注意点就是

一个servlet可以映射一个地址(像这样)

<!--    这是配置它的请求路径-->
    <servlet-mapping>
        <servlet-name   > hi</servlet-name>
<!--        可以随便写,就是一个别名-->
        <url-pattern >/hi</url-pattern>
        <!-- 通过别名引用一个类,给它设置一个网络访问路径(网名),它必须以/开头。 -->
    </servlet-mapping>

浏览器的处理结果:

在这里插入图片描述

http://localhost:8082/s01/ localhost 代表了我们自己的主机,8082 指的是我们tomcat服务器的端口(默认是8080 ,这是后改的)

s01 : 这是我们在使用idea 连接tomcat时自己配置的路径

在这里插入图片描述

这是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"
         metadata-complete="true">


<!--  这是注册servlet-->
    <servlet>
        <servlet-name>hi</servlet-name>
<!--        hi 可以随便写,是一个别名-->
        <servlet-class >ceshi.FirstServlet</servlet-class>
<!--        这里一定要指向我们自己刚才写的类,写清楚它所在的具体路径-->
    </servlet>


<!--    这是配置它的请求路径-->
    <servlet-mapping>
        <servlet-name   > hi</servlet-name>
<!--        可以随便写,就是一个别名-->
        <url-pattern >/hi01</url-pattern>
        <!-- 通过别名引用一个类,给它设置一个网络访问路径(网名),它必须以/开头。 -->
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name > hi</servlet-name>
        <!--        可以随便写,就是一个别名-->
        <url-pattern >/hi03</url-pattern>
        <!-- 通过别名引用一个类,给它设置一个网络访问路径(网名),它必须以/开头。 -->
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name   > hi</servlet-name>
        <!--        可以随便写,就是一个别名-->
        <url-pattern >/hi04</url-pattern>
        <!-- 通过别名引用一个类,给它设置一个网络访问路径(网名),它必须以/开头。 -->
    </servlet-mapping>
</web-app>





<!--我们把这个文件换一下,因为它这个太老了-->

在这里插入图片描述

这是hi01的路径

在这里插入图片描述

这是hi03的路径

在这里插入图片描述

这是hi04的路径

在这里插入图片描述

在一个servlet当中, 映射路径不可以重复(就是不可以有两个一样的)

否则将会报错

在这里插入图片描述

对于这个路径,我们也可以使用通配符
它的意思就是: 让规定路径下的任何资源,都可以走这个servlet

<!--    这是配置它的请求路径-->
    <servlet-mapping>
        <servlet-name   > hi</servlet-name>
<!--        可以随便写,就是一个别名-->
        <url-pattern >/hi01/*</url-pattern>
        <!-- 通过别名引用一个类,给它设置一个网络访问路径(网名),它必须以/开头。 -->
    </servlet-mapping>

后面直接写上123 可以的

在这里插入图片描述

写上帅哥(帅哥)也可以

在这里插入图片描述

它的意思就是: 让规定路径下的任何资源,都可以走这个servlet

路径就写一个通配符的结果 ,就会提到原先的默认主页

在这里插入图片描述

这个带着通配符的路径是默认的请求路径,它的优先级也很高

模拟404 报错的网络资源请求

在这里插入图片描述

自己随意写一个类 (见名之意就可以了)

package ceshi;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ServletError extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

和上次一样

这就是一个完整的类

package ceshi;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class ServletError extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // super.doGet(req, resp);
        resp.setCharacterEncoding("utf-8");      //防止乱码
        resp.setContentType("text/html");      //文本类型
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>404</h1>");     //这是浏览器当中用户可以看到的东西
        
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

同样,我们需要注册

<?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"
         metadata-complete="true">


<!--  这是注册servlet-->
    <servlet>
        <servlet-name>hi</servlet-name>
<!--        hi 可以随便写,是一个别名-->
        <servlet-class >ceshi.FirstServlet</servlet-class>
<!--        这里一定要指向我们自己刚才写的类,写清楚它所在的具体路径-->
    </servlet>


<!--    这是配置它的请求路径-->
    <servlet-mapping>
        <servlet-name   > hi</servlet-name>
<!--        可以随便写,就是一个别名-->
        <url-pattern >/hi01</url-pattern>
        <!-- 通过别名引用一个类,给它设置一个网络访问路径(网名),它必须以/开头。 -->
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name > hi</servlet-name>
        <!--        可以随便写,就是一个别名-->
        <url-pattern >/hi03</url-pattern>
        <!-- 通过别名引用一个类,给它设置一个网络访问路径(网名),它必须以/开头。 -->
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name   > hi</servlet-name>
        <!--        可以随便写,就是一个别名-->
        <url-pattern >/hi04</url-pattern>
        <!-- 通过别名引用一个类,给它设置一个网络访问路径(网名),它必须以/开头。 -->
    </servlet-mapping>

<!--       这下面是我们404资源的注册-->
    <servlet>
       <servlet-name>error</servlet-name>     
<!--    这是别名  。可以随便写    -->
        <servlet-class>ceshi.ServletError</servlet-class>
<!--        这个必须要这样写的。 指的是刚才写的类的位置-->
    </servlet>

    <servlet-mapping>
        <servlet-name>error</servlet-name>   
<!--        这是别名-->
        <url-pattern>/*</url-pattern>     
<!--        这是路径-->
    </servlet-mapping>
</web-app>





<!--我们把这个文件换一下,因为它这个太老了-->

关于404 的注册

<!--       这下面是我们404资源的注册-->
    <servlet>
       <servlet-name>error</servlet-name>     
<!--    这是别名  。可以随便写    -->
        <servlet-class>ceshi.ServletError</servlet-class>
<!--        这个必须要这样写的。 指的是刚才写的类的位置-->
    </servlet>

    <servlet-mapping>
        <servlet-name>error</servlet-name>   
<!--        这是别名-->
        <url-pattern>/*</url-pattern>     
<!--        这是路径-->
    </servlet-mapping>

重启一下tomcat 服务器

在这里插入图片描述

后面怎么些都是对的,因为我们注册的时候使用了通配符

在这里插入图片描述

好了,有关于servlet 的原理以及应用就到这里了,谢谢大家

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思诚代码块

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值