Servlet

Servlet概述

Servlet是接收请求并处理响应的JavaEE规范
Servlet实现类是可以运行在web服务器中,用来接收浏览器客户端的请求,并给浏览器客户端响应数据的
服器类.

Servlet运行原理

从url如何匹配到servlet的服务方法

1.http://localhost:8080/day06/helloWorld?mes=str
2.通过localhost:8080匹配到tomcat
3.通过/day06匹配到tomcat中部署的工程
4.通过/helloWorld匹配到工程web.xml中的映射
5.通过servlet映射匹配到servlet实例
6.执行servlet实例的服务方法

Servlet生命周期

Servlet默认在
通过调用 init () 方法进行初始化
第一次调用服务的时候才创建初始化,且创建初始化只能执行一次
调用 service() 方法来处理客户端的请求
服务可以执行无数次
通过调用 destroy() 方法终止(结束)
销毁在tomcat停止运行时,销毁一次
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的
doGet() 方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理
doPost() 方法
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理
事列代码

public class LifeServlet implements Servlet {
public LifeServlet(){
    System.out.println("\"构造  创建出生\" = " + "构造  创建出生");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
    System.out.println("\"初始化  成长发育\" = " + "初始化  成长发育");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    System.out.println("\"服务器 接待客人\" = " + "服务器 接待客人");
}
@Override
public void destroy() {
    System.out.println("\"销毁 死亡\" = " + "销毁 死亡");
}
@Override
public ServletConfig getServletConfig() {
    return null;
}
@Override
public String getServletInfo() {
    return null;
  }
}

第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
Servlet 容器在调用 service() 方法之前加载 Servlet。
然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法

tomcat中的默认Servlet

tomcat本质上也可以看做一个特殊的DefaultServlet 所有请求都走他
默认servlet会先匹配Servlet动态资源,匹配不到才页面匹配静态资源
1.创建一个servlet映射 /static/default.html

public class MyDefaultServlet implements Servlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    System.out.println("\"动态Servlet资源\" = " + "动态Servlet资源");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
    return null;
}
@Override
public String getServletInfo() {
    return null;
}
@Override
public void destroy() {
 }
}

2.配置映射 XML

<servlet>
    <servlet-name>myDefault</servlet-name>
    <servlet-class>com.itheima.com.itheima.defaul.MyDefaultServlet</servlet-class>
</servlet>
 <servlet-mapping>
    <servlet-name>myDefault</servlet-name>
    <url-pattern>/static/default.html</url-pattern>
</servlet-mapping>

Servlet初始化顺序

load-on-startup用来标记一个servelt在tomcat容器启动的时候就创建初始化
数字值越小,启动优先级越高

<servlet>
    <servlet-name>life</servlet-name>
    <servlet-class>com.itheima.life.LifeServlet</servlet-class>
    **<load-on-startup>2</load-on-startup>**
</servlet>
<servlet>
    <servlet-name>life2</servlet-name>
    <servlet-class>com.itheima.life.LifeServlet2</servlet-class>
    **<load-on-startup>3</load-on-startup>**
</servlet>


<servlet-mapping>
    <servlet-name>life</servlet-name>
    <url-pattern>/lifeServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>life2</servlet-name>
    <url-pattern>/lifeServlet2</url-pattern>
</servlet-mapping>

Servlet项目的两种配置

给Servlet配置网络映射有两种方式
除了使用xml形式,在servlet3.0以后可以使用注解形式
格式@WebServlet("/映射")

Servlet映射模式

Servlet映射的优先级

精确匹配(用) > 路径匹配(不用) > 后缀匹配(不用)

例如

/aa > /aa/* > *.php

步骤分析

创建三个servlet映射分别为 /aa /aa/* *.php

启动测试

http://localhost:8080/day06/aa

http://localhost:8080/day06/aa/bb.php

http://localhost:8080/day06/bb/cc.php

Servlet线程安全问题

1.每一个Servlet实例都是单例模式,它的实例属性是线程不安全的.
2.每个Servlet实现类在tomcat中都是只有一个实例对象 实例属性是线程不安全
3.servlet是线程不安全的,而造成这种原因主要是以为实例变量不正确的使用(只实例化第一次servlet)
尽量不使用synchronized来解决Servlet线程安全问题

Servlet项目环境

1.ServletContext 当前项目环境

项目环境域对象

ServletContext.SetAttribute() 设置自定义属性
ServletContext.getAttribute() 获取自定义属性
ServletContext.removeAttribute() 移除一个属性值

项目环境常用方法

servletContext.getRealPath("") //取出当前项目的真实地址 ,项目根目录真实地址
servletContext.getResourceAsStream("") //获取当前项目下的文件的字节输入流

ServletConfig 每个Servlet自己的配置对象

servletConfig.getInitParameter() 取出当前Servlet配置对象中的参数值

ServletConfig和ServletContext 区别

从作用范围来说,ServletConfig作用于某个特定的Servlet,即从该Servlet实例化,那么就开始有效,但是该Servlet之外的其他Servlet不能访问;ServletContext作用于某个webapp,即在一个webapp中相当于一个全局对象,在Servlet容器启动时就已经加载,对于不同的webapp,有不同的ServletContext

三个域对象理论总结

Servlet中有三个域对象:

request ServletRequest 表示一次请求

创建: 每一个请求都创建一个request对象,同时还会创建一个唯一对应的response
销毁: 响应完成,response销毁
存入数据的作用范围:在该request对象的的有效范围内,注意,请求转发一直都是这一个request

session HttpSession表示一次会话

创建: 浏览器开始访问服务器,服务器执行到request.getSession()方法时.
销毁: 四种销毁session方式
用户行为: 关闭浏览器
服务器被动: session超时时间到
服务器主动:session.invalidate() 安全退出
服务器异常: 服务器炸了.
存入数据的作用范围:当前会话对象session中. 关闭浏览器session销毁

ServletContext 表示项目环境

创建:项目部署启动
销毁: 项目停止运行
存入数据的作用范围:当前项目环境中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值