目录
什么是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结构
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依赖
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.36</version>
</dependency>
</dependencies>
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();
- 得到字节流,向客户端 输出二进制数据