Day29_10 JavaWeb之Servlet及Servlet细节

2023-11-07

目录

一、Servlet

Servlet的概述

Servlet的三种使用方式

Servlet的生命周期

二、Servlet中的其他对象

ServletConfig 对象(没什么大用,了解即可)

ServletContext最大域对象(Application域)  

ServletRequest对象: 请求对象(该对象后面文章会详细讲述)

ServletResponse对象: 响应对象(该对象后面文章会详细讲述)

三、Servlet 细节

注解servlet

Servlet是否线程安全? 

Servlet的url-pattern的使用

四、idea 与tomcat(idea会自动部署javaweb项目)


一、Servlet

  • Servlet的概述

解析:

1、Servlet是JavaWeb的三大组件之一,它属于动态资源。

2、Servlet的主要作用是处理请求,服务器会把接收到的请求交给Servlet来处理;

3、在Servlet中通常需要:

3.1、接收请求数据;

3.2、处理请求;

3.3、完成响应;
tips1:例如客户端发出的登录请求、注册请求、查询请求等,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现Javax.servlet.Servlet接口。

tips2:JavaWeb中的三个剑客(组件):

Servlet:接收用户请求,处理请求,响应结果

Filter:(过滤器)拦截请求

Lisenter:(监听器)监听某一行为,只有用户触发这一行为,自动执行指定代码

  • Servlet的三种使用方式

一、让一个普通类变成Servlet的三种方式

1、实现javax.servlet.Servlet接口(便于理解Servlet的生命周期)


2、继承javax.servlet.GenericServlet抽象类

GenericServlet 实现Servlet接口, 把Servlet接口其他四个方法实现, service() 变成抽象方法


3、继承javax.servlet.http.HttpServlet抽象类 (实际开发中使用这种方式)

实际开发: 继承HttpServlet, 重写doGet()或者doPost()

二、在WEB-INF/web.xml文件中进行配置(在后期我们会使用注解的方式)

 AServlet:

package com.fs.web.Servlet;

import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;

/**
 *  取Servlet的类名:  XxxServlet
 * 实现Servlet的第一种方式
 *   实现javax.servlet.Servlet接口
 */
public class AServlet implements Servlet {
    private ServletConfig servletConfig; //默认null

    /**
     * 初始化方法    生命周期方法, 由Tomcat调用    做初始化操作
     *   在Servlet创建之后调用, 调用一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("555~~555,我出生了...");
        this.servletConfig = servletConfig;
    }

    /**
     * 得到ServletConfig对象 (Servlet的配置)
     *
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return servletConfig;
    }

    /**
     * 最重要的方法, 接收用户请求,处理用户请求, 响应结果
     * Tomcat调用:  生命周期方法   , 每请求一次,执行一次
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("AServlet 正在服务...");
        //获取Servlet配置
        //System.out.println("Servlet的名字:"+servletConfig.getServletName());
        //获取初始化参数
        //根据初始化参数名获取值
        String name = servletConfig.getInitParameter("name");
        System.out.println("name:"+name);
        //获取所有的初始化参数名
        Enumeration<String> names = servletConfig.getInitParameterNames();
        //遍历
        while(names.hasMoreElements()){
            String key = names.nextElement(); //参数名
            String value = servletConfig.getInitParameter(key);
            System.out.println("key:"+key+"--value:"+value);
        }

    }

    /**
     * 没什么意义
     *   得到Servlet的描述
     * @return
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * 销毁方法,    释放资源
     *  生命周期方法, Tomcat调用,
     *   在Servlet销毁之前调用, 只执行一次
     */
    @Override
    public void destroy() {
        System.out.println("555~555~我走了...");
    }
}

we.xml中的配置 :

<!--配置Servlet, 一个Servlet类绑定一个url(客户端访问入口)-->
    <servlet>
        <!-- 名称 随意取, 一般取名类名-->
        <servlet-name>AServlet</servlet-name>
        <!--对应的Servlet类, 全限定名(包.类名) -->
        <servlet-class>com.fs.web.Servlet.AServlet</servlet-class>

        <!--配置初始化参数-->
        <init-param>
            <param-name>name</param-name>
            <param-value>张三</param-value>
        </init-param>
        <init-param>
            <param-name>age</param-name>
            <param-value>21</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <!--名称, 与对应servlet的servlet-name一样 -->
        <servlet-name>AServlet</servlet-name>
        <!--绑定url: /路径  一般取名: /类名 -->
        <url-pattern>/AServlet</url-pattern>
    </servlet-mapping>

运行结果:出现以下说明运行成功

 控制台打印:

  • Servlet的生命周期

解析:

描述Servelet的一生,  从生到死过程
1. 默认情况: Servlet第一次请求的时候,由Tomcat创建
2. 调用init()方法
3. 用户每请求一次这个Servlet, tomcat调用一次service()方法
4. 当Tomcat服务器关闭之前, 销毁它创建的所有对象,包含创建Servlet,   在Servlet销毁之前, 调用destroy() 

二、Servlet中的其他对象

  • ServletConfig 对象(没什么大用,了解即可)

解析:

1. 获取Servlet的初始化参数   参数名,参数值 都是String类型

String getInitParameter(String name): 根据初始化参数名获取初始化参数值

Enumeration<String> getInitParameterNames(): 获取所有的初始化参数name

  • ServletContext最大域对象(Application域)  

解析:

1、该对象全项目共用(敏感数据勿存)

2、获取方法如下:

使用ServletContext存放数据
1.获取ServletContext对象,
第一种方式: ServletConfig的getServletContext()
ServletContext servletContext = this.getServletConfig().getServletContext();

GenericServlet 实现了ServletConfig接口,  直接调用getServletContext()
ServletContext application = this.getServletContext();

2.存数据
application.setAttribute("name","老王");

  • ServletRequest对象: 请求对象(该对象后面文章会详细讲述)

解析:

1、 核心方法: 获取请求参数

String getParameter(String name): 根据请求参数name获取请求参数值

2、 前端发送请求有哪些方式:

1. form 的action      可以是get,post   method: 默认值get,  设置post,发送post请求
2. 超链接`<a href="">`    只能get
3. 直接在浏览器地址栏输入url    只能get
4. js发送ajax请求   可以是get,post

请求方式:  GET请求/POST请求

get请求:  请求参数通过url传递,   请求参数 url:  url?k1=v1&k2=v2&...

​                 不安全, 传递字符串, 不能传递文件数据

post请求: 请求参数通过请求体传递, 

​                安全性高,  传递字符串, 传递文件数据

  • ServletResponse对象: 响应对象(该对象后面文章会详细讲述)

 解析:

1、getWriter() 得到字符响应输出流, 服务器通过改输出流,把数据写到客户端的浏览器页面上

2、System.out.println(): 把数据打印到服务器的控制台

三、Servlet 细节

  • 注解servlet

解析:

1、注解: 特殊的接口, 在方法,类,属性.... @注解名 (创建注解类的对象)

Servlet中的注解是用来替换web.xml中的配置文件的

2、类类型: class interface enum @interface

具体如下:

@WebServlet注解 替换servlet的配置文件

// name 忽略:
//@WebServlet(name="DServlet",urlPatterns="/DServlet")
//@WebServlet(urlPatterns="/DServlet")
//urlPatterns 与value 等同
//@WebServlet(value="/DServlet")
// 如果只给value赋值,  省略 value=
@WebServlet("/DServlet")

  • Servlet是否线程安全? 

解析:

判断依据: 多个线程是否共享同一资源, 是共享, 线程不安全, 不是共享, 线程安全(这是所有是否线程安全的判断依据)

因此:在AServlet类在Tomcat只有一个对象, 多个请求,请求的同一个Servlet对象, 多个线程使用的同一个对象, Servlet对象共享, 线程不安全

tips:一定不要再Servlet提供存放数据的属性(也就是在Servlet中提供全局变量)

  •  Servlet的url-pattern的使用

解析:

1. 一个Servlet只能绑定一个Url?

可以绑定多个url, 但是实际开发一般只绑定一个

2. url-pattern的写法

/字符串     绑定确定的url

结合 * (通配符, 任意)
  
/user/*:    前缀匹配, 只要前面是/user开头,后面的任意     /user/a  /user/b
 
*.后缀名:  后缀匹配, 只要url后面以 后缀名结尾的都匹配  *.do    a.do c.do

特别注意:  /*.后缀名   错误写法

/* 匹配所有

tips:url的匹配, 越精确,优先级越高,  没有*的url优先级高于有*的

  • Servlet的默认创建时机

解析:

1、第一次请求该Servlet才创建, 也称第一次惩罚, 第一次请求耗费时间多一点

2、可修改Servlet的创建时间:

修改Servlet的创建时机: 在web服务器启动的时候,创建Servlet

web.xml中配置:

<servlet>
          <!--设置tomcat启动的时候,创建-->
          <load-on-startup>非负整数</load-on-startup>
      </servlet>

tips:load-on-startup中的数字越小,越先创建

注解方式:

 @WebServlet(value="/*",loadOnStartup=2)

四、idea 与tomcat(idea会自动部署javaweb项目)

解析:

1、IDEA会为每一个tomcat部署的项目单独创建一份配置文件的地址如下图:

2、idea发布项目, 使用之前讲第三种发布方式(不知道的小伙伴去翻前面的博客吧)

3、out目录下项目 tomcat发布项目(如图)

4、其中idea的项目: 才是真正的工作项目

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Day29_10 JavaWeb之Servlet及Servlet细节 的相关文章

随机推荐

  • [蓝桥杯2023初赛] 整数删除

    给定一个长度为 N 的整数数列 A1 A2 AN 你要重复以下操作 K 次 每次选择数列中最小的整数 如果最小值不止一个 选择最靠前的 将其删除 并把与它相邻的整数加上被删除的数值 输出 K 次操作后的序列 输入格式 第一行包含两个整数 N
  • vscode:visual studio code 调试php

    简介 php是动态语言没有调试器的话排错起来很是麻烦 vscode可以说是程序员的福音 启动速度快 插件越来越多 跨平台 现在说一下vscode上调试php文件 所需文件 xampp 集成服务器 vscode Xdebug php debu
  • Rightware的Kanzi界面很快你的全液晶汽车仪表盘

    锋影 e mail 174176320 qq com 这是一个屏幕在行动的Kanzi UI编辑器 这是说 汽车仪表板没有显著在过去的几十年里发展公平 不知怎么的 我觉得喜欢的东西是会改变的 但什么也没做 至少在一个大的方式 当日产GTR天际
  • 面试必问的Spring IoC与Spring AOP面试题,你能get到几问?

    Spring IoC Q1 IoC 是什么 Q2 IoC 容器初始化过程 Q3 依赖注入的实现方法有哪些 Q4 依赖注入的相关注解 Q5 依赖注入的过程 Q6 Bean 的生命周期 Q7 Bean 的作用范围 Q8 如何通过 XML 方式创
  • (含源码)「自然语言处理(NLP)」RoBERTa&&XLNet&&语言模型&&问答系统训练

    来源 AINLPer 微信公众号 每日更新 编辑 ShuYini 校稿 ShuYini 时间 2020 07 27 引言 本次内容主要包括 稳健优化Bert模型 RoBERTa 自回归预训练模型 XLNet 无监督多任务学习语言模型 生成预
  • 【BT 协议】HFP 协议

    原文链接 https blog csdn net shichaog article details 52123439 HFP Hands free Profile 让蓝牙设备可以控制电话 如接听 挂断 拒接 语音拨号等 拒接 语音拨号要视蓝
  • C++:智能指针及其实现原理

    更多C 知识点 C 目录索引 1 RAII思想 定义一个类来封装资源的分配与释放 构造函数中完成资源的分配及初始化 析构函数中完成资源的清理 可以保证资源的正确初始化和释放 如果对象是用声明的方式在栈上创建局部对象 那么RAII机制就会正常
  • 从 MySQL 到 OBOracle:如何处理自增列?

    业务需要将数据库转换为 OceanBase 数据库 但源端涉及到 Oracle 及 MySQL 两种不同数据库 需要合并为 OceanBase 中单一的 Oracle 模式 其中源端 MySQL 数据库需要改造为 OB Oracle 并做异
  • 天梯题集——复数四则运算(fabs)

    复数四则运算 include
  • K8S kube-proxy- iptable模式实现原理分析

    每台机器上都运行一个kube proxy服务 它监听api server 和endpoint变化情况 维护service和pod之间的一对多的关系 通过iptable或者ipvs为服务提供负载均衡的能力 通常kube proxy作为deem
  • mysql auto reconnect_Python mysql (using pymysql) auto reconnect

    I m not sure if this is possible but I m looking for a way to reconnect to mysql database when the connection is lost Al
  • 手把手教你解决二维数组旋转问题

    一 背景 最近做算法题发现有些题目都需要将一个数组顺时针或逆时针旋转 之前发的题解中也涉及到过这类题 但没有细讲 在这里讲一下思路 手把手带你找到对应关系 本文代码示例均使用java 但重要的是思路 思路 思路 与语言无关 如果大家不明白我
  • 大厂怎么做Code Review?

    发现坏味道的实践 就是Code Review 对计算机源代码系统化地审查 常用软件同行评审的方式进行 其目的是在找出及修正在软件开发初期未发现的错误 提升软件质量及开发者的技术 团队对 CR本身的理解有差异 有的团队 在一个完整的开发周期结
  • Java中的内存分配

    Java把内存划分成两种 一种是栈内存 一种是堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配 当在一段代码块定义一个变量时 Java就在栈中为这个变量分配内存空间 当超过变量的作用域后 Java会自动释放掉为
  • @Profile使用场景

    文章目录 前言 一 Profile注解介绍 二 Profile注解使用 1 环境搭建 2 根据环境注册bean 前言 在实际的企业开发环境中 往往都会将环境分为 开发环境 测试环境和生产环境 而每个环境基本上都是互相隔离的 也就是说 开发环
  • java 五笔码+拼音码

    原文 java js 汉字对应拼音码 五笔码转换 五笔码 package com zdww chis demo import java util Locale public class Wbm private static String W
  • crout分解计算例题_初中数学因式分解习题大全(建议父母给孩子收藏直接打印)...

    一 填空题 共10小题 1 已知x y 10 xy 16 则x2y xy2的值为 2 两位同学将一个二次三项式分解因式 一位同学因看错了一次项系数而分解成2 x 1 x 9 另一位同学因看错了常数项分解成2 x 2 x 4 请你将原多项式因
  • 证券IT:冬虫夏草之技术路线图

    冬虫夏草之技术路线图 原创 杨松 新金融世界 7月18日 作为一名28年证券机构从业经历的老兵 杨松一直在观察和研究IT技术对金融机构的业务重构 以及证券业务变革相关的内容 今天 让我们来看看这位金融业内人士如何利用他28年的行业积累 通过
  • Idea中导入maven项目自动配置maven设置

    经常导入项目后需要在setting中设置maven 1 file gt setting中设置当前项目的maven配置 配置后 再次导入项目将以次设置为默认的maven设置 2 设置导入maven项目的默认maven配置
  • Day29_10 JavaWeb之Servlet及Servlet细节

    目录 一 Servlet Servlet的概述 Servlet的三种使用方式 Servlet的生命周期 二 Servlet中的其他对象 ServletConfig 对象 没什么大用 了解即可 ServletContext最大域对象 Appl