Servlet详解(从xml到注解)

文章目录

  • 概述
    • 介绍
    • 作用
  • 快速入门
  • Servelt的执行原理
    • 执行流程:
    • 执行原理
  • 生命周期
    • 概述
    • API
  • 服务器启动,立刻加载Servlet对象(理解)
  • 实现Servlet方式(三种)
    • 实现Servlet接口
    • 实现GenericServlet抽象类,只重写service方法
    • 实现HttpServlet实现类
    • 实现HttpServlet实现类的原理
  • 编写servlet常见问题
    • 遇到500
    • 遇到404
    • 遇到405
    • 启动服务器错误
  • Servlet基本的映射路径
  • Servlet映射路径配置规范
    • 完全路径匹配
    • 目录匹配
    • 后缀名匹配
    • 缺省路径
  • 绝对路径
    • 写法
    • 代码实现
  • 相对路径
  • Servlet3.0注解开发
    • 问题
    • 解决问题
    • 配置步骤
    • 实现
  • 修改idea创建注解的servlet模板
  • 关于web3.0注解开发的属性

概述

介绍

  1. servlet是一个接口,即规范
  2. 定义的实现类必须实现接口中的所有的抽象方法
  3. Servlet全称Server Applet,服务器端的程序。是sun公司提供的一套规范,用来处理客户端请求,响应给浏览器的动态web资源。其实servlet的实质就是java代码,通过java的API动态的向客户端输出内容,并且从客户端接受数据
  4. 一个类要想通过浏览器被访问到,那么这个类就必须直接或间接的实现Servlet接口

作用

  1. 接受客户端的请求
  2. 处理业务逻辑
  3. 响应给浏览器端

Snipaste_2024-04-30_19-20-04.png

快速入门

  1. 创建web项目
  2. 导入servlet依赖
 <dependencies><!--导入servlet依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version></dependency></dependencies>
  1. 在创建的web项目中自定义类实现Servlet接口
  2. 在自定义类中实现Servlet接口中的抽象方法
  3. 在实现Servlet接口的service方法中书写处理业务逻辑(可以先输出一句话)
  4. 在web项目的核心配置文件web.xml中配置访问servlet的路径
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><!--5.在web项目的核心配置文件web.xml中配置访问servlet的路径。说明:这样配置是告知tomcat有具体的Servlet类需要被访问。--><!--1.<servlet> 表示将当前Servlet类注册到tomcat中,告知tomcat有一个类要被访问--><servlet><!--表示当前要被访问类的标识,在当前web.xml中要唯一,helloWorldServlet属于标识符--><servlet-name>helloWorldServlet</servlet-name><!--配置要访问 的servlet类,必须是类的全路径:包名.类名。说明:tomcat底层通过获取这里的类全路径使用反射技术调用当前类的无参构造方法创建对象--><servlet-class>com.itheima.sh.a_demo_01.HelloWorldServlet</servlet-class></servlet><!--配置要访问的servlet类的映射路径--><servlet-mapping><!--这里要和上面的servlet-name文本值一致,这里找到上面的servlet-name--><servlet-name>helloWorldServlet</servlet-name><!--浏览器上地址栏上输入的映射路径及访问路径,这里必须加/--><url-pattern>/hello</url-pattern></servlet-mapping>
</web-app>
  1. 启动tomact
  2. 在浏览器中访问servlet类

Snipaste_2024-04-30_19-38-54.png

Servelt的执行原理

执行流程:

Snipaste_2024-04-30_20-03-03.png

执行原理

  1. 当我们点击run时,tomact之所以会启动,是因为程序入口(main方法)在tomact中
  2. tomact开始运行,会加载web项目里面的配置文件web.xml(xml解析,读取数据)
    1. 主要是根据url-pattern找到对应的servlet-class
  3. 然后tomact进入等待状态(永不停止,除非手动关闭)
  4. 当用户在浏览器中输入地址:http://localhost:8080/hello就会定位到tomact的访问的项目下面的某个servlet中
  5. tomact会根据 /hello的servlet的虚拟路径找到HelloServlet的全限定名
  6. tomcat底层通过反射创建HelloServlet的对象,并调用HelloServlet的service方法
Class clazz = Class.forName("全限定名");
Servlet servlet = clazz.newInstance();//实际上HelloServlet对象,向上转型
servlet.service();

生命周期

概述

指的是一个对象从生(创建)到死(销毁)的一个过程

API

  1. 谁创建servlet对象:tomact调用反射技术创建对象
  2. 何时创建对象:第一次访问Servlet类的时候创建Servlet对象,调用无参构造方法创建对象,使用对象立刻调用init方法进行初始化(init)

init方法只会执行一次,然后调用service方法处理业务逻辑

  1. 创建对象之后每次访问servlet类的时候只会执行service方法
  2. 关闭tomact服务器时,关闭之前使用servlet类的对象调用destory方法销毁资源

Snipaste_2024-04-30_20-30-02.png

服务器启动,立刻加载Servlet对象(理解)

项目中的web.xml

<!--配置Servlet--><servlet><servlet-name>LifeDemo01Servlet</servlet-name><servlet-class>com.itheima.sh.b_servlet_02.LifeDemo01Servlet</servlet-class><!-- 服务器启动创建Servlet类的对象,默认值是-1表示第一次访问创建对象,如果文本值大于等于0,表示tomcat启动创建对象如果多个servlet都配置了该标签,那么文本值越小创建Servlet的优先级越高--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>LifeDemo01Servlet</servlet-name><url-pattern>/life01</url-pattern></servlet-mapping>

实现Servlet方式(三种)

Snipaste_2024-04-30_19-28-22.png

实现Servlet接口

就是快速入门那个案例

实现GenericServlet抽象类,只重写service方法

间接实现Servlet接口

实现HttpServlet实现类

重写doGet()方法和doPost()方法 ctrl+O

实现HttpServlet实现类的原理

image-20221207165520172.png
注意:查看某个类的成员结构快捷键:alt+7
结构图:ctrl+alt+U

编写servlet常见问题

遇到500

表示服务器内部异常

遇到404

浏览器客户端访问服务器的资源不存在,基本都是路径有问题
:报404的根本原因就是用户操作不当导致的,比如:url路径输入错误
解决

  • 修改访问地址
  • 在服务器创建资源
  • maven点击clean清除target,然后重新部署

遇到405

服务器servlet没有重写doGet或者doPost方法

启动服务器错误

:只要启动服务器报错基本就是你的路径有问题,路径没有书写/

Servlet基本的映射路径

一个Servlet类映射多个路径
Snipaste_2024-04-30_21-42-54.png

Servlet映射路径配置规范

完全路径匹配

就是访问什么在web.xml中配置什么路径
/hello

目录匹配

/user/*
只要访问以/user开始的路径都可以访问

后缀名匹配

.do,.action 注意这里不能书写/
访问以.do或者.action结尾的资源路径,后缀名都属于标识符

缺省路径

/
如果上述三种路径都不满足就访问缺省路径
上述访问路径的优先级
完全路径匹配>目录匹配>后缀名匹配>缺省路径

绝对路径

写法

  1. 带网络的三要素
    1. http://ip地址:端口号/资源路径
  2. 不带网络的三要素
    1. /资源路径 这个的/不能省略,要求访问的资源必须在同一哥服务器上

代码实现

html:

<a href="http://127.0.0.1:8080/pathAbso">带网络三要素的绝对路径</a><br>
<a href="/pathAbso">不带网络三要素的绝对路径</a><br>

web.xml:

<servlet><servlet-name>pathAbso01Servlet</servlet-name><servlet-class>com.itheima.sh.a_servlet_01.PathAbso01Servlet</servlet-class></servlet><servlet-mapping><servlet-name>pathAbso01Servlet</servlet-name><url-pattern>/pathAbso</url-pattern></servlet-mapping>

相对路径

不是相对当前项目,而是针对当前浏览器地址栏上的url而言的
案例一:
Snipaste_2024-05-02_10-52-26.png

 #假设我们在浏览器地址栏访问的页面路径: http://localhost:8080/demo01.html#而在demo01.html页面想使用相对路径访问servlet: http://localhost:8080/pathAbso说明:如果在http://localhost:8080/demo01.html 页面中访问 http://localhost:8080/pathAbso 该servlet,我们通过url		  观察发现只有最后一级目录不一样,所以在demo01.html页面中相对的路径的写法是:./pathAbso  这里的./表示当前路径可以省略不写即直接写 pathAbsodemo01.html:<a href="./pathAbso">相对路径</a><br><a href="pathAbso">相对路径</a><br>

案例二:
Snipaste_2024-05-02_10-53-10.png

 # 如果在http://localhost:8080/aaa/demo02.html 页面中访问 http://localhost:8080/pathAbso 该servlet我们通过url观察发现在demo02.html也面中书写访问的servlet即pathAbso和当前页面的父目录aaa是同等目录,所以我这里先找该页面的父目录,然后在找该servlet即pathAbso ../pathAbso    ../表示上一级目录或者父目录,找到父目录之后再找servlet即pathAbso
demo02.html:<a href="../pathAbso">相对路径</a><br>

Servlet3.0注解开发

问题

之前我们都是使用web.xml进行servlet映射路径的配置。这样配置的弊端:web.xml中具有非常多个配置信息,显得非常臃肿并且容易出错,冗余

解决问题

使用web.xml配置映射路径的方式属于servlet2.5的技术,从serclet3.0开始引入注解配置访问servlet取代了web.xml配置

   <!--  TODO:想使用注解开发导入的Servlet依赖必须是3.0以上的      --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency>

配置步骤

  1. 在包右键–new–servlet
  2. 输入类名
  3. 在方法体内输入逻辑代码
  4. 在浏览器地址栏中输入访问路径

实现

  1. 创建

Snipaste_2024-05-02_11-29-16.png

  1. 输入类名

Snipaste_2024-05-02_11-29-35.png

  1. 类中逻辑代码
package com.itheima.sh.c_servlet_anno_03;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/annoDemo01Servlet")
public class AnnoDemo01Servlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("注解开发");}
}
  1. 在浏览器地址栏输入访问的路径:

Snipaste_2024-05-02_11-30-51.png

修改idea创建注解的servlet模板

  1. File–settings
  2. 找到servlet的模板,按照下面修改

Snipaste_2024-05-02_11-32-58.png

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebServlet("/${Entity_Name}")
public class ${Class_Name} extends javax.servlet.http.HttpServlet {protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {doGet(request,response);
}protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {}
}

关于web3.0注解开发的属性

Snipaste_2024-05-02_11-34-13.png

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

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

相关文章

蓝桥杯-路径之谜

题目描述 小明冒充X星球的骑士&#xff0c;进入了一个奇怪的城堡。城堡里面什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡的地面时n*n个方格。如下图所示。 按习俗&#xff0c;骑士要从西北角走到东南角。可以横向或者纵向移动&#xff0c;但是不能斜着走&#x…

整数的表示和运算

目录 无符号整数 有符号整数 原码表示 原码的缺点 原码-->反码-->补码的转换 原码,补码快速转换技巧(手算) 补码的加法计算 补码的减法计算 总结 无符号整数 无符号整数,即"自然数",0,1,2,3,4,.... C语言中的无符号整数: unsigned short a 1; //无符…

Spark Stream

一、Spark Streaming是什么 Spark Streaming 用于流式数据的处理。Spark Streaming 支持的数据输入源很多&#xff0c;例如&#xff1a;Kafka、Flume、Twitter、ZeroMQ 和简单的 TCP 套接字等等。数据输入后可以用 Spark 的高度抽象原语如&#xff1a;map、reduce、join、wind…

C++ | Leetcode C++题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; class Solution { public:string addBinary(string a, string b) {string ans;reverse(a.begin(), a.end());reverse(b.begin(), b.end());int n max(a.size(), b.size()), carry 0;for (size_t i 0; i < n; i) {carry i < a.siz…

算法学习系列(五十五):背包模型(三)

目录 引言一、潜水员二、背包问题求具体方案三、机器分配四、开心的今明五、金明的预算方案 引言 今天介绍的是背包模型&#xff0c;还是以题目的形式来介绍的。主要讲了背包问题求方案&#xff0c;就是由最优方案递推回去即可。还有就是一些比较经典的背包问题&#xff0c;其…

im即时通讯源码/仿微信app源码+php即时通讯源码带红包+客服+禁言等系统php+uniapp开发

即时通讯(IM)系统是现代互联网应用中不可或缺的一部分&#xff0c;它允许用户进行实时的文本、语音、视频交流。随着技术的发展&#xff0c;IM系统的功能越来越丰富&#xff0c;如红包、客服、禁言等。本文将探讨如何使用PHP语言开发一个功能完备的即时通讯系统&#xff0c;包括…

逻辑漏洞:Cookie脆弱性导致的逻辑漏洞

前几天学习了逻辑漏洞中的越权漏洞和支付漏洞&#xff0c;今天学习一下cookie脆弱性导致的逻辑漏洞 还是和之前一样&#xff0c;所有内容都是参考别的大佬总结好的&#xff0c;我只是在这里进行学习练习 1、cookie介绍 用户在客户端 (一般为浏览器) 中访问某个页面 &#xff0…

电脑崩溃了,之前备份的GHO文件怎么恢复到新硬盘?

前言 之前咱们说到用WinPE系统给电脑做一个GHO镜像备份&#xff0c;这个备份可以用于硬盘完全崩溃换盘的情况下使用。 那么这个GHO镜像文件怎么用呢&#xff1f; 咱们今天详细来讲讲&#xff01; 如果你的电脑系统硬盘崩溃了或者是坏掉了&#xff0c;那么就需要使用之前备份…

华为机考入门python3--(20)牛客20- 密码验证合格程序

分类&#xff1a;字符串 知识点&#xff1a; 遍历字符串的每个字符 for char in my_str: 可以直接比较字符范围 a < char < z 列表统计元素个数 my_list.count(elem) 寻找子串 my_str.find(sub_str) 题目来自【牛客】 import re import sysdef check_…

【算法】唯一分解定理及最lcm和gcd关系 宝石组合

前言 今天在做一道宝石组合的题目时了解到了这个定理&#xff0c;还是蛮有意思的。 思想 唯一分解定理&#xff1a; 对于任何正整数n&#xff0c;有 n p 1 a 1 p 2 a 2 . . . p k a k n p_1^{a1} \times p_2^{a2} \times ... \times p_k^{ak} np1a1​p2a2​...pkak​ …

C语言零基础快速入门视频教程

C语言零基础快速入门视频教程 介绍C语言C语言零基础视频教程领取教程下期更新预报 介绍C语言 C语言零基础快速入门&#xff1a;探索C语言的起源、特性与魅力 在编程世界中&#xff0c;C语言犹如一座古老而坚实的桥梁&#xff0c;连接着计算机科学的过去与现在。作为一门历史悠…

家庭用水安全新举措:保障自来水管和储水设施卫生

随着公众对家庭用水安全意识的提高&#xff0c;如何确保自来水管和楼顶储水罐的安全性和卫生已成为家庭生活中的重要议题。近期&#xff0c;专家针对此问题提出了一系列实用的注意事项和建议。 注意事项&#xff1a; 定期检查&#xff1a;专家强调&#xff0c;家庭应每季度至…

分布式事务—> seata

分布式事务之Seata 一、什么是分布式事务&#xff1f; 分布式事务是一种特殊类型的事务&#xff0c;它涉及多个分布式系统中的节点&#xff0c;包括事务的参与者、支持事务的服务器、资源服务器以及事务管理器。 在分布式事务中&#xff0c;一次大型操作通常由多个小操作组成…

如何查公网IP?

在网络通信中&#xff0c;每个设备都被分配一个独特的IP地址&#xff0c;用于在Internet上进行标识和通信。公网IP是指可以直接从Internet上访问的IP地址&#xff0c;也称为全局IP。通过查公网IP&#xff0c;我们可以了解我们的设备在Internet上的位置和连接状态。 2. 查公网IP…

vue3使用echarts做树图tree

vue3使用echarts做树图tree 1.安装echarts npm install echarts --save2.在main.js引入 import * as echarts from echarts // 全局方法 app.config.globalProperties.$echarts echarts3.使用 <div id"myChart" :style"{ width: 1000px, height: 1000px …

Django后台项目开发实战五

完成两个功能&#xff1a; HR 可以维护候选人信息面试官可以录入面试反馈 第五阶段 创建 interview 应用&#xff0c;实现候选人面试评估表的增删改功能&#xff0c;并且按照页面分组来展示不同的内容&#xff0c;如候选人基础信息&#xff0c;一面&#xff0c;二面的面试结…

[Linux][网络][传输层][UDP]详细讲解

目录 0.预备知识1.端口号的划分范围2.认识知名端口号3.netstat命令4.pidof 1.UDP协议端格式2.UDP特点3.面向数据报4.UDP的缓冲区5.UDP使用注意事项6.基于UDP的应用层协议 0.预备知识 1.端口号的划分范围 端口号的长度是16位&#xff0c;因此端口号的范围是0 ~ 65535 0 ~ 1023…

构建智能化商旅服务:酒店中台云服务架构设计与实践

随着商旅行业的不断发展和智能化趋势的兴起&#xff0c;酒店中台云服务成为了提升服务质量和效率的关键。本文将探讨酒店商旅中台云服务的架构设计与实现&#xff0c;介绍其关键特点和最佳实践&#xff0c;助力商旅行业迈向智能化未来。 1. **需求分析与场景设计&#xff1a;*…

ssm101珠宝首饰交易平台开发+jsp

珠宝首饰交易平台 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于珠宝首饰交易平台当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了珠宝首饰交易平台&#x…

开源博客项目Blog .NET Core源码学习(20:App.Hosting项目结构分析-8)

本文学习并分析App.Hosting项目中后台管理页面的个人资料页面、修改密码页面。 个人资料页面 个人资料页面用于显示和编辑个人信息&#xff0c;支持从本地上传个人头像。整个页面使用了layui中的表单、日期与时间选择、上传等样式或模块&#xff0c;通过layui.css文件设置样式…