大家好,今天分享一下 servlet 的原理
可以看这个(如果从流程的角度上去解释)

或者这个

看的懂哪个看哪个
如果是从代码实现的角度上

servlet的核心就是在服务器端创建用户请求的对象
我在下面使用大白话讲一遍
用户通过浏览器访问网站
首先使用浏览器向网站的服务器发送http 请求
服务器使用servlet引擎来处理请求,然后会选择响应的servlet 来响应这个请求,并且将响应的结果交给浏览器
servlet 引擎访问servlet的过程分为两种情况
- 第一次访问
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 的原理以及应用就到这里了,谢谢大家
本文详细介绍了Servlet的工作原理,包括用户通过HTTP请求与服务器交互,Servlet引擎如何处理请求并调用相应的Servlet。重点阐述了Servlet的生命周期,包括第一次和第二次访问时的不同处理。同时,讲解了Servlet在web.xml中的配置,强调了映射路径的唯一性和通配符的使用,以及如何处理404错误。
365

被折叠的 条评论
为什么被折叠?



