Servlet技术详解(一)

Servlet简介

servlet是Server Applet的简称,翻译过来就是服务程序.好吧,这么说你可能还是不太懂,简单的讲,这个servlet是运行在服务器上的一个小程序,用来处理服务器请求的.进一步讲,我们知道,一般的网页程序,是由我们通过浏览器访问来实现的,在这个过程中,我们的浏览器发送访问请求,服务器接收请求,并对浏览器的请求作出相应的处理.这就是我们熟悉的B/S模型(浏览器-服务器模型).而servlet就是对请求作出处理的组件,运行于支持Java的应用服务器中.

Servlet的作用

在servlet刚刚出现的那个年代,servlet的作用十分复杂,既承担着处理数据的作用,又承担着展示页面的作用,美工人员想要参与开发,基本上是不太现实的,毕竟美工不可能再去花时间将页面做好.
随着时间的推移,出现了MVC思想,也就是模型-界面-控制器思想,极大的简便了开发,也明确了servlet的作用.

这里写图片描述

根据上面这张图,我们就能知道,servlet在其中承担的作用是controller,控制器,起到对数据进行操作的作用.
顺便补充说明一下,最经典的MVC模型就是JSP+JavaBean+Servlet开发的模式.

Servlet处理的信息是什么?

我一直再讲,servlet是对数据进行处理的一个控制器,那么,你一定很好奇,servlet究竟处理的是什么数据?
这里你要知道,我之前在其他文章也讲过,我们的web应用完全是基于http协议的.http协议有请求报文(request)和响应报文(request),请求报文就是浏览器向服务器发送的数据形成的数据对象,同理,相应报文就是服务器向浏览器发送的数据形成的信息,而http协议有两个重要的方法,一个是POST,一个是GET,这两个方法就是向浏览器发送请求的方法.
你应该知道这两个方法在什么地方使用,没错,就是在前端的表单中使用,比如你登录CSDN的时候,提交的用户名和密码,就是被http协议封装成请求报文的形式发送到服务器的,这样,servlet就能够读取请求报文的内容,并对报文进行处理了.

Servlet的开发流程

狭义上讲,servlet是servlet是java语言实现的一个类,所以我们就要根据这个类进行相应的扩展开发.
开发流程如下:

  • 编写一个java类,继承HttpServlet类
  • 重写HttpServlet类的doGet方法和doPost方法
  • 配置web.xml文件,或者使用注解对servlet进行配置

开发流程就是这个样子,我们先来看一下最后一个步骤.

对servlet进行配置

你一定在想,如果我写了好几个servlet,但是前端发送请求的时候,究竟会把请求发送给哪个servlet呢?我在输入某个地址的时候,究竟是由哪个servlet进行响应的呢?
这时候servlet的配置就显得尤为重要.对servlet的配置指定了对前端请求处理究竟是通过哪个servlet.
配置servlet一共有两种方式,一种是使用web.xml文件配置,另外一种就是使用注解配置,下面我们来详解介绍这两种配置方式

  • 使用web.xml文件配置
    注意,servlet的配置内容要写在webapp内部
<webapp>
<!-- 配置一个servlet -->
  <!-- servlet的配置 -->
  <servlet>
      <!-- servlet的内部名称,自定义。尽量有意义 -->
      <servlet-name>MyServlet</servlet-name>
      <!-- servlet的类全名: 包名+简单类名 -->
      <servlet-class>cn.roobtyan.servlet.FirstServlet</servlet-class>
  </servlet>
  <!-- servlet的映射配置 -->
  <servlet-mapping>
      <!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
      <servlet-name>MyServlet</servlet-name>
      <!-- servlet的映射路径(访问servlet的名称) -->
      <url-pattern>/first</url-pattern>
  </servlet-mapping>
</webapp>

当你访问/first的时候,服务器自然就会把请求交给MyServlet进行处理了.

  • 使用@注解配置

新版本的servlet支持使用注解进行配置,这样极大的简便了开发.
注解配置如下:

@WebServlet(name = "LoginServlet",urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet {
}

然后,你在访问/login的时候,服务器同样就会将处理交由LoginServlet进行处理了.
这样是不是非常爽?(^-^)
实际上,注解的作用和web.xml的作用是相同的,一般都是推荐使用注解的方式进行开发,这样十分简便,可读性也变的更加强大.
你一定会好奇,如下:

<url-pattern>/first<url-pattern>

@WebServlet(name = "LoginServlet",urlPatterns = {"/login"})

这里面的url可不可以不这么精确的配置,用一种模糊匹配的方式,就是我访问某种规则的路径的时候,统一调用一个servlet,这当然是可以的了.这就涉及到映射路径的问题了

Servlet映射路径的配置问题

  • 精确匹配
    精确匹配就是我们上面用的那种方式,使用固定的url来访问这个servlet,这种没什么需要说明的
  • 模糊匹配
    模糊匹配就是比较有意思的了,通过模糊匹配,我们可以让好多路径映射到同一个servlet,模糊匹配一般有如下格式
/*                任意路径都映射到这个servlet
/roobtyan/*        /roobtyan下的任意路径映射到该servlet
*.(*.do  *.action *.html)    是这样的:/任意路径.do/action/html

这里面有两点是需要注意的,一是url要么以/开头,要么以*开头,其他的都是非法的

Servlet的生命周期

一般来讲,servlet只会初始化一次,也就是整个过程中只存在一个servlet对象,即便是有多次访问,依然只有一个对象,这个对象是可以复用的.我想你一定会好奇这个servlet究竟是在什么时候创建的,所以就来讲一下servlet的生命周期,所谓的生命周期我们在java基础知识中一定也了解过,就是servlet类究竟在什么时候创建,调用了何种方法,最后在什么时候被销毁.我们之前学过的对象都是自己手动创建,最后由JVM来销毁的,而servlet的整个生命周期,都是由tomacat,也就是服务器控制的
我们以一张图来了解一下:

这里写图片描述
这里写图片描述

可以看到,servlet共有三个关键的方法,分别是init(),service(),destroy().

  • init方法只会调用一次,只是在创建servlet实例的时候才会创建
  • service方法,是进行数据处理的,只要接受了一次请求,就会被调用一次
  • destroy方法,销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象,同样也是调用一次

不知道为什么,应该是编辑器出现了问题,不管我怎么弄,都是不能一起上传,只能分成两张了....

Servlet技术详解(二)


结语

感谢您的阅读,欢迎指正博客中存在的问题,也可以跟我联系,一起进步,一起交流!

微信公众号:进击的程序狗
邮箱:roobtyan@outlook.com
个人博客:http://roobtyan.cn
扫描下面的二维码关注我吧,你将收获到意想不到的东西哟……
给大家准备了一份非常棒的JAVA的视频教程,从JAVA基础一直到JAVAWEB,还有非常强大的项目实战。
就在我的微信公众号里,回复java就可查看,免费的呦!

这里写图片描述

发表评论

电子邮件地址不会被公开。 必填项已用*标注