Servlet

Servlet是JavaEE规范中的重要组成部分,用于处理和响应客户端请求。本文详细介绍了Servlet的定义、手动实现和继承HttpServlet的方式,揭示了其生命周期,并探讨了ServletConfig和ServletContext的作用。此外,还讲解了请求转发和重定向的区别,以及"/"在不同场景下的含义。

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

1.Servlet

1.1 什么是Servlet

1、Servlet是JavaEE规范之一。规范就是接口
2、Servlet 就 JavaWeb 三大组件之一。三大组件分别是: Servlet 程序、Filter 过滤器、Listener监听器。

3、Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。

1.2 手动实现Servlet程序

1、编写一个类去实现 servlet 接口

2、实现 service 方法,处理请求,并响应数据

3、到 web.xml 中去配置 servlet 程序的访问地址

public class HelloServlet implements Servlet {

    public HelloServlet(){
        System.out.println("构造函数执行了。。");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init执行了。。。");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service执行了。。。");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("destroy执行了。。。。");
    }
}
<!--servlet 给Tomcat配置servlet程序-->
<servlet>
    <!--servlet-name 为Servlet程序起一个别名(一般是类名)-->
    <servlet-name>HelloServlet</servlet-name>
    <!--servlet-class 是Servlet程序的全类名-->
    <servlet-class>com.apple.cookie_session.HelloServlet</servlet-class>
</servlet>

<!--servlet-mapping 给servlet程序配置访问地址-->
<servlet-mapping>
    <!--servlet-name 告诉服务器,当前配置的地址给哪个Servlet程序使用-->
    <servlet-name>HelloServlet</servlet-name>
    <!--url-pattern配置访问地址
        / 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
        /helloServlet 表示地址为:http://ip:port/工程路径/helloServlet
    -->
    <url-pattern>/helloServlet</url-pattern>
</servlet-mapping>

1.3 Servlet的生命周期

  1. 执行 Servlet 构造器方法
  2. 执行 init 初始化方法(前两步,是在第一次访问的时候创建Servlet程序会调用)
  3. 执行 service 方法(每次访问都会调用)
  4. 执行 destroy 销毁方法(在web工程停止的时候调用)

执行上面的程序可以看到
在这里插入图片描述

注意:从上面可以看到,Servlet只在第一次访问的时候创建了,后面每次请求时没有再创建,所以Servlet是线程不安全

1.4 通过继承HttpServlet实现Servlet程序

一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序

1、编写一个类去继承 Httpservlet 类

2、根据业务需要重写 doGet或 doPost方法

3、到 web.xml中的配置 Servlet 程序的访问地址

public class HelloServlet2 extends HttpServlet {

    /**
     * 在get请求的时候调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet方法");
    }

    /**
     * 在post请求的时候调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost方法");
    }
}
<servlet>
    <servlet-name>HelloServlet2</servlet-name>
    <servlet-class>com.apple.cookie_session.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet2</servlet-name>
    <url-pattern>/helleServlet2</url-pattern>
</servlet-mapping>

1.5 继承体系

在这里插入图片描述

2. ServletConfig

ServletConfig类从类名上看,就知道是Servlet程序的配置信息类

作用:

  1. 可以获取Servlet程序的别名 servlet-name 的值
  2. 获取初始化参数init-param
  3. 获取ServletContext对象

3. ServletContext

1、ServletContext是一个接口,它表示 Servlet 上下文对象

2、一个 web工程,只有一个 ServletContext 对象实例。

3、ServletContext 对象是一个域对象。

4、ServletContext是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。

什么是域对象?
域对象,是可以像 Map 一样存取数据的对象,叫域对象。这里的域指的是存取数据的操作范围。

作用:

  1. 获取 web.xml中配置的上下文参数 context-param
  2. 获取当前的工程路径,格式: /工程路径
  3. 获取工程部署后在服务器硬盘上的绝对路径
  4. 像 Map一样存取数据

4. 请求转发

请求转发必须要以斜杠打头,/ 斜杠表示地址为: http://ip:port/工程名/ ,映射到IDEA代码的web目录

httpServletRequest.getRequestDispatcher("/index.jsp").forward(servletRequest,servletResponse);
  1. 浏览器地址栏没有变化
  2. 他们是一次请求
  3. 他们共享Request域中的数据
  4. 可以转发到WEB-INF目录下
  5. 是否可以访问工程以外的资源(否)

5. 请求重定向

httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/index.jsp");
  1. 浏览器地址栏会发生变化
  2. 两次请求
  3. 不共享Request域中数据
  4. 不能访问WEB-INF下的资源
  5. 可以访问工程外的资源,比如 https://www.baidu.com/

6. / 的不同含义

/ 斜杠 如果被浏览器解析,得到的地址是: http://ip:port/

/ 斜杠 如果被服务器解析,得到的地址是: http://ip:port/工程路径

特殊情况:response.sendRediect(“/”); 把斜杠发送给浏览器解析。得到 http://ip:port/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值