JavaWeb开发之详解Servlet及Servlet容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 自JavaEE诞生伊始,Servlet容器和Servlet技术,就构成了JavaEE应用的核心,配合其它组件,它们完善了Java企业级开发的全套解决方案。小到一个静态博客网站,大到分布式的集群应用,都离不开Servlet底层的支持。

自JavaEE诞生伊始,Servlet容器和Servlet技术,就构成了JavaEE应用的核心,配合其它组件,它们完善了Java企业级开发的全套解决方案。小到一个静态博客网站,大到分布式的集群应用,都离不开Servlet底层的支持。大约从Java 5开始,Java企业级开发就分为了两个不同的方向,一个是基于EJB、JSF、JPA等为主的传统Java企业级系统开发方案,另一套则是基于Struts、Hibernate、Spring、Spring MVC、MyBatis等为主JavaWeb开发模式。时至今日,移动互联网的蓬勃发展下,产生了一大批的电商、新零售、在线游戏、社交网站等各式应用。JavaWeb在时代洪流中反而得到越来越大的发展:分布式、集群、中间件、大数据……给Java带来了蓬勃生机。

而这些互联网应用的基础,都有Servlet的影子。那么Servlet到底是什么???

在StackOverflow上就有这么个问题,题主搞了很久都搞不明白Servlet到底是什么,希望有人能用浅显直白的语言一语中的地回答他。排名第一的高票答案是这么说的:

A servlet is simply a class which responds to a particular type of network request - most commonly an HTTP request. Basically servlets are usually used to implement web applications - but there are also various frameworks which operate on top of servlets (e.g. Struts) to give a higher-level abstraction than the "here's an HTTP request, write to this HTTP response" level which servlets provide.

Servlets run in a servlet container which handles the networking side (e.g. parsing an HTTP request, connection handling etc). One of the best-known open source servlet containers is Tomcat.

粗鲁翻译一下就是:Servlet说白了就是一个处理网络请求(很多时候是Http请求)的类,用于实现Web应用的。另外也有很多的框架比如Struts是以它为底子,搭建了一个更高抽象(的解决方案),而不是让你挽起袖子直接干“HTTP请求来了,快给回复”这种层级的粗活。Servlet是运行在处理网络请求的Servlet容器中的,比如最知名的Tomcat。

Web应用概述

JavaWeb规范

JavaWeb应用因为是容器式开发,因此会有一个模板规范,一个基本Web应用的架势是:

<WebDemo>   //这是Web应用的名称

|---WEB-INF  //此文件夹对外不可见

|    |---web.xml  //web应用配置文件(Servlet3.0可不要,但建议保留)

|    |---classes   //保存*.class文件

|    |---lib     //保存jar包

|---<a. jsp> 保存jsp文件等  

web.xml

1. 配置和管理Servlet、Listener、Filter、JSP、JSP属性、标签库

2. Web应用首页、资源引用、JAAS授权引用、metadata-complete(选true表示不加载注解资源)

Servlet

Servlet开发

Servlet,说白了就是个Java的类。曾几何时,Servlet甚至被用来写Web界面,所有的HTML标签,都采用类似out.write("<head>\r\n")这种形式,繁琐可想而知。自MVC架构规范以后,Servlet就专注于做控制层了。

Servlet的作用就是处理网络请求。开发Servlet需继承HttpServlet,并通过以下方法处理请求:

doGet:响应Get请求

doPOST:响应POST请求

doPut:响应Put请求

doDelete:响应delete请求

init:创建Servlet实例时,初始化Servlet资源(一般不使用,需要初始化的时候,第一行调用super.init())

destory:销毁Servlet实例时,自动回收资源(一般不使用,除非需要手动回收资源如数据库连接)

开发步骤

1. 编写Servlet类

2. 配置

2.1 Servlet3.0新增的@WebServlet配置

2.2 web.xml文件配置

Servlet/JSP生命周期

1. 创建:单例模式,只创建并初始化一个Servlet实例

  • 客户端第一次请求某个Servlet时,Web容器创建该Servlet实例。
  • Web应用启动时立即创建,即load-on-startup Servlet。这种Servlet一般是提供基础服务的后台Servlet。

2. 初始化:Web容器调用Servlet的init方法初始化

3. 响应请求:初始化后,将一直在容器中,响应客户请求

4. 销毁:Web容器决定销毁Servlet,会调用destroy方法。通常是关闭Web应用时销毁

注意:Servlet容器中对同一个Servlet类,只会创建和初始化其实例一次,为单例。容器会维护一个线程池,对每一个请求提供一个工作线程去处理。如果请求过多达到线程池峰值,则请求会被放入一个队列,等待可用线程。

Servlet本身是线程不安全的,因此不建议设置成员变量或类变量,而使用局部变量避免线程问题。

Servlet参数配置

可以用在比如配置数据库连接参数的场景,实现多个Servlet之间的可重用。

1. 配置

  • 通过@WebServlet的initParams属性指定
  • 通过web.xml的<servlet>元素中添加<init-params>子元素

2. 访问

通过ServletConfig对象的getInitParameter(String name)访问。

注意区分ServletContext,两者方法相同,但ServletConfig是当前Servlet的配置参数;ServletContext是获取当前Web应用的配置参数。

ServletContext和HTTPSession由于是多个Servlet中共享信息,因此也是线程不安全的。

MVC中Servlet作为Controller的角色

JSP-Servlet-JavaBean的第一代MVC架构

在遥远的古代,曾经使用Servlet作为页面视图解决方案,开发难度可想而知。因此,在第一代的MVC方案里,使用JSP做V,JavaBean做M和Servlet作为Controller的方案应运而生。

一个充斥于各种学生管理系统的典型使用场景是:

  • 手机用户请求参数
  • 将应用的处理结果返回

JSP

JSP的本质就是Servlet,处理用户请时会被翻译为Servlet被Web容器执行。Servlet与JSP区别是:

1. 没有内置对象,JSP中的内置对象需要显示创建、

2. 对于静态页面标签,都要使用页面输出流逐行输出。

JSP由静态HTML页面内容和动态JSP脚本两部分组成

四种基本语法

  1. 注释:<%-- JSP注释 --%>
  2. 声明:<%! 声明部分 %>
  3. 表达式:<%=表达式%>
  4. 脚本

3个编译指令

JSP编译指令是通知JSP的消息,不直接输出。包括

  1. page:针对当前页面的指令。如声明JSP脚本种类、继承的父类、导包、是否开启HTTPSession、错误页面、网页文件格式和字符编码等。
  2. include:指定包含另一个页面。既包括静态文本,也包括动态JSP页面。此指令融合被include的页面
  3. taglib:用于定义和访问自定义标签。

7个动作指令

编译指令是通知Servlet引擎的消息,在JSP编译成Servlet时起作用;动作指令则可替换成JSP脚本,是JSP脚本的标准化写法

  1. jsp:forward:执行页面转向,将请求处理转发到下个页面
  2. jsp:param:传递参数,与include、forward、plugin指令合用
  3. jsp:include:动态引入JSP页面
  4. jsp:plugin:下载JavaBean或Applet到客户端执行
  5. jsp:useBean:创建一个JavaBean实例
  6. jsp:setProperty:设置JavaBean实例的属性值
  7. jsp:getProperty :输出JavaBean实例的属性值

9个内置对象

这9个内置对象其实都是Servlet接口的实例,在JSP的使用中被默认初始化,可以直接使用。

  • application:ServletContext的实例,代表应用本身,可用于多个JSP和Servlet之间传递信息。
  • config:ServletConfig的实例,代表该JSP的配置信息。JSP中比较少用,常用于Servlet
  • exception:Throwable的实例,只有本页面是错误处理页面时,才能使用。
  • out:JspWriter的实例,表示页面输出流。
  • page:代表页面本身,相当于Servlet的this,没什么用。
  • pageContext:PageContext,代表页面上下文,有方法getServletContext()和getServletConfig()
  • request:HttpServletRequest的实例,表示一次请求
  • response:HttpServletResponse的实例,表示一次回复。通常很少使用该对象直接响应,而是使用out。常用于重定向
  • session:HttpSession实例,代表一次会话(开始于客户端与服务器连接,终止于关闭浏览器)

JSP2的自定义标签

1. 开发自定义标签类

  • 继承SimpleTapSupport父类
  • 重写doTag()方法
  • 如果有成员变量,需要getter和setter方法

2. 建立TLD文件

3. 使用标签库

<% taglib uri="tagliburi" prefix="tagPrefix" %>

Filter

Filter是Servlet的加强版,用于对用户请求进行预处理或后处理。一个典型的应用场景是:Filter对用户请求进行预处理,接着交给Servlet进行处理并响应,最后Filter再进行后处理。

预处理:拦截和检查HttpServletRequest,可以修改请求头和数据

后处理:拦截和检查HttpServletResponse,可以修改响应头和数据

Filter常用于检查用户请求、过滤非法请求、日志记录、请求解码、处理XML等 

Filter也被用于实现网站的伪静态,以优化SEO。

开发过滤器

1. 创建Filter类:实现Filter接口,重写init、destory和doFilter(ServletRequest request, ServeletResponse response, FilterChain chain)方法

2. 配置

Listener

使用监听器

1. 定义Listener实现类

2. 配置

 

目录
相关文章
|
6天前
|
缓存 监控 开发者
掌握Docker容器化技术:提升开发效率的利器
在现代软件开发中,Docker容器化技术成为提升开发效率和应用部署灵活性的重要工具。本文介绍Docker的基本概念,并分享Dockerfile最佳实践、容器网络配置、环境变量和秘密管理、容器监控与日志管理、Docker Compose以及CI/CD集成等技巧,帮助开发者更高效地利用Docker。
|
1月前
|
网络安全 Docker 容器
VScode远程服务器之远程 远程容器 进行开发(五)
VScode远程服务器之远程 远程容器 进行开发(五)
27 1
|
1月前
|
存储 持续交付 开发者
掌握Docker容器化:提升开发效率与应用部署
【10月更文挑战第4天】在现代软件开发中,Docker容器化技术因其轻量级、可移植和快速部署的特点,成为提升开发效率和简化部署流程的关键工具。本文介绍了Docker的基本概念、核心组件及其优势,并探讨了如何在开发环境中搭建、微服务架构及CI/CD流程中有效利用Docker,助力软件开发更加高效便捷。
|
2月前
|
持续交付 开发者 Docker
掌握 Docker:容器化技术在现代开发中的应用
Docker 是一个开源容器化平台,使开发者能够将应用程序及其依赖项封装在轻量级容器中,确保跨平台的一致性。本文介绍了 Docker 的基本概念、核心组件及优势,并展示了其在快速部署、一致性、可移植性和微服务架构中的应用。通过示例说明了 Docker 在本地开发环境搭建、服务依赖管理和 CI/CD 流程中的作用,以及多阶段构建、资源限制和网络模式等高级特性。掌握 Docker 可大幅提升开发效率和应用管理能力。
|
2月前
|
Java 应用服务中间件 Maven
JavaWeb基础5——HTTP,Tomcat&Servlet
JavaWeb技术栈、HTTP、get和post区别、响应状态码、请求响应格数据式、IDEA使用Tomcat、报错解决、Servlet的体系结构、IDEA使用模板创建Servlet
JavaWeb基础5——HTTP,Tomcat&Servlet
|
3月前
|
机器学习/深度学习 Kubernetes Docker
机器学习开发的灵药:Docker容器
机器学习开发的灵药:Docker容器
|
3月前
|
运维 Kubernetes 监控
|
3月前
|
容器 C# Docker
WPF与容器技术的碰撞:手把手教你Docker化WPF应用,实现跨环境一致性的开发与部署
【8月更文挑战第31天】容器技术简化了软件开发、测试和部署流程,尤其对Windows Presentation Foundation(WPF)应用程序而言,利用Docker能显著提升其可移植性和可维护性。本文通过具体示例代码,详细介绍了如何将WPF应用Docker化的过程,包括创建Dockerfile及构建和运行Docker镜像的步骤。借助容器技术,WPF应用能在任何支持Docker的环境下一致运行,极大地提升了开发效率和部署灵活性。
119 0
|
3月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
29 0
|
3月前
|
移动开发 小程序 前端开发
跨端技术演进问题之Web容器方案在跨端开发中的优势和不足如何解决
跨端技术演进问题之Web容器方案在跨端开发中的优势和不足如何解决