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/javaee
		  http://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  这里的./表示当前路径
        可以省略不写即直接写 pathAbso

demo01.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.mfbz.cn/a/591363.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python:用 mido 生成 midi文件,用 pygame 播放 mid文件

pip install mido Downloading mido-1.3.2-py3-none-any.whl (54 kB) Downloading packaging-23.2-py3-none-any.whl (53 kB) Installing collected packages: packaging, mido Successfully installed mido-1.3.2 packaging-23.2 mido 官网文档 pip intall pygame pygame…

【AI】ONNX

长期更新&#xff0c;建议收藏关注&#xff01; 友情链接 Netron 开放神经网络交换&#xff08;Open Neural Network Exchange&#xff09;简称ONNX,是微软和Facebook提出用来表示深度学习模型的开放格式。所谓开放就是ONNX定义了一组和环境&#xff0c;平台均无关的标准格式…

内网安全-代理Socks协议路由不出网后渗透通讯CS-MSF控制上线简单总结

我这里只记录原理&#xff0c;具体操作看文章后半段或者这篇文章内网渗透—代理Socks协议、路由不出网、后渗透通讯、CS-MSF控制上线_内网渗透 代理-CSDN博客 注意这里是解决后渗透通讯问题&#xff0c;之后怎么提权&#xff0c;控制后面再说 背景 只有win7有网&#xff0c;其…

分层图像金字塔变压器

文章来源&#xff1a;hierarchical-image-pyramid-transformers 2024 年 2 月 5 日 本文介绍了分层图像金字塔变换器 (HIPT)&#xff0c;这是一种新颖的视觉变换器 (ViT) 架构&#xff0c;设计用于分析计算病理学中的十亿像素全幻灯片图像 (WSI)。 HIPT 利用 WSI 固有的层次结…

Git系列:如何为不同的Git仓库设置不同的配置项?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

毫米波雷达原理(含代码)(含ARS548 4D毫米波雷达数据demo和可视化视频)

毫米波雷达原理 1. 传统毫米波雷达1.1 雷达工作原理1.2 单目标距离估计1.3 单目标速度估计1.4 单目标角度估计1.5 多目标距离估计1.6 多目标速度估计1.7多目标角度估计1.7 总结 3. FMCW雷达数据处理算法4. 毫米波雷达的目标解析(含python代码)5. ARS548 4D毫米波雷达数据demo(含…

企业定制AI智能名片商城小程序:重塑营销场景,引领数字化营销新纪元

在数字化时代的浪潮中&#xff0c;多企业AI智能名片商城小程序以其独特的魅力和创新的功能&#xff0c;为消费者带来了前所未有的购物体验。它不仅是一个汇聚各类商品的购物平台&#xff0c;更是一个充满活力和创造力的社群生态。通过强化社群互动、鼓励用户生成内容以及引入积…

【RAG 博客】Haystack 中的 DiversityRanker 与 LostInMiddleRanker 用来增强 RAG pipelines

Blog&#xff1a;Enhancing RAG Pipelines in Haystack: Introducing DiversityRanker and LostInTheMiddleRanker ⭐⭐⭐⭐ 文章目录 Haystack 是什么1. DiversityRanker2. LostInTheMiddleRanker使用示例 这篇 blog 介绍了什么是 Haystack&#xff0c;以及如何在 Haystack 框…

加州大学欧文分校英语中级语法专项课程03:Tricky English Grammar 学习笔记

Tricky English Grammar Course Certificate Course Intro 本文是学习 https://www.coursera.org/learn/tricky-english-grammar?specializationintermediate-grammar 这门课的学习笔记 文章目录 Tricky English GrammarWeek 01: Nouns, Articles, and QuantifiersLearning …

WAAP动态安全解决方案

随着企业数字化进程不断加速&#xff0c;应用安全面临多重威胁&#xff0c;新型攻击方式层出不穷&#xff0c;常见的攻击形式包括Web应用攻击、DDoS攻击、API攻击、恶意爬虫攻击等。企业正面临严峻的安全防护挑战&#xff0c;需寻找一个可靠、全面的安全解决方案。在此情况下&a…

基于双层优化的电动汽车优化调度研究(附matlab程序)

基于双层优化的电动汽车优化调度研究 0.代码链接 基于双层优化的电动汽车优化调度研究(matlab程序)资源-CSDN文库 1.简述 关键词&#xff1a;双层优化 选址定容 输配协同 时空优化 参考文档&#xff1a;《考虑大规模电动汽车接入电网的双层优化调度策略_胡文平》…

【 书生·浦语大模型实战营】学习笔记(六):Lagent AgentLego 智能体应用搭建

&#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料&#xff0c;配有全面而有深度的专栏内容&#xff0c;包括不限于 前沿论文解读、…

Redis 实战之对象

Redis 实战 - 对象 对象的类型与编码类型编码和底层实现 字符串对象编码的转换字符串命令的实现 列表对象编码转换列表命令的实现 哈希对象编码转换哈希命令的实现 集合对象集合命令的实现 有序集合对象编码的转换有序集合命令的实现 类型检查与命令多态类型检查的实现多态命令…

嵌入式全栈开发学习笔记---C语言笔试复习大全7(编程题1~8)

目录 1、200&#xff5e;300之间能被3整除的数&#xff0c;5个一行输出&#xff1b; 2、求两个数的最大公约数、最小公倍数&#xff1b; 3、输入十个数&#xff0c;求出平均值&#xff1b; 4、通过编程实现,统计1~n有多少个9&#xff1b; 5、有1、2、3、4个数字&#xff0…

开源AI智能名片与B2B2C商城系统:打造私域流量的会员体系新篇章

在数字化浪潮的推动下&#xff0c;企业如何高效利用私域流量、构建强大的会员体系成为了市场竞争的关键。AI智能名片与B2B2C商城系统的结合&#xff0c;为企业提供了一个全新的解决方案。通过智能名片的个性化推荐和商城系统的精准营销&#xff0c;企业能够更有效地触达和沟通私…

ApiHug 官方站点

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplacehttps://…

计算机等级考试2级(Python)知识点整理

计算机等级考试2级&#xff08;Python&#xff09;知识点整理 1.基础知识点&#xff08;记忆、理解&#xff09; 第1讲Python概述 01. 源代码 02. 目标代码 03. 编译和解释 04. 程序的基本编写方法 第2讲 Python语言基础&#xff08;一&#xff09; 01. 用缩进表示代码…

tomcat打开乱码修改端口

将UTF-8改成GBK 如果端口冲突&#xff0c;需要修改tomcat的端口

AJ-Report开源数据大屏 verification;swagger-ui RCE漏洞复现

0x01 产品简介 AJ-Report是一个完全开源的BI平台,酷炫大屏展示,能随时随地掌控业务动态,让每个决策都有数据支撑。多数据源支持,内置mysql、elasticsearch、kudu等多种驱动,支持自定义数据集省去数据接口开发,支持17+种大屏组件,不会开发,照着设计稿也可以制作大屏。三…

高级数据结构与算法习题(9)

一、判断题 1、Let S be the set of activities in Activity Selection Problem. Then the earliest finish activity am​ must be included in all the maximum-size subset of mutually compatible activities of S. T F 解析:F。设S是活动选择问题中的一…
最新文章