来自百度百科:
Servlet(Server Applet)是java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
Servlet容器主要是JavaWeb应用提供运行时环境,所以也可以称之为JavaWeb应用容器,或者Servlet/JSP容器。 Servlet容器主要负责管理Servlet、JSP的生命周期以及它们的共享数据。 目前最流行的Servlet容器软件包括: Tomcat、Jetty、Jboss 等。
Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户。
1、Servlet接口定义了Servlet与servlet容器之间的契约。这个契约是:Servlet容器将Servlet类载入内存
,并产生Servlet实例和调用它具体的方法。但是要注意的是,在一个应用程序中,每种Servlet类型只能有一个实例。
2、用户请求致使Servlet容器调用Servlet的Service()方法,并传入一个ServletRequest对象和一个ServletResponse对象。ServletRequest对象和ServletResponse对象都是由Servlet容器(例如TomCat)封装好的
,并不需要程序员去实现,程序员可以直接使用这两个对象。
3、ServletRequest中封装了当前的Http请求,因此,开发人员不必解析和操作原始的Http数据。ServletResponse表示当前用户的Http响应,程序员只需直接操作ServletResponse对象就能把响应轻松的发回给用户。
4、对于每一个应用程序,Servlet容器还会创建一个ServletContext对象
。这个对象中封装了上下文(应用程序)的环境详情。每个应用程序只有一个ServletContext。每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象。
编写一个简单的Servlet类,通过浏览器访问该Servlet程序
第一步:创建web项目web-demo
,导入Servlet依赖坐标
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
第二步:定义一个类,实现Servlet接口,并重写接口中所有方法
package com.example.web;
@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Hello Servlet~");
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
第三步:在类上使用@WebServlet注解,配置该Servlet的访问路径
@WebServlet("/demo1")
第四步:启动Tomcat,浏览器中输入URL地址访问该Servlet
http://localhost:8080/web-demo/demo1
第五步:访问后,在控制台会打印Hello Servlet~
此时servlet程序已经成功运行。
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 初始化后调用 init() 方法。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 销毁前调用 destroy() 方法。
Servlet生命周期四个过程
实例化
初始化
处理请求
服务终止
演示生命周期
package com.example.web;
@WebServlet("/demo2")
public class ServletDemo2 implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init 初始化");
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service 被调用");
}
public String getServletInfo() {
return null;
}
public void destroy() {
System.out.println("destroy 销毁中");
}
}
在浏览器中访问localhost:8080/web-demo/demo2
,最后销毁该程序
Servlet中共有五个方法,分别是init()
、service()
、destory()
、getServletInfo()
、getServletConfig()
初始化方法,在Servlet被创建时执行,只执行一次
返回由Servlet容器传给init( )方法的ServletConfig对象
提供服务方法, 每次Servlet被访问,都会调用该方法
该方法用来返回Servlet的相关信息,没有什么太大的用处,一般我们返回一个空字符串即可
销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
要想编写一个Servlet就必须要实现Servlet接口,重写接口中的五个方法。但在实际开发中,我们往往更关注的是service()
方法。
体系结构
GenericServlet抽象类
该类是对于Servlet接口的简单实现:
由于直接实现Servlet接口需要实现5个方法,但是一般我们只关注service方法,为了减少不必要的实现,使用GenericServlet对其进行简单实现。继承GenericServlet的类只需要重写需要用到的方法即可。
HttpServlet抽象类
HttpServlet抽象类是继承于GenericServlet抽象类而来的,这个类的功能主要是实现service方法的各种细节和设计。它提供了http特定的方法,如:doGet
,doPost
,doHead
,doTrace
等。我们将来开发的web项目,都是针对HTTP协议,所以我们自定义Servlet,会通过继承HttpServlet
简单实现doGet、doPost
package com.example.web;
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet ...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
}
}
http://localhost:8080/web-demo/demo3
,就能看到doGet方法被执行a.html
页面,内容如下:DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<form action="/web-demo/demo4" method="post">
<input name="username"/><input type="submit"/>
form>
body>
html>
http://localhost:8080/web-demo/a.html
,随便向表单输入个值,并提交。就能看到doPost被访问。Servlet类编写好后,要想被访问到,就需要配置其访问路径(urlPattern)
一个Servlet,多个urlPattern
@WebServlet(urlPatterns = {"/demo4","/demo5"})
在浏览器中输入http://localhost:8080/webdemo/demo4
,http://localhost:8080/web-demo/demo5
这两个地址都能访问
urlPattern配置规则
配置路径 :@WebServlet("/user/select")
访问路径 :localhost:8080/web-demo/user/select
配置路径 :@WebServlet("/user/*")
访问路径 :http://localhost:8080/web-demo/user/任意
配置路径 :@WebServlet(urlPatterns = "*.do")
访问路径 :http://localhost:8080/web-demo/任意.do
配置路径 :@WebServlet(urlPatterns = "/")
配置路径 :@WebServlet(urlPatterns = "/*")
访问路径 :http://localhost:8080/demo-web/任意
精确匹配
> 目录匹配
> 扩展名匹配
> /*
>/
通过配置web.xml 访问路径
对于XML的配置步骤有两步:
第一步:编写Servlet类
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("web 配置");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
第二步:在web.xml中配置该Servlet
<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-name>demo4servlet-name>
<servlet-class>com.example.web.ServletDemo4servlet-class>
servlet>
<servlet-mapping>
<servlet-name>demo4servlet-name>
<url-pattern>/demo4url-pattern>
servlet-mapping>
web-app>
参考博客:
一、Java Web(一) Servlet详解!! - 有梦想的老王 - 博客园 (cnblogs.com)
二、黑马程序员最新版JavaWeb基础教程,Java web从入门到企业实战完整版_哔哩哔哩_bilibili
结语:
此篇文章为个人学习笔记,如有错误地方,欢迎大佬指出!!!