Servlet概述

Servlet概述

1.Servlet

Servlet是JavaWeb的 三大组件之一 ,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:

  • 接收请求数据;
  • 处理请求;
  • 完成响应。

例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。

2.开发servlet

1编写servlet类

让一个类变成servlet三种方式

  • 实现javax.servlet.Servlet接口;
  • 继承javax.servlet.GenericServlet类;
  • 继承javax.servlet.http.HttpServlet类;(最常用)
2在WEB-INF/web.xml文件进行配置
<!--配置Servlet, 一个Servlet类绑定一个url(客户端访问入口)-->
 <servlet>
     <!-- 名称 随意取, 一般取名类名-->
     <servlet-name>AServlet</servlet-name>
     <!--对应的Servlet类, 全限定名(包.类名) -->
     <servlet-class>com.fs.web.AServlet</servlet-class>
 </servlet>
 <servlet-mapping>
     <!--名称, 与对应servlet的servlet-name一样 -->
     <servlet-name>AServlet</servlet-name>
     <!--绑定url: /路径  一般取名: /类名 -->
     <url-pattern>/AServlet</url-pattern>
 </servlet-mapping>

JavaWeb的 三大组件大多数方法都不需要程序员的手动调用,由tomcat自己调用

1.根据url查找Servlet类, 对应Servlet的配置, Tomcat创建,

2.如果第一次请求,Tomcat先创建AServlet对象,并且保存这个对象,为之后的请求直接使用对象(AServlet在整个项目只有一个对象)

3.调用service()方法处理用户请求

aServlet.service();

请添加图片描述

3Servlet的生命周期 (面试重点)

其中,init( ),service( ),destroy( )是Servlet生命周期的方法。代表了Servlet从“出生”到“工作”再到“死亡 ”的过程。Servlet容器(例如TomCat)会根据下面的规则来调用这三个方法:

出生init( )

1.init( ),当Servlet第一次被请求时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出来,但是这个方法在后续请求中不会在被Servlet容器调用,就像人只能“出生”一次一样。我们可以利用init( )方法来执行相应的初始化工作。调用这个方法时,Servlet容器会传入一个ServletConfig对象进来从而对Servlet对象进行初始化。

工作service( )

2.service( )方法,每当请求Servlet时,Servlet容器就会调用这个方法。就像人一样,需要不停的接受老板的指令并且“工作”。第一次请求时,Servlet容器会先调用init( )方法初始化一个Servlet对象出来,然后会调用它的service( )方法进行工作,但在后续的请求中,Servlet容器只会调用service方法了。

死亡 destory()

3.destory,当要销毁Servlet时,Servlet容器就会调用这个方法,就如人一样,到时期了就得死亡。在卸载应用程序或者关闭Servlet容器时,就会发生这种情况,一般在这个方法中会写一些清除代码

4.其他方法

Servlet 的其它两个方法

getServletInfo( ),这个方法会返回Servlet的一段描述,可以返回一段字符串。

getServletConfig( ),这个方法会返回由Servlet容器传给init( )方法的ServletConfig对象。

5.其他对象
  1. ServletConfig 对象: 对应Servlet的配置, Tomcat创建,
  1. 获取Servlet的初始化参数 参数名,参数值 都是String类型

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

Enumeration getInitParameterNames() 获取所有的初始化参数name

jdk早起的集合: Enumeration

请添加图片描述

在Servlet的配置中,

<servlet>
     <!-- 名称 随意取, 一般取名类名-->
     <servlet-name>AServlet</servlet-name>
     <!--对应的Servlet类, 全限定名(包.类名) -->
     <servlet-class>com.fs.web.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>
  1. ServletContext getServletContext() 得到ServletContext , 最大域对象(Application域)
  1. ServletRequest对象: 请求对象, 后面详细讲 核心 Tomcat创建

核心方法: 获取请求参数

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

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

  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请求: 请求参数通过请求体传递,

      安全性高,  传递字符串, 传递文件数据
  1. ServletResponse对象: 响应对象, 后面详细讲 核心 Tomcat创建

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

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

3.GenericServlet

GenericServlet是Servlet接口的实现类,我们可以通过继承GenericServlet来编写自己的Servlet。下面是GenericServlet类的源代码:

实现Servlet的第二种方式: 继承javax.servlet.GenericServlet抽象类

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

4.HttpServlet

在HttpServlet的service(HttpServletRequest,HttpServletResponse)方法会去判断当前请求是GET还是POST,如果是GET请求,那么会去调用本类的doGet()方法,如果是POST请求会去调用doPost()方法,这说明我们在子类中去覆盖doGet()或doPost()方法即可。

实现Servlet的第三种方式: 继承javax.servlet.http.HttpServlet抽象类

专门处理Http请求的

实际开发中使用方式

请添加图片描述

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

5.Servlet 细节

注解servlet

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

类类型: class interface enum @interface

注解作用: 替换配置文件

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

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

请添加图片描述

  1. servlet是否是一个线程安全? 判断依据: 多个线程是否共享同一资源, 是共享, 线程不安全, 不是共享, 线程安全

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

一定不要再Servlet提供存放数据的属性

  1. Servlet的url-pattern: 给这个servlet绑定一个url
  1. 一个Servlet只能绑定一个Url?

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

  1. url-pattern的写法
  • /字符串 绑定确定的url

  • 结合 * (通配符, 任意)

    • /user/* 前缀匹配, 只要前面是/user开头,后面的任意 /user/a /user/b

    • *.后缀名 后缀匹配, 只要url后面以 后缀名结尾的都匹配 *.do a.do c.do

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

  • /* 匹配所有

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

  1. Servlet的默认创建时机: 第一次请求该Servlet才创建, 第一次惩罚, 第一次请求耗费时间多一点

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

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

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

注解:

@WebServlet(value="/*",loadOnStartup=2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值