百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

带你深入理解javaweb之Servlet详解

yuyutoo 2024-11-05 13:26 3 浏览 0 评论

Servlet详解

在java web中不管是使用J2EE原生的servlet/jsp还是使用springmvc/springboot,在web服务器看来只是对外暴露出来的Servlet,而这个Servlet是javax.servlet.Servlet接口,该接口定义了Servlet引擎与Servlet程序之间通信的协议约定。

public interface Servlet {
    void init(ServletConfig config) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest req, ServletResponse res)
    throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

而为了简化开发,jdk中提供了一个实现Servlet接口的简单的Servlet类,javax.servlet.GenericServlet,该类实现了Servlet的基本功能

jdk针对HTTP协议专门提供了一个Servlet类,javax.servlet.http.HttpServlet,该类继承于GenericServlet类,在其基础上针对HTTP的特点进行扩充,一般编写程序时继承HttpServlet即可

Servlet注册与运行

Servlet编写好之后需要在web.xml中进行注册和映射才能被Servlet容器加载从而被外界访问

    <!-- 注册Servlet -->    
    <servlet>
        <servlet-name>HW</servlet-name>
        <servlet-class>com.zhanghe.study.servlet.HelloWorldServlet</servlet-class>
              <!-- 配置servlet初始化init时中ServletConfig参数-->
        <init-param>
          <param-name>name</param-name>
          <param-value>john</param-value>
        </init-param>
        <!-- servlet加载时机 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
        <!-- 映射Servlet -->
    <servlet-mapping>
        <servlet-name>HW</servlet-name>
          <!-- 开头的/表示web用用程序的根目录 -->
        <url-pattern>/HelloWorld</url-pattern>
    </servlet-mapping>

tomcat中的web.xml包含有一个缺省的Servlet

    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

ServletConfig

对于每个Servlet可能在启动时都需要一些初始化参数,而所有的Servlet是交由Servlet引擎去实例化的,那么也就是需要将每个Servlet的初始化参数也都配置到web.xml中,Servlet引擎将Servlet容器对象和Servlet的配置信息封装到ServletConfig中,并在Servlet初始化时将ServletConfig传递给该Servlet。javax.servlet.ServletConfig接口的作用就是用来定义ServletConfig对象所需要对外提供的方法

public interface ServletConfig {
    String getServletName();

    ServletContext getServletContext();

    String getInitParameter(String var1);

    Enumeration<String> getInitParameterNames();
}

Servlet引擎装载并创建一个Servlet对象后,会调用该对象的init(ServletConfig config)方法,Servlet中的ServletConfig getServletConfig()方法会返回init传入的ServletConfig对象

// 获取指定的属性
config.getInitParameter("name")
// 获取所有的属性
config.getInitParameters()

servlet生命周期

生命周期相关方法,servlet生命周期中的方法全是由servlet容器来调用的

  • 构造器
  • init方法
  • service方法
  • destory方法

init方法

init方法在第一次创建servlet时被调用,在后续每次请求时都不会被调用。

当用户调用servlet的时候,该servlet的一个实例就会被创建,并且为每一个用户产生一个新的线程,init()用于进行一些初始化数据的加载和处理,这些数据会被用于servlet的整个生命周期

void init(ServletConfig config) throws ServletException;

该方法是由servlet容器调用的

重写init方法

GenericServlet实现了Servlet和ServletConfig,是一个抽象类,并对init(ServletConfig var1)方法进行了一层封装,有一个ServletConfig成员变量,在init()方法中进行了初始化,使得可以直接在GenericServlet中直接使用ServletConfig方法

而我们平时写Servlet大多是继承于HttpServlet类的,在对init方法进行重写时,重写不带参的init()方法即可

//GenericServlet类

public void init(ServletConfig config) throws ServletException {
    this.config = config;
    this.init();
}

public void init() throws ServletException {
}

该方法由GenericServlet的调用,如果需要使用到ServletConfig则调用getServletConfig()方法来获取

service方法

service方法是实际处理请求的方法,servlet容器调用service方法来处理请求,并将响应写会到客户端,每次服务器接收到一个新的servlet请求时,服务器会产生一个新的线程来调用服务

void service(ServletRequest req, ServletResponse re) throws ServletException, IOException;

处理请求逻辑

HttpServlet继承了GenericServlet,重写了service方法,将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse,并根据不同的请求方式进行分发,doGet/doPost/doHead等

servlet可以在任何协议下访问 ,写的Servlet必须实现Servlet接口,在http协议下可以使用HttpServlet ,用来给Web访问的

在HttpServlet类中对于service()方法进行了处理,根据请求方式的不同,将请求分发到了不同的方法,而我们一般情况下写Servlet也是继承自HttpServlet的,所以在写请求处理逻辑时,只需要重写doGet()和doPost()方法即可

// HttpServlet类

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String msg = lStrings.getString("http.method_get_not_supported");
    this.sendMethodNotAllowed(req, resp, msg);
}

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String msg = lStrings.getString("http.method_post_not_supported");
        this.sendMethodNotAllowed(req, resp, msg);
}

GET方法

GET方法时浏览器向web服务器传递信息的默认方法,会在地址栏上产生很长的字符串,且GET方法有大小限制,请求字符串中最多只能有1024个字符

POST方法

POST方法不将请求信息放到地址中

destroy方法

destory()方法只在servlet生命周期结束时被调用一次。可以在destory()方法中进行一些资源的清理,如关闭数据库连接、停止后台线程等

ServletContext

每个Web应用程序都是一个独立的Servlet容器,每个Web应用程序分别用一个ServletContext对象表示,javax.servlet.ServletContext接口定义了ServletContext需要对外提供的方法,Servlet通过这些方法来和ServletContext容器进行通信

  • 该对象代表当前WEB应用,可以获取到web应用的信息,一个Web应用只有一个ServletContext对象
  • 可以使用ServletConfig的getServletContext()获取到ServletContext
  • 可以获取web应用的初始化参数,这是全局的方法,在web.xml中配置
  • 获取web应用某个文件的绝对路径(在服务器上的路径,不是部署前的方法) getRealPath
  • 获取当前应用的名称 getContextPath
  • 获取当前web应用的某一个文件对应的输入流 getResourceAsStream() path是相对于当前web应用的根目录

相关推荐

URL URI傻傻分不清楚,dart告诉你该怎么用

简介如果我们要访问一个网站,需要知道这个网站的地址,网站的地址一般被称为URL,他的全称是UniformResourceLocator。那么什么是URI呢?...

你最深爱的编程语言其实很烂

我最近写了几篇比较严肃的博客,是关于一些沮丧的事情,结果我开始有些忧郁。很严重。所以,我想应该说些比较轻松的事情。我要做的就是数落大家最喜欢的编程语言。你会问我为什么,为什么要搞这种恶作剧?亲爱的朋友...

路由器交换机基础配置6——命令行显示信息设置

一、控制命令行显示信息设备中的部分命令执行后会出现提示、警告、执行结果等显示信息,用户可以控制这些显示信息的显示方式,以方便阅读。1、提示和警告信息提供中、英文两种语言显示。可以通过language-...

python是一种什么类型的编程语言

Python(英国发音:/'paθn/美国发音:/'paθɑn/)是一种广泛使用的解释型、高级编程、通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年。可以视之为一种改良(加入一些其他编程...

60年了,LISP语言的进化史是否会引发你对AI未来的新思考?

图:pixabay作为长期垄断AI领域的高级计算机语言程序,Lisp语言到底经过了怎样的变迁?也许,我们可能已经忘记了一些在今天仍然有用的东西,或者说,至少了解这些历史对一些新的想法产生有所影响。o2...

Java 和 JavaScript 的关系

Java和JavaScript不同之处:●出身不同:Javascript与Java是由不同的公司开发的不同产品。Javascript是Netscape公司的脚本语言,而Java...

Micro:命令行文本编辑器 (Go)

Micro是一款基于终端的文本编辑器,使用Go开发。Micro是个命令行编辑器,主要特性是易用,直观,并且包含所有现代化终端的优点。功能:易用常用快捷键绑定(ctrl-s,ctrl-c,...

7 行代码 3 分钟:从零开始实现一门编程语言

本文最初发布于MattMight的个人博客。...

码上去学海南公司:C语言到底能干什么?我列举了8种经典案例

虽然C语言执行速度极快,占用资源极少,但是它使用起来非常麻烦,完全没有Java、Python、Go、JavaScript、C#等方便和灵活,会严重拖慢项目的开发进度,所以,通常只有在“不得不”的情...

什么是 JavaScript?

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师然冬...

新人如何自学安卓手机软件开发?

当我们问一个人,你是做什么的,听到我是做软件开发的,不由自主就会感觉,这个人好厉害。越来越多的人投身于软件开发行业,可能有些人本身不是学这个专业的,出于对这个行业的热爱,自学软件开发。现在这个社会,多...

Android开发基础入门(一):UI与基础控件

Android基础入门前言:...

第02章 《小Z安卓程序员之路》Android Studio

不积跬步无以至千里,不积小流无以成江海!!每天进步一点点我是杨哲丶,一个梦想把科技和艺术结合在一起的程序猿!!小Z在开始查询的如何使用SVN和如何使用Git版本控制工具的时候,发现网上大部分居然是关于...

支付宝团队 | 移动客户端实战教程(iOS和Android)

今天给大家推荐一个非常好的PPT,是github在线的,是支付宝团队内部分享技术用的PPT,适合Web端和移动端的同学入门客户端开发,是我见过的最详细的《iOS&Android开发从入门到...

只需二步,就可以在win11操作系统上运行Android程序,非常简单

你想像过吗,只需几个简单的步骤即可在你的Windows电脑上运行Android应用程序。现在,在Windows11中运行安卓应用程序现在就像在手机上运行应用程序一样简单。微软和亚马逊联手打造了数千款...

取消回复欢迎 发表评论: