什么是servlet_初次见你—Servlet(第一篇)

 种一棵树最好的时间是十年前,其次就是现在!

学习Servlet第一篇

前言          上一篇我们通过三篇文章把Spring框架的几个主要模块介绍了一下,涉及到Core,Aop,Dao以及事务控制方面的内容,对于初学者来说只要多加练习,一定可以飞速进步

有的人会问,每天都是在控制器编码,什么时候能在网页上编码?什么时候才能变的高大上?

不急不急,这不今天就来了,初次见你—Servlet,且听我慢慢道来,毕竟心急吃不了热豆腐。。。

什么是Servlet?

Servlet(全称为server  Applet),是运行在Web服务器和应用服务器上的程序,它是作为来自Web浏览器或其他Http客户端的请求和Http服务器上的数据库或应用程序之间的中间层

我们可以通过Servlet收集来自网页表单的用户输入,网页上呈现来自数据库或者其他源的记录,还可以动态的创建页面

Servlet的作用
  • 读取客户端(浏览器)发送的显式数据。包括网页上的HTML表单,或者也可以是来自applet或自定义的HTTP客户端程序的表单
  • 读取客户端(浏览器)发送的隐式的Http请求数据。包括cookies,session等
  • 处理数据并生成结果。这一阶段可能需要访问数据库,访问Web服务,或者直接计算得出对应的响应
  • 发送显式的数据到客户端(浏览器)。例如文本文件(HTML或XML),二进制文件(GIF图像),Excel等
  • 发送隐式的HTTP响应到客户端(浏览器)。例如Cookies或者缓存参数。

Servlet程序入门创建maven web项目

  • 点击File,新建Project项目
8fb2a6d3871737668919770145ef7166.png
  • 选中Maven,勾上Creater from archetype选项,按照体重蓝色选中后点击Next按钮即可

e9ef919dbea7e078bd0a569318ea1b14.png

  • 依次填写groupid和artifactid后点击next即可

63e7b0462ae92cc24f60bee0cd06cb5e.png

  • 选中提前配置好的maven,点击next

72b185e0a73d513a1df9f26c563cb727.png

  • 输入项目名称Spring,点击Finish即可

225c9f204114c9f12c661141bf3cb664.png

  • 这样就创建好了一个名称为Spring的maven项目,结构如下图:

923d57113128e5b592887db49b58a5c4.png

创建MyServlet类,实现Servlet接口
  • 需要重写5个方法,有init(初始化),service(服务),destory(销毁),getServletInfo(Servlet信息),getServletConfig(Servlet配置)
/** * 实现Servlet接口编写Servlet程序 */public class MyServlet implements Servlet {    @Override    public void init(ServletConfig servletConfig) throws ServletException {        System.out.println("init");    }    @Override    public ServletConfig getServletConfig() {        System.out.println("ServletConfig");        return null;    }    @Override    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {        System.out.println("service");    }    @Override    public String getServletInfo() {        System.out.println("getServletInfo");        return null;    }    @Override    public void destroy() {        System.out.println("destroy");    }     }
  • 编辑service方法,向浏览器输出Hello~~~~

    @Override    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {        System.out.println("service");        servletResponse.getWriter().write("hello~~~");    }
  • 配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">    <display-name>Archetype Created Web Applicationdisplay-name>     <servlet>        <servlet-name>MyServletservlet-name>        <servlet-class>com.cn.MyServletservlet-class>    servlet>    <servlet-mapping>        <servlet-name>MyServletservlet-name>        <url-pattern>/MyServleturl-pattern>    servlet-mapping><web-app>

    关于上面的配置信息:

    • 每创建一个Servlet,我们都需要在web.xml文件中添加两个标签,和(可以将这两个标签看做是一组标签)

    • 两个标签内部都会有一个标签,标签的内容可以修改,但是要求更改后的两个标签的内容必须完全一致

    • 标签用于配置Servlet类的全路径名(即包名+类名)

    • 标签用于配置浏览器以什么路径去访问该Servler类,默认的路径是:/类名
例如:MyServlet类配置的标签为/MyServlet,因此我                    们在浏览器上的访问路径就是  

          http://主机名/web项目访问路径/MyServlet

将MyServlet项目添加到Tomcat中
  • 点击右上角的配置按钮,在下拉框中选中Edit Configurations

1141105d3c61c7cd93688075fadd56eb.png

  • 在弹出的Configurations界面中,按照图中标识的序号选中

ca39aec6907ed072faf522a43f88cc7e.png

  • 点击地址栏旁边的按钮,选中需要的Tomcat版本号

0f0de4d007ede4f58e835d0ed632889c.png

  • 点击Deployment,按照图中序号进行操作

4091bf73b9b2b380d7ba3c6dd2ac8bc8.png

  • 在弹出的窗口上选中MyServlet:war exploded

02fbf3a7a27cd85546657e342bf943e5.png

  • 最后一步,依次点击apply, ok按钮,到此我们的项目就已经部署到了Tomcat服务器上
启动服务器,访问自己配置的MyServlet程序

1f01c545e5bcc5337554b16db7a47c22.png

Servlet调用过程

思考:上一节我们通过浏览器访问服务器中的MyServlet,可以在页面上看到MyServlet类返回的结果,那么这个Servlet是如何被调用的?Servlet又是怎么被执行的?

步骤如下:

浏览器发送请求

  • 浏览器发送HTTP请求后,根据请求行中的资源路径获知浏览器访问的是哪一个WEB应用,哪一个资源
  • 然后到web.xml中进行匹配,匹配真实的路径
服务器创建对象
  • 服务器根据真实的路径,通过反射创建Servlet的实例,也就是MyServlet类

调用init()方法
  • MyServlet实例创建后首先要执行init()方法进行初始化
  • 如果我们需要新增一些功能,可以重写此方法
调用service()方法
  • 然后服务器会先创建两个对象,ServletRequest请求对象和ServletResponse响应对象,用来封装浏览器的请求数据和封装向浏览器的响应数据

  • 执行完service方法内的业务后,将响应数据放在ServletResponse响应对象发给浏览器

向浏览器响应

  • 服务器从ServletResponse响应对象中获取要发送给浏览器的数据,按照HTTP协议规定的方式(格式)组织成响应信息,再发送给浏览器,调用过程完成。

Servlet生命周期

  • 加载Servlet : 当我们在浏览器第一次访问Servlet的时候,Tomcat会负责创建该Servlet的实例

  • 初始化 :当Servlet被实例化后,Tomcat会立即调用init()方法初始化对象

  • 处理请求服务:当浏览器访问Servlet的时候,Servlet会调用service()方法处理请求
  • 销毁:当Tomcat关闭时或者检测到Servlet从Tomcat中删除的时候会自动调用destroy()方法,让该实例释放掉所占的空间
  • 卸载:当Servlet调用完destroy()方法后,会等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作
总结:只要访问Servlet,service()方法就会被调用;           init()方法只有在第一次访问的时候才会被初始化调用,后续用户请求时不              再调用;          destroy()方法只有在关闭服务器的时候才会被调用

继承HttpServlet实现Servlet程序

在上面我们是实现了Servlet接口后,需要实现5个方法这样太麻烦了

而接下来我们要介绍的是HttpServlet这个类,它实现了Servlet接口的所有方法,并且还在原有的基础上添加了与HTTP协议处理的一些方法,比Servlet接口更为强大

因此我们在编写Servlet的时候,只需要继承HttpServlet这个类,也就是间接的实现了Servlet接口,我们关注的只是重新我们需要的方法即可

一般我们在开发的时候都是重写doGet()和doPost()方法

public class Demo1 extends HttpServlet {     /**     *  在我们开发的过程中,通常我们使用doGet,doGet来处理请求,     *  但是不论是哪一种方法,处理方式都是一样的     *  因此我们可以在doGet方法时,重新调用会doPost方法进行处理     */    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        this.doPost(req, resp);    }        @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        resp.getWriter().write("hello~~~");    }}
Servlet细节

一个已经被注册的Servlet可以被多次映射

  • 同一个Servlet被映射在多个URL上

    <servlet>        <servlet-name>MyServletservlet-name>        <servlet-class>com.cn.MyServletservlet-class>    servlet>    <servlet-mapping>        <servlet-name>MyServletservlet-name>        <url-pattern>/MyServleturl-pattern>    servlet-mapping>        <servlet-mapping>        <servlet-name>MyServletservlet-name>        <url-pattern>/MyServlet1url-pattern>    servlet-mapping>
  • 无论我访问的是http://localhost:8080/MyServlet还是http://localhost:8080/MyServlet1,被调用的全部都是MyServlet这个类

    b2ad024d843629dd0db31d95bb1dd2e9.png

      9b203cc195210e4493c2a9f44f94b206.png

Servlet映射的URL可以使用通配符

  • 两种格式:
    • * . 扩展名
    • / * 
  • 匹配所有
    <servlet>        <servlet-name>MyServletservlet-name>        <servlet-class>com.cn.MyServletservlet-class>    servlet>    <servlet-mapping>        <servlet-name>MyServletservlet-name>        <url-pattern>/*url-pattern>    servlet-mapping>

77d25897d55f8cae400960ab752b48a4.png

f9619c8895395b1eb55e08cff56d4e92.png

  • 匹配扩展名为.jsp的

 <servlet>        <servlet-name>MyServletservlet-name>        <servlet-class>com.cn.MyServletservlet-class>            servlet>    <servlet-mapping>        <servlet-name>MyServletservlet-name>        <url-pattern>*.jspurl-pattern>    servlet-mapping>

e1168e702e3919334c478cec41932c10.png

be4f90e3b4a72bcd6d682932c633143f.png

Servlet是单例的

上述的Servlet生命周期介绍过,如果浏览器多次对Servlet的请求,一般情况下服务器只创建一个对象,并保存在内存中,为后续的请求做准备

对于每次访问请求,Servlet都会创建一个新的HttpServletRequest对象和HttpServletResponse对象,然后将这两个对象作为参数传递给它的service()方法,service()方法再根据请求的方式调用它的doGet()或者doPost()方法

而当多个用户访问共享的Servlet的时候,服务器会为每个用户创建一个线程,因此一起访问的时候就会出现线程安全问题,对于这种情况我们可以加同步机制synchronized (对象){};

load-on-startup

在元素中配置这样一个标签,那么在Web应用程序启动时,服务器就会加载并创建Servlet的实例,并且调用它的初始化init()方法

   <servlet>        <servlet-name>MyServletservlet-name>        <servlet-class>com.cn.MyServletservlet-class>        <load-on-startup>1load-on-startup>    servlet>    <servlet-mapping>        <servlet-name>MyServletservlet-name>        <url-pattern>/MyServleturl-pattern>    servlet-mapping>

e3a487dba69dd4a934d576cc9328e19b.png

作用:可是实现一些定时任务(定时写日志,定时备份数据等)

ServletConfig对象

作用

当Servlet配置了初始化参数后,web容器在创建Servlet实例对象时,会自动的将这些初始化参数封装到ServletConfig对象中,并在调用init()初始化方法时将ServletConfig对象传递给Servlet

当我们访问请求该Servlet的时候,就可以通过ServletConfig对象获取到那些初始化参数

应用(获取Servlet的初始化参数)
  • 在web.xml文件中为Servlet配置初始化参数
    <servlet>        <servlet-name>Demo2servlet-name>        <servlet-class>com.cn.config.Demo2servlet-class>        <init-param>            <param-name>nameparam-name>            <param-value>juziparam-value>        init-param>    servlet>    <servlet-mapping>        <servlet-name>Demo2servlet-name>        <url-pattern>/Demo2url-pattern>    servlet-mapping>
  • 测试代码
/** * ServletConfig对象 */public class Demo2 extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        this.doPost(req, resp);    }        @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        ServletConfig config = this.getServletConfig();        String name = config.getInitParameter("name");        resp.getWriter().write(name);    }}
  • 输出结果

5ee479f4698d676e8eea2938d162129f.png

ServletContext对象

作用 Tomcat容器在启动时,会为每个WEB应用程序创建一个ServletContext对象,代表着当前的WEB应用 由于一个WEB应用中所有的Servlet都共享着同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯 ServletContext对象通常也被称为context域对象

应用(获取WEB应用的初始化参数)

  • 在web.xml文件中为Servlet配置初始化参数
    <servlet>        <servlet-name>Demo3servlet-name>        <servlet-class>com.cn.context.Demo3servlet-class>    servlet>    <servlet-mapping>        <servlet-name>Demo3servlet-name>        <url-pattern>/Demo3url-pattern>    servlet-mapping>    <servlet>        <servlet-name>Demo4servlet-name>        <servlet-class>com.cn.context.Demo4servlet-class>    servlet>    <servlet-mapping>        <servlet-name>Demo4servlet-name>        <url-pattern>/Demo4url-pattern>    servlet-mapping>
  • 测试代码Demo3代码
/** * ServletContext对象 */public class Demo3 extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        this.doPost(req, resp);    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        ServletContext context = this.getServletContext();        context.setAttribute("name","juzi");    }}
Demo4代码
/** * ServletContext对象 */public class Demo4 extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        this.doPost(req, resp);    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        ServletContext context = this.getServletContext();        Object name = context.getAttribute("name");        System.out.println(name);    }}
  • 输出结果

先访问请求Demo3,再访问请求Demo4

495efa9d08b5560efbd92c20d24bfeea.png

这篇文章主要介绍了Servlet的作用,编写入门Servlet程序,调用过程,生命周期,细节,ServletConfig和ServletContext域对象 

下一篇我们继续开始学习Servlet的继承类HttpServlet的request,response的常见方法和应用。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值