2021-07-27

servlet介绍
在这里插入图片描述

Servlet是运行在java服务端的程序 用于接收和响应来自客户端基于HTTP的请求
理解:servlet可以接收到请求,然后还可以对客户端就行响应
实现响应和接收请求就得实现其接口然后就行你想要的操作。

实现其功能要实现他的接口

Servlet的实现方式

1、实现servlet接口 实现其所有的抽象方法 : 最大程度的自定义

2、继承GenericServlet抽象类 重写service方法 与http协议无关 开发简单

3、继承httpServlet抽象类 重写doget、dopost方法 和http协议相关

其实httpServlet的doget和dopost是由service方法转换来的

servlet的执行过程:
在这里插入图片描述
1、客户端发起请求

2、Tomcat服务器接收到请求解析请求地址url

3、通过解析到的url找到对应的项目-----就是虚拟路径对应的war包

4、然后在找到改项目的配置文件web.xml

5、解析请求资源地址URI—就是虚拟路径后面的地址

6、通过每一个servlet类都对应的映射里面相应的地址找到对应的类

7、执行该类中的方法,响应给客户端服务器。

Servlet的生命周期

出生:init

活着:service/doget、dopost

死亡:destroy

Servlet对象只会创建一次 销毁一次 只有一个实例

Servlet线程安全问题

首先:servlet线程是不安全的

一个浏览器可以代表一个线程,那么多个浏览器就是代表多个线程,可能会出现数据混乱的问题

我们可以将不共用的成员变量、或者说每次使用都需要进行赋值的成员变量定义到doget和dopost方法里面去,或者使用同步代码块

如果共用变量只在初始化时赋值。其他时间都是只获取的话,那么就没有问题。

Servlet映射方式

1、具体名称:访问路径必须和映射配置完全相同

2、/开头 + * :只要符合目录结构 不用考虑结尾是什么

3、* + 固定格式 :只要符合固定结尾格式即可,不用考虑前面的路径

注意:三种方式可能会出现都匹配的情况冲突 那么越具体的优先级越高

1 > 2 > 3

Servlet创建时机

1、第一次访问是创建:不写标签时或者里面的参数为负整数时

优点:不会影响服务器启动的效率

缺点:无法在应用加载时做初始化操作

2、在服务器加载时创建:添加了标签,且里面的参数为正整数时,

值越小优先级越高,因为一个项目可以有多个servlet对象

优点:提前创建好对象,提高执行效率,完成应用加载时需要的操作

缺点:影响服务器启动效率,占用内存

默认的Servlet

是服务器提供的一个servlet,在配置文件conf中的web.xml中,当请求没有访问到资源时,就会将显示这个默认servlet资源信息。

ServletConfig

每一个Servlet都有一个对应的ServletConfig配置信息

比如:

<servlet>
        <servlet-name>ServletDemo1</servlet-name>
        <servlet-class>ServletDemo1</servlet-class>
        
         //配置ServletConfig初始化参数
   //注意:需要写到servlet标签里面 可以写多个 但是一个init-param标签只能写一个键值对
        <init-param>
            <param-name>name1</param-name>
            <param-value>jace</param-value>
        </init-param>
        <init-param>
            <param-name>name2</param-name>
            <param-value>sara</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>ServletDemo1</servlet-name>
        <url-pattern>/servletdemo1</url-pattern>
    </servlet-mapping>

作用:在Servlet初始化时,将这些配置信息传递给Servlet

生命周期和Servlet相同

方法:

首先要获取ServletConfig对象

因为每一个servlet都有一个对应的servletConfig对象,我们可以使用gitServletConfig得到这个对象

1、getInitParameter(key):得到对应的value

2、getInitParameterNames():得到所有的name的枚举项 然后可以使用迭代器遍历进行操作

3、getServletName():得到该Servlet的servlet-name中的参数----servlet的名字

4、getServletContext():得到全局共享数据对象—应用域对象—应用上下文对象

ServletContext对象

全局共享数据对象—应用域对象—应用上下文对象

实现数据共享

生命周期:和应用生命周期一样

//单独存在 因为是共享的 使用不能放在某一个servlet中
<context-param>
        <param-name>desc</param-name>
        <param-value>utf-8</param-value>
  </context-param>

方法:

getInitParameter(key):获取对应的值

getContextPath():获取虚拟路径

getRealPath(“文件名”):获取文件在磁盘绝对路径-----重要

解:当我们开启服务器之后,上传项目,每一客户端项目中的文件的路径都是不一样的,后续需要路径的操作时,我们就需要得到准确的对应的路径,所以需要使用该方法

在src下的文件最为复杂:比如src目录下的a.txt文件:他的绝对路径:是在该客户端磁盘中war包中的classes文件中

在web目录下的文件,比如在web目录下的b.txt文件:他的绝对路径:是在该客户端磁盘war包下

在web/WEB-INF目录下,和上面类似,多了一层而已

setAttribute(name,value):设置应用域中的存储数据

getAttribute(name):获取name对应的value

removeAttribute(name):移除应用域对象中的数据

自动注解开发

每一个servlet都有一个对应的映射配置,当一个项目中有很多servlet时,配置这些映射就很繁琐了,自动注解就很好的解决了这个问题

首先,这个注解是别人帮我们弄好了滴。。。。会用就行

@WebServlet(‘uri’):找到该类的uri----也就是里面对应的值

注解里面还有很多的东西都是跟映射配置相关。

模板

一个项目中servlet的太多,我们可以搞一个模板,这样提高开发效率。需要有不同名字的地方用 ${NAME}.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值