Servlet入门

Servlet入门

Servlet概述

Servlet(server applet):用JAVA编写的运行在服务器端的小程序,作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

  • 狭义上:指java语言实现的一个接口
  • 广义上:指任意一个实现了这个Servlet接口的类。
  • 作用:由服务器执行对象创建,方法调用,主要用于交互式地浏览和修改数据生成Web内容,可充当MVC模式中的控制器。

MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

  • Model(模型) 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
  • View(视图) 视图代表模型包含的数据的可视化。
  • Controller(控制器) 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。

MVC 模式以JSP+JavaBean+Servlet模式为例,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。

Servlet的创建步骤

  1. 创建JavaEE项目
  2. 定义一个类实现Servlet接口,及接口中的所有抽象方法
    package cn.simplek9.web;
    import javax.servlet.*;
    import javax.servlet.annotation.WebServlet;
    import java.io.IOException;
    public class servlet2 implements Servlet {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
    
        }
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("Servlet来了...");
        }
        @Override
        public String getServletInfo() {
            return null;
        }
        @Override
        public void destroy() {
    
        }
    }
    
    
  3. 配置Servlet

路径定义规则:

  1. /xxx:路径匹配
  2. /xxx/xxx:多层路径,目录结构
  3. *.do:扩展名匹配
  • 方法一:在项目的web/WEB-INF/web.xml的根标签中配置
    <servlet>
        <servlet-name>demo1</servlet-name><!--给该servlet所起的名字-->
        <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class> <!--src下的全类名-->
    </servlet>
    
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern><!--servlet对应的资源路径-->
    </servlet-mapping>
    ```
    
  • 方法二:类前使用@WebServlet("资源路径")注解配置,可以不需要web.xml(需要Servlet3.0及以上)
@WebServlet("/demo2")
//@WebServlet(urlPatterns="/demo2")
//@WebServlet(value="/demo2")
//@WebServlet(urlPatterns="/d2","/dd2","/ddd2")定义多个路径

Servlet执行原理

alt1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径 2. 查找web.xml文件,是否有对应的标签体内容。

  1. 如果有,则再找到对应的全类名
  2. tomcat会将字节码文件加载进内存,并且创建其对象
  3. 调用其方法

Servlet的生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

生命周期的方法

  1. init方法:在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。(一次)
    • Servlet默认创建于用户第一次调用对应于该 Servlet 的 URL 时,但是也可以指定 Servlet 在服务器第一次启动时被加载。
      • 可在web.xml的标签下配置
        <!--第一次被访问时-->
        <load-on-startup>的值为负数
        <!--在服务器启动时-->
        <load-on-startup>的值为0或正整数
        
    • Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
      • 多个用户同时访问时,可能存在线程安全问题。
      • 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
  2. service方法:每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。(多次)
    • 每次访问Servlet时,Service方法都会被调用一次。
    • 单实例多线程
  3. destroy方法:服务器关闭时,调用destroy方法释放资源,servlet对象被标记为垃圾回收,然后由JVM 的垃圾回收器销毁Servlet(一次)
  4. getServletConfig方法:获取ServletConfig对象,即Servlet的配置对象
  5. getServletInfo方法:获取Servlet的一些信息,如版本,作者等等 alt

Servlet的体系结构

Servlet -- 接口 | GenericServlet -- 抽象类 | HttpServlet -- 抽象类

  • 用继承以下两个抽象类来实现Servlet的方式可以不用初始实现接口中的所有抽象方法,选择性的只实现service方法
  • GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
    • 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
  • HttpServlet:对http协议的一种封装,简化操作
    1. 定义类继承HttpServlet
    2. 复写doGet/doPost方法
@WebServlet("/demo4")
public class servlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet...");//在浏览器URL输入路径直接请求是get方式
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost...");
    }
}
全部评论

相关推荐

老粉都知道小猪猪我很久没更新了,因为秋招非常非常不顺利,emo了三个月了,接下来说一下我的情况吧本人是双非本&nbsp;专业是完全不着计算机边的非科班,比较有优势的是有两段大厂实习,美团和字节。秋招面了50+场泡池子泡死的:滴滴&nbsp;快手&nbsp;去哪儿&nbsp;小鹏汽车&nbsp;不知名的一两个小厂其中字节13场&nbsp;两次3面挂&nbsp;两次2面挂&nbsp;一次一面挂其中有2场面试题没写出来,其他的都是全a,但该挂还是挂,第三次三面才面进去字节,秋招加暑期总共面了22次字节,在字节的面评可以出成书了快手面了8场,2次实习的,通过了但没去,一次2面挂&nbsp;最后一次到录用评估&nbsp;至今无消息滴滴三面完&nbsp;没几天挂了&nbsp;所有技术面找不出2个问题是我回答不上来的,三面还来说我去过字节,应该不会考虑滴滴吧,直接给我干傻了去哪儿一天速通&nbsp;至今无消息小鹏汽车hr&nbsp;至今无消息美团2面挂&nbsp;然后不捞我了,三个志愿全部结束,估计被卡学历了虾皮二面挂&nbsp;这个是我菜,面试官太牛逼了拼多多二面挂&nbsp;3道题也全写了&nbsp;也没问题是回答不出来的&nbsp;泡一周后挂腾讯面了5次&nbsp;一次2面挂&nbsp;三次一面挂,我宣布腾讯是世界上最难进的互联网公司然后还有一些零零散散的中小厂,但是数量比较少,约面大多数都是大厂。整体的战况非常惨烈,面试机会少,就算面过了也需要和各路神仙横向对比,很多次我都是那个被比下去的人,不过这也正常,毕竟谁会放着一个985的硕士不招,反而去招一个双非读化学的小子感觉现在互联网对学历的要求越来越高了,不仅仅要985还要硕士了,双非几乎没啥生存空间了,我感觉未来几年双非想要进大厂开发的难度应该直线上升了,唯一的打法还是从大二刷实习,然后苟个转正,不然要是去秋招大概率是炮灰。而且就我面字节这么多次,已经开始问很多ai的东西了,你一破本科生要是没实习没科研懂什么ai啊,纯纯白给了
不知名牛友_:爸爸
秋招你被哪家公司挂了?
点赞 评论 收藏
分享
01-30 16:13
浙江大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务