Servlet详解(从xml到注解)

news2024/11/26 9:36:01

文章目录

  • 概述
    • 介绍
    • 作用
  • 快速入门
  • 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.coloradmin.cn/o/1639466.html

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

相关文章

uni-app scroll-view隐藏滚动条的小细节 兼容主流浏览器

开端 想写个横向滚动的列表适配浏览器&#xff0c;主要就是隐藏一下滚动条在手机上美观一点。 但是使用uni-app官方文档建议的::-webkit-scrollbar在目标标签时发现没生效。 .scroll-view_H::-webkit-scrollbar{display: none; }解决 F12看了一下&#xff0c;原来编译到浏览…

基于 Wireshark 分析 IP 协议

一、IP 协议 IP&#xff08;Internet Protocol&#xff09;协议是一种网络层协议&#xff0c;它用于在计算机网络中实现数据包的传输和路由。 IP协议的主要功能有&#xff1a; 1. 数据报格式&#xff1a;IP协议将待传输的数据分割成一个个数据包&#xff0c;每个数据包包含有…

Ant Design助力:实现用户列表的优雅展示与管理

文章目录 概要前端讲解登录组件注册组件用户列表组件 后端讲解连接数据库db.js路由routes.jsexpress应用app.js 启动项目小结 概要 在上一篇博客&#x1f6aa;中&#xff0c;我们已经成功实现了登录注册系统的基本功能。现在&#xff0c;我们将进一步完善系统&#xff0c;实现…

第一课 自动驾驶概述

1. contents 2. 什么是无人驾驶/自动驾驶 3 智慧出行大智慧 4. 无人驾驶的发展历程

用户中心(末)

文章目录 开发用户注销前后端后端前端 补充用户注册校验逻辑前后端设计后端前端 后端代码优化封装通用返回对象封装全局异常处理全局请求日志和登录校验 TODO 前端代码优化 开发用户注销前后端 后端 当用户登录成功之后&#xff0c;我们在请求体的 session 中保存了用户的登录…

一对一WebRTC视频通话系列(一)—— 创建页面并显示摄像头画面

本系列博客主要记录WebRtc实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 一、创建html页面 简单添加input、button、video控件的布局。 <html><head><title>WebRTC demo</title></head><h1>…

vue2(4)之scoped解决样式冲突/组件通信/非父子通信/ref和$refs/异步更新/.sync/事件总线/provide和inject

vue2 一、学习目标1.组件的三大组成部分&#xff08;结构/样式/逻辑&#xff09;2.组件通信3.综合案例&#xff1a;小黑记事本&#xff08;组件版&#xff09;4.进阶语法 二、scoped解决样式冲突**1.默认情况**&#xff1a;2.代码演示3.scoped原理4.总结 三、data必须是一个函数…

自动驾驶规划与控制技术解析

目录 1. 自动驾驶技术 2.定位location 3. 地图HD Map ​编辑 4 预测prediction 5 自动驾驶路径规划 6. 自动驾驶路径规划 7. 规划planning 8. 视频路径 1. 自动驾驶技术 2.定位location 3. 地图HD Map 4 预测prediction 5 自动驾驶路径规划 6. 自动驾驶路径规划 7.…

IDEA 2022.1版本开始,可以直接运行Markdown里的命令行

参照这种格式&#xff1a; shell mvn clean install注意idea支持的版本&#xff1a;是从 2022.1版本开始的。 ps&#xff1a;之前有人写过了&#xff0c;感觉很实用但是蛮多开发者不一定会知道的功能。 参考资料&#xff1a; https://www.cnblogs.com/didispace/p/16144107.h…

2.4Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue组件

初识Vue组件 Vue中的组件是页面中的一部分&#xff0c;通过层层拼装&#xff0c;最终形成了一个完整的组件。这也是目前前端最流行的开发方 式。下面是Vue3官方给出的一张图&#xff0c;通过图片能清楚的了解到什么是Vue中的组件。 图的左边是一个网页&#xff0c;网页分为了…

革新DNA存储:DNA-QLC编码方案高效可靠,多媒体图像存储新时代启航

在数字信息爆炸的时代&#xff0c;传统存储介质正面临容量、持久性和能耗的极限挑战。为此&#xff0c;大连理工大学计算机科学与技术学院的研究团队在《BMC基因组学》发表了一篇开创性论文&#xff0c;介绍了一种名为DNA-QLC的创新编码方案&#xff0c;为DNA存储系统的高效性和…

基于免疫粒子群算法的考虑负荷需求相应的热电联供系统优化调度(MATLAB实现)

1.研究背景 随着“双碳”战略的提出&#xff0c;各种分布式能源的开发和利用收到越来越多的重视。冷热电联供(Combined Cooling Heating and Power, CCHP)系统在发电的同时可以将燃气轮机产生的废热用于制热或制冷&#xff0c;实现能量的梯级利用&#xff0c;并减少系统的污染气…

【热门话题】PostCSS:现代前端开发中的CSS增强工具

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 PostCSS&#xff1a;现代前端开发中的CSS增强工具一、引言二、PostCSS简介2.1 核…

前端工程化04-VsCode插件设置总结(持续更)

1、输出语句log设置 log输出、平常你输出log,还必须得打一个console然后再.log()非常不方便&#xff0c;当然我们可以直接输入一个log,但是提示有两个&#xff0c;我们还得上下选择 所以我们直接采用插件的提示 一个clg就可以了 2、括号包裹提示 找到VsCode的settings.js文…

学习java的继承

1.什么是继承 java中提供了一个关键字&#xff0c;extends&#xff0c;可以让一个类与另一个类建立起父子关系。 例如 public class B extends A { --- } 在这里&#xff0c;我们称A类为父类&#xff08;也被称为基类或者超类&#xff09;B类称为子类&#xff08;或者是派生…

汉王科技亮相世界数字健康论坛:以AI定义第四代血压计

作为科技行业的年度盛会&#xff0c;2024年中关村论坛年会于近日在北京揭幕。 作为中关村知名的人工智能企业&#xff0c;汉王科技携大模型的最新垂直应用、柯氏音法电子血压计等创新成果&#xff0c;在4月29日中关村论坛平行论坛“2024世界数字健康论坛”上亮相。 在《AI赋能血…

C语言/数据结构——每日一题(反转链表)

一.前言 大家好&#xff01;今天又是每日一题环节。今天我为大家分享了一道单链表题——反转链表。 废话不多说&#xff0c;让我们直接进入正题吧。 二.正文 1.1题目信息 这是一道leetCode上面的一道题&#xff1a;https://leetcode.cn/problems/reverse-linked-list 1.2解…

[技术小技巧] 可视化分析:在jupyter中使用d3可视化树形结构

首先在python中定义一个字符串&#xff0c;记录d3.js绘制属性图的js脚本代码模版。其中{{data}}就是将来要被替换的内容。 d3_code_template """ // 创建树状结构数据 var treeData {{data}};// 创建d3树布局 var margin { top: 20, right: 90, bottom: 30,…

云原生Kubernetes: K8S 1.29版本 部署Harbor

目录 一、实验 1.环境 2.Linux 部署docker compose 3.证书秘钥配置 4.K8S 1.29版本 部署Harbor 5.K8S 1.29版本 使用Harbor 二、问题 1.docker 登录harbor失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注masterK8S master节点1.2…

使用CNN或resnet,分别在flower5,flower17,flower102数据集上实现花朵识别分类-附源码-免费

前言 使用cnn和resnet实现了对flower5&#xff0c;flower17&#xff0c;flower102数据集上实现花朵识别分类。也就是6份代码&#xff0c;全部在Gitee仓库里&#xff0c;记得点个start支持谢谢。 本文给出flower17在cnn网络实现&#xff0c;flower102在resnet网络实现的代码。…