什么是servlet?
servlet是是JAVAEE规范之一,也就是一个接口。
Servlet(Server Applet)是Java Servlet的简称,而Servlet的英文意为:
本质上servlet是一个运行再服务器端的Java小程序。
servlet可以接收客户端发来的信息,并响应数据给客户端。
它也是Javaweb三大组件之一(还有filter过滤器,listener监听器)
配置servlet的两种方法:
1.自己在JAVA resource/src的包里面创建一个java文件,然后在web.xml中配置相应信息。(servlet和servlet-mapping)
servlet-mapping的作用
如果url-pattern定义的是路径,那么以后所有对这个路径下资源的请求都会由servlet-name中定义的servlet处理;
如果url-pattern定义的是资源格式例如*.do等,那么对于所有符合这种格式的资源的请求都由指定的servlet处理。
(首先 web.xml 是java web 项目的一个重要的配置文件,但是web.xml文件并不是Java web工程必须的。web.xml文件是用来配置:欢迎页、servlet、filter等的。当你的web工程没用到这些时,你可以不用web.xml文件来配置你的web工程。)
url地址如何定位到servlet访问
当在浏览器中输入访问地址:http://localhost:8080/06_servlet/hello来访问servlet时
8080是端口号:定位tomcat
从/hello,定位到url-pattern(浏览器访问地址,最好取得规范点),请求都会由servlet-name中定义的servlet处理;然后检查mapping中的name和servlet的name是否相同,如果相同,就执行servlet中的类全名中的文件
什么是url映射?
2.(比较简单方便)直接在java文件中写注解,urlpatterns就是一个映射,你可以通过映射里面的值访问servlet。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>hello-demo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!--servlet标签是给tomcat配置servlet程序 -->
<servlet>
<!-- servlet-name是给servlet程序取的别名(一般是类名) -->
<servlet-name>ServletByhand</servlet-name>
<!-- servlet-class是程序的全类名 -->
<servlet-class>com.guigu.servlet.ServletByhand</servlet-class>
</servlet>
<servlet-mapping>
<!--servlet-name的作用是告诉服务器,配置的程序是给那个servlet程序用-->
<servlet-name>ServletByhand</servlet-name>
<!-- url-parrern是配置访问地址 -->
<!-- ‘/’代表地址‘http://ip:port/工程路径’ </br>
/hello代表http://ip:port/工程路径 /hello </br>
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
注意:
- 两个servlet-name一般都是类名
- 约定大于规则:不要乱取名,容易让人看的迷惑.
- url-pattern的取名要和程序的名称有关联,让人可以看出其中有联系
GenericServlet类:
是个抽象类,实现了servlet接口和ServletConfig接口,提供了servlet接口中除了service()外的所有方法的实现。所以如果我们用其子类时,需要重写service
javax.servlet.http是对servlet的HTTP扩展,
HttpServlet类:对servlet的扩展,使其适合HTTP协议
HttpServletRequest接口:继承ServletRequest接口,提供了针对HTTP请求的操作方法
HttpServletResponse接口:继承ServletResponse接口,提供了针对HTTP响应的方法
Servlet生命周期:
init():出生、
service():工作、
destroy():销毁
加载和实例化Servlet类,调用init(), 一旦初始化完成,容器从客户收到请求时就将调用它的service()方法,最后容器在servlet实例上调用destroy()方法销毁。
加载和实例化servlet:
对于每个servlet,web容器使用Class.forname()加载和实例化servlet。如果没定义任何构造方法,则编译器将添加默认构造方法,bing实例化成功之后,就进入生命周期。
初始化Servlet:
创建Servlet实例后,将只调用init(ServletConfig)一次,ServletConfig包含了在Web应用程序中的初始化参数。我们也可以在web容器启动时或者在第一次被访问时将servlet加载到容器中,并初始化,这就是预初始化,可以在@WebServlet注解的loadOnStartup属性或者在web.xml中的<load-on-startup>
中指定。
如果第一次被访问后,才将servlet加载到容器中,就成为延迟加载,可以加快容器的启动速度,但是如果初始化时要完成很多任务,那么第一个发送请求的客户等待时间会很长。
为客户提供服务:
初始化成功之后,用户会向容器请求访问Servlet,容器收到请求后,会根据请求中的URL找到正确的Servlet,然后创建HttpServletRequest请求对象,和HttpServletResponse对象,然后创建一个新的线程,将两个对象放进去,有多少个对象就有多少个线程,对象在线程中使用service()产生结果,将结果返回给客户浏览器,然后销毁线程。
销毁和卸载Servlet
等到其它执行Servlet的service()线程结束,容器将调用destroy()方法,释放Servlet的资源,废除之前生命周期的方法。如果Servlet实例被销毁,就会被作为垃圾回收,如果web容器关闭,Servlet也将被销毁和卸载。
小知识:
一个程序可以占用多个端口号
一个端口号只能代表一个程序
参考:https://blog.csdn.net/qq_38263562/article/details/80015082?utm_source=blogxgwz5