JavaWeb三大组件之Servlet

本文介绍了JavaWeb中的核心组件Servlet,包括Servlet的定义、实现方式、客户端访问Servlet的原理,以及ServletConfig、GenericServlet、Httpservlet和ServletContext的相关知识。详细讲解了Servlet接口的实现、web.xml配置、Servlet生命周期和Servletcontext的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是Servlet

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

  1. 接收请求;
  2. 处理请求;
  3. 完成响应。

例如:客户端发出登录请求,或者注册请求,这些请求都应该由 Servlet来完成处理!

2.实现 Servlet的方式

实现 Servlet有三种方式:

  1. 实现 javax. servlet. Servlet接口;
  2. 继承 javax. servlet. GenericServlet类;
  3. 继承javax.servlet. Httpservlet类;

通常我们会去继承 Httpservlet 类来完成我们的 Servlet

2.1 实现Servlet接口

Servlet对象由服务器创建,并且由服务器来调用相应的方法!

import javax.servlet.*;
import java.io.IOException;

public class MyServlet implements Servlet {

    /**
     *  生命周期方法  servlet对象创建后马上执行,并仅执行一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
   
    }

    /**
     *  生命周期方法 每次处理请求都是调用这个方法
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
   
    }
    
    /**
     * 生命周期方法 servlet对象被销毁之前调用
     */
    @Override
    public void destroy() {

    }
    
    /**
     * 获取servlet配置信息
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    
    /**
     * 获取servlet的信息
     */
    @Override
    public String getServletInfo() {
        return null;
    }
}

2.2客户端访问Servlet

项目web.xml文件 (在 ${CATALINA_HOME}\conf\web.xml中配置的的内容,相当于写到了每个项目的 web,xml中。)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>haha</servlet-name>
        <servlet-class>MyServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>haha</servlet-name>
        <url-pattern>/visitPath</url-pattern>
    </servlet-mapping>
</web-app>
  1. 客户端访问:http://ip:port/projectName/visitPath 时,在<servlet-mapping>标签中进行映射
  2. 匹配 <url-pattern> 中设置的指定访问路径,得到<servlet-name>设置的值
    <url-pattern> 标签注意事项:
    (1) 它设置的值必须是以"/"开头! (*.do可以,表示的是:/xxx/aaa/.do)
    (2) 可以在< servlet-mapping>中给出多个 url-pattern,即可多个路径访问同一个servlet
    (3) 在 pattern中使用通配符:“*”,星号可以匹配任何URL前缀或后綴。不能在中间
  3. 根据设置的name值,在 <servlet>标签中获取将要访问的<servlet-class>
2.3 servlet相关类
I ServletConfig

服务器加载解析web.xml文件,web.xml中的<servlet>标签,生成ServletConfig的对象;每个ServletConfig对象,对应一段web.xml中Servlet的配置信息。

  1. String getServletName();获取的是< servlet-name>中的内容:
  2. ServletContext getServletContext();获取servletContext上下文对象!
  3. String getInitParameter(String name);通过<init-param>标签name名称获取指定初始化参数的值
  4. Enumeration getlnitParameterNames();获取所有<init-param>标签的初始化参数的名称
2.4 继承GenericServlet类

源码(有删减)

package javax.servlet;

import java.io.IOException;
import java.io.Serializable;
import java.util.Enumeration;
import java.util.ResourceBundle;

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
    private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings");
    private transient ServletConfig config;

    public GenericServlet() {
    }

    public void destroy() {
    }

    public String getInitParameter(String name) {
        ServletConfig sc = this.getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        } else {
            return sc.getInitParameter(name);
        }
    }

    public Enumeration getInitParameterNames() {
        ServletConfig sc = this.getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        } else {
            return sc.getInitParameterNames();
        }
    }

    public ServletConfig getServletConfig() {
        return this.config;
    }

    public ServletContext getServletContext() {
        ServletConfig sc = this.getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        } else {
            return sc.getServletContext();
        }
    }

    public String getServletInfo() {
        return "";
    }

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

    public void init() throws ServletException {
    }

    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    public String getServletName() {
        ServletConfig sc = this.getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        } else {
            return sc.getServletName();
        }
    }
}

从源码上看非常简单,GenericServlet 抽象类实现了Servlet接口和ServletConfig接口,并进行了进一步的优化,具体体现在:

  • 添加了全局的servletConfig变量,tomcat服务器执行init方法后进行赋值
  • 添加了servletConfig的方法
  • 添加了init()方法,提供了其子类可以从写该方法,可以实现初始化参数的需求
2.5 继承Httpservlet类

Httpservlet 实现的逻辑:

Httservlet extends Genderservlet{
// 生命周期方法
  void service(ServletRequest, ServletResponse) 
  
 - 强转两个参数为http协议相关的类型,
 - 调用本类的service(HttpServletRequest,HttpServletReSponse)方法

// 参数已经是Http议相关的,使用起来就更加方便
  void service(HttpServletReSponse,HttpServletReSponse)
- 它会通过 request得到当前请求的请求方式,例如:GET或PosT
- 根据请求方式再调用 doGet()或 dopost()方法

void doGet()  —>重写
void doPost() —>重写
}
  1. 一个类型的servlet只创建一个实例对象,线程不安全
  2. 默认情况下,服务器会在某个 Servlet.第一次收到请求时创建它。也可以在 web. xml中对 Servlet中进行配置,使服务器启动时就创建Servlet
    <load-on-startup>非负数 </load-on-startup>(数字越小越优先创建)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>haha</servlet-name>
        <servlet-class>MyServlet</servlet-class>
        <load-on-startup>1 </load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>haha</servlet-name>
        <url-pattern>/visitPath</url-pattern>
    </servlet-mapping>
</web-app>
2.6 Servletcontext

一个项目只有一个 Servletcontext对象!我们可以在N多个 Servlet.中来获取这个唯一的对象,使用它可以给多个 Servlet传递数据!这个对象在 Tomcat启动时就创建,在 Tomcat关闭时才会销毁!

  1. 域对象功能 (域对象就是用来在多个Servlet中传递数据!)

四大域对象:PageContext、ServletRequest、HttpSession、ServletContext
所有域对象都有存取数据的功能,城对象内部有一个Map,用来存储数据
void setAttribute(String name,obiect value);存储(key ,value)数据
Object getAttribute(String name);根据key获取对象value
void removeAttribute(String name);根据key移除对象
Enumeration getAttributeNames();获取所有域属性的名称;

  1. 获取应用初始化参数
    可以配置公共的始化参数,为所有Servlet而用!使用 Servletcontext来获取在 web,xm文件中配置的应用初始化参数!(注:<init-param>标签初始化参数是为Servlert配置的)
    <context-param>
        <param-name>globalParam</param-name>
        <param-value>ServletContextValue</param-value>
    </context-param>

项目中使用:getInitParameter(String name)方法获取配置的值。

  1. 获取资源路径/流

String getRealPath(String fileName); 获取文件的资源路径(含盘符,E:/xxx/…)
InputStream getResourceAsStream(String fileName);获取文件流对象
Set getResourcePaths(String path);获取当前路径下所有资源路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值