Servlet(java web基础篇)

Servlet(java web基础篇)

Servlet是Java提供的一门动态web资源开发技术,不同的用户访问看到的效果不一样。Servlet是lavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet:接口,并由web服务器运行Servlet。

快速入门

创建web项目,导入Servlet依赖坐标
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><!--依赖范围--><scope>provided</scope>
</dependency>
创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话
public class ServletDemo1 implements Servlet{public void service(...){System.out.println("hello servlet~")}
}
配置:在类上使用@WebServlet注解,配置该Servlet的访问路径
@WebServlet("/demo1")
public class ServletDemo1 implements Servlet{}
访问:启动Tomcat,浏览器输入URL访问该Servlet
http://localhost:8080/web-demo/demo1

Servlet执行流程

在上面的流程中,我们只实现了类,但没有实例化对象,但在输入URL时,我们能够打印输出,因此对于Servlet执行流程进行学习时必要的。

http://localhost:8080  可以访问到Tomcat服务器
/web-demo				可以访问到项目
/demo1					可以访问到资源Servlet
Web服务器创建Servlet对象,并调用了Servlet()方法 和 Service()方法

Servlet生命周期

对象的生命周期指一个对象从被创建到被销毁的整个过程。
Servlet)运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:

  • 加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet)对象

    @WebServlet(urlPatterns ="/demo",loadOnStartup=1)
    
    • 负整数:第一次被访问时创建Servlet对象
    • 0或正整数:服务器启动时创建Servlet)对象,数字越小优先级越高
  • 初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次

  • 请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理。

  • 服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy(方法(只调用一次)完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被 Java 的垃圾收集器所回收

// 获取ServletConfig对象  通过设置全局变量,来保留init方法中的config,用来返回tConfig
ServletConfig getServletConfig()
// 获取Servlet信息 返回作者、版本以及版权信息
String getServletInfo()

Servlet体系结构

Servlet(Servlet体系根接口) <- GenericServlet(Servlet抽象实现类) <- HttpServlet(HTTP协议封装的Servlet实现类)
//所以接下来自定义Servlet,会继承HttpServlet,重写doGet方法 Get 请求方式处理逻辑   doPost方法  Post 请求方式处理逻辑
package javax.servlet.http;import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;public abstract class HttpServlet extends GenericServlet implements java.io.Serializable {// ... 其他成员变量和方法@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {HttpServletRequest request;HttpServletResponse response;// 检查请求和响应是否是HttpServletRequest和HttpServletResponse的实例try {request = (HttpServletRequest) req;response = (HttpServletResponse) res;} catch (ClassCastException e) {throw new ServletException("Non-HTTP request or response");}// 根据请求方法调用相应的处理方法String method = request.getMethod();if (method.equals("GET")) {doGet(request, response);} else if (method.equals("POST")) {doPost(request, response);} else if (method.equals("PUT")) {doPut(request, response);} else if (method.equals("DELETE")) {doDelete(request, response);} else {// 其他HTTP方法的处理// ...}}// ... 其他方法,如doGet、doPost等@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 处理HTTP GET请求response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<html><body>");out.println("<h2>Hello, this is my custom HttpServlet for GET!</h2>");out.println("</body></html>");}@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 处理HTTP POST请求response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<html><body>");out.println("<h2>Hello, this is my custom HttpServlet for POST!</h2>");out.println("</body></html>");}// ... 其他实现和逻辑}

相对于普通的ServletHttpServlet的好处包括:

  1. 专注于HTTP协议: HttpServlet是专门设计用来处理HTTP请求和响应的,它在Servlet的基础上提供了更高层次的抽象,让开发者更容易处理HTTP协议相关的内容。
  2. 提供更简洁的API: HttpServlet提供了一系列的方法,如doGetdoPostdoPut等,方便开发者根据不同的HTTP请求类型编写相应的业务逻辑。
  3. 易于扩展: 开发者可以继承HttpServlet并覆盖相应的方法,轻松扩展和定制自己的HTTP处理逻辑,而无需处理HTTP协议的底层细节。
  4. 提供请求参数解析: HttpServlet提供了方便的方法来获取HTTP请求中的参数,简化了参数解析的流程。
  5. 支持Session管理: HttpServlet提供了对HTTP Session的支持,方便开发者在Web应用中管理用户的状态信息。

在实际开发中,特别是在Java EE或Spring等框架中,通常会优先使用HttpServlet,因为它提供了更高级别、更方便的API,使得开发者能够更轻松地处理HTTP请求和构建Web应用。

Servlet urlPattern配置

Servlet要想被访问,必须配置其访问路径(urlPattern)

  • 一个Servlet,可以配置多个urlPattern

    @WebServlet(urlPatterns {"/demo1","/demo2"})
    
  • urlPattern配置规则

    • 精确匹配

      • 配置路径

        @WebServlet("/user/select")
        
      • 访问路径

        localhost:8080/web-demo/user/select
        
    • 目录匹配(精确匹配要大于目录匹配)

      • 配置路径

        @WebServlet("/user/*")
        
      • 访问路径

        localhost:8080/web-demo/user/aaa
        localhost:8080/web-demo/user/bbb
        
    • 扩展名匹配(目录路径 > 扩展名路径)

      • 配置路径

        @WebServlet("*.do")
        
      • 访问路径

        localhost:8080/web-demo/aaa.do
        localhost:8080/web-demo/bbb.do
        
    • 任意匹配

      • 配置路径

        @WebServlet("/")
        @WebServlet("/*")
        /***
        /和/*区别:当我们的项目中的Servlet配置了"/",会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet当我们的项目中配置了“/*”,意味着匹配任意访问路径
        ***/
        
      • 访问路径

        localhost:8080/web-demo/hehe
        localhost:8080/web-demo/haha
        

XML配置方式编写Servlet

Servlet从3.0版本后开始支持使用注解配置,3.0版本前只支持XML配置文件的配置方式。

  • 步骤:

    • 编写Servlet类

    • 在web.xml中配置该Servlet

      <!--servlet 全类名-->
      <servlet><servlet-name>demo5</servlet-name><servlet-class>com.web.servlet.ServletDemo5</servlet-class>
      </servlet>
      <!--servlet 访问路径-->
      <servlet-mapping><servlet-name>demo5</servlet-name><url-pattern>/demo5</url-pattern>
      </servlet-mapping>
      

如果觉得文章对您有帮助,请帮忙点赞或者收藏,如果在文章中发现什么错误或不准确的地方,欢迎与我交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TorchVision的使用方法、更改默认路径

TorchVision的使用 1. 转换和增强图像 torchvision.transforms.v2 参数作用Resize将输入调整为给定大小RandomShortestSize随机调整输入的大小RandomResize随机调整输入的大小RandomCrop在随机位置裁剪输入RandomResizedCrop裁剪输入的随机部分并将其调整为给定大小RandomIoU…

Java生成微信小程序二维码的方式有哪些?

大家好我是咕噜美乐蒂&#xff0c;很高兴又见面啦&#xff01;今天我们来谈一下如何使用Java生成微信小程序二维码&#xff0c;有哪些方式方法呢&#xff1f; 生成微信小程序二维码是开发微信小程序时的常见需求之一。在Java中&#xff0c;我们可以使用多种方式来生成微信小程…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-11-playwright操作iframe-上篇

1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了&#xff0c;因为前边的窗口切换就为这种网页处理提供了思路&#xff0c;另一个原因就是虽然iframe很强大&#xff0c;但是现在很少有网站用它了。但是还是有小伙伴或者童鞋们私下问这个问题&#xff0c;那么宏哥就…

【后端开发】正向代理与反向代理

正向代理 正向代理&#xff08;forward proxy&#xff09;&#xff1a;是一个位于客户端和目标服务器之间的服务器(代理服务器)&#xff0c;为了从目标服务器取得内容&#xff0c;客户端向代理服务器发送一个请求并指定目标&#xff0c;然后代理服务器向目标服务器转交请求并将…

【日志记录】——主MCU 通过私有协议更新从MCU程序固件

一&#xff1a;需求分析 在一些系统较为复杂的嵌入式设备中&#xff0c;往往不止一片MCU或者处理模块&#xff0c;通常为一片主MCU负责应用逻辑处理和对外网络通信&#xff0c;其他从MCU负责实时采集处理高频数据&#xff0c;在设备运营过程中&#xff0c;往往伴随新需求或者bu…

动态内容推荐系统PHP代码

这个系统旨在根据用户行为和偏好&#xff0c;动态地向用户推荐内容。这样的系统可以应用于新闻网站、社交媒体平台、电子商务网站等多种场景&#xff0c;以提升用户体验和参与度。 ### 功能概述 系统将基于用户的浏览历史、点击行为和时间花费等数据来评估用户的兴趣点&#…

BUUCTF-Real-[ThinkPHP]2-Rce1

任意代码执行漏洞 ThinkPHP 2.x版本中&#xff0c;使用preg_replace的/e模式匹配路由&#xff1a; $res preg_replace((\w).$depr.([^.$depr.\/])e, $var[\\\1\]"\\2";, implode($depr,$paths)); 导致用户的输入参数被插入双引号中执行&#xff0c;造成任意代码执行…

Open CASCADE学习|拓扑变换

目录 平移变换 旋转变换 组合变换 通用变换 平移变换 TopoDS_Shape out;gp_Trsf theTransformation;gp_Vec theVectorOfTranslation(0., 0.125 / 2, 0.);theTransformation.SetTranslation(theVectorOfTranslation);BRepBuilderAPI_Transform myBRepTransformation(out, th…

go 中的范型

泛型是随着Go 1.18版本发布的。它基本上意味着参数化的类型&#xff0c;也就是说&#xff0c;它允许程序员在写代码时&#xff0c;类型可以稍后指定&#xff0c;因为类型在当时并不相关。换句话说&#xff0c;在编写一些代码时&#xff0c;你不提供数值的类型。这些类型的值会在…

Leetcode刷题笔记题解(C++):36. 有效的数独

思路一&#xff1a;暴力破解&#xff0c;两个二维数组记录行、列对应的数字出现的次数&#xff0c;比如rows[i][index]表示的数字index在i行出现的次数&#xff0c;三维数组记录每个块中对应数字出现的次数&#xff0c;比如boxes[i/3][j/3][index]表示的数字index在[i/3][j/3]个…

校园墙表白墙系统uniapp微信小程序

配置文件 (自动编号、配置参数名称、配置参数值)&#xff1b; 前端开发:vue 语言&#xff1a;javapythonnodejsphp均支持 运行软件:idea/eclipse/vscode/pycharm/wamp均支持 框架支持:Ssm/django/flask/thinkphp/springboot/springcloud均支持 数据库 mysql 数据库工具&#x…

定时器 Timer(超详细模拟实现)

目录 一、定时器 1.定时器概述 2.Java标准库提供的定时器类 3.定时器代码样例 二、实现 1.实现思路 2.代码实现 2.1纯享版 2.2注释版 3.代码解析(超详细) 3.1描述类MyTimerTask ①构造&#xff1a;MyTimerTask&#xff08;Runnable runnable, long delay&#xff…

如何使用本地私有NuGet服务器

写在前面 上一篇介绍了如何在本地搭建一个NuGet服务器&#xff0c; 本文将介绍如何使用本地私有NuGet服务器。 操作步骤 1.新建一个.Net类库项目 2.打包类库 操作后会生成一个.nupkg文件&#xff0c;当然也可以用dotnet pack命令来执行打包。 3.推送至本地NuGet服务器 打开命…

vue3 封装WebSocket(直接复制)

创建文件WebSocket.js 只有基本的功能 import { ref } from vue; import store from "/store";export default function useWebSocket(url) {const messagesData ref([]);// 创建WebSocket连接和相关方法const socket new WebSocket(url);socket.onopen () >…

《计算机网络简易速速上手小册》第6章:网络性能优化(2024 最新版)

文章目录 6.1 带宽管理与 QoS - 让你的网络不再拥堵6.1.1 基础知识6.1.2 重点案例&#xff1a;提高远程办公的视频会议质量实现步骤环境准备Python 脚本示例注意事项 6.1.3 拓展案例1&#xff1a;智能家居系统的网络优化实现思路Python 脚本示例 6.1.4 拓展案例2&#xff1a;提…

计算机网络_1.5 计算机网络的性能指标

1.5 计算机网络的性能指标 一、总览二、常用的八个计算机网络性能指标1、速率&#xff08;1&#xff09;数据量&#xff08;2&#xff09;速率&#xff08;3&#xff09;数据量与速率中K、M、G、T的数值辨析&#xff08;4&#xff09;【练习1】计算发送数据块的所需时间 2、带宽…

Unity引擎学习笔记之【角色动画器操作】

角色动画Character Animation 一、使用方法 1. 添加一个静态的角色模型&#xff0c;并确保这个角色模型绑定了Avatar 2. 创建一个动画器控制器 Animator Controller 3. 将动画器控制器拖动添加到Player的Animator控制器上 4. 双击即可打开控制器 5. 将带有动画的预设&#xf…

docker下nacos(1.2.0)的持久化

一、创建数据库 运行以下代码自动创建数据库和表 CREATE DATABASE IF NOT EXISTS nacos_config /*!40100 DEFAULT CHARACTER SET utf8 */; USE nacos_config;SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for config_…

[Python] 如何在控制台进行输入输出

可莉今天带你来学习Python基础中在控制台的输入输出~ 接下来跟着可莉来学习吧~ 可莉将这篇博客收录在了&#xff1a;《Python》 可莉推荐的博主主页&#xff1a;Keven ’ s blog 目录 通过控制台输出 格式化输出 通过控制台输入 总结 通过控制台输出 我们通过print函数可以…

[VulnHub靶机渗透] WestWild 1.1

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…