【JavaWeb】Servlet学习

本文详细介绍了Servlet的简介、创建及配置步骤,包括在web.xml中的映射配置,以及Servlet生命周期中的init、service、destroy方法。此外,还讨论了ServletMapping、ServletContext的使用,如共享数据、获取初始化参数和请求转发。最后提到了ServletConfig的作用,如获取Servlet的别名和初始化参数。

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

一、Servlet简介

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
想要实现一个Servlet程序,只需要两步:

  1. 实现Servlet接口;
  2. 部署到Tomcat上。

二、编写一个Servlet程序

1、创建工程
2、创建一个Servlet的实现类

package com.lucky.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req,
                         HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter(); // 响应流
        writer.print("hello");
    }

}

注:Servlet接口主要包含以下几种方法,

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

    ServletConfig getServletConfig();

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

    String getServletInfo();

    void destroy();
}

其中和处理请求相关的主要是service方法,Servlet接口有两个GenericServlet和HttpServlet两个实现接口。其中GenericServlet的service方法并没有实现,HttpServlet中service方法进行了实现,根据请求方法的不同选择不同方法。部分实现如下:

 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if (ifModifiedSince < lastModified) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }

3、在web.xml中进行配置,进行关系映射

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!-- 配置服务名称和服务对应类 -->
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.lucky.servlet.HelloServlet</servlet-class>
  </servlet>

  <!--配置请求路径-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

主要需要配置Servlet实现类和在mapping中配置对应url。
为啥需要映射:我们项目中的是java程序,但是最终想要通过浏览器来访问这个程序实现的功能。要想用浏览器访问,我们就需要向web服务中注册写的Servlet,也就是配置servelet标签。并且要告诉浏览器,他连接上服务器之后,需要去哪里访问我们的程序,也就是url。
4、配置tomacat
config选择tomcat解压路径即可
在这里插入图片描述选择artifact
在这里插入图片描述5、启动测试

三、Servlet原理

在这里插入图片描述

四、配置参数

a、Servlet Mapping

1、 一个Servlet可以指定一个映射路径;
2、一个Servlet可以指定多个映射路径;
3、一个Servlet可以用/*指定通用映射路径 ;
4、匹配特定前缀后缀

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>*.lucky</url-pattern>
  </servlet-mapping>

b、ServletContext

web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用。
1、共享数据
所有的Servlet之间共享同一个ServletContext对象,可以相互之间通过ServletContext共享数据。
在HelloServlet中设置属性:

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req,
                         HttpServletResponse resp) throws ServletException, IOException {
//        PrintWriter writer = resp.getWriter(); // 响应流
//        writer.print("hello");

        ServletContext context = this.getServletContext();
        String catName = "牛牛";
        context.setAttribute("catName", catName);
    }

在DataShareServlet 访问设置属性。

public class DataShareServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req,
                         HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();

        String name = (String) context.getAttribute("catName");

        // 设置字符编码,让能够正常显示中文
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");

        PrintWriter writer = resp.getWriter();
        writer.print("我家猫的名字:"+name);


    }

在web.xml中配置DataShareServlet 映射关系。
在这里插入图片描述启动Tomacat,首先,访问hello页面,再访问data页面,即可看到在helloServlet中配置的属性catName。
2、获取初始化参数

context.getInitParameter();

3、请求转发
新建Servelet

public class DemoServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req,
                         HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter(); // 响应流
        writer.print("======hello lucky and niuniu================");

    }
}

新建另一个Servlet将请求转发到第一个Servlet上

public class DispatcherServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req,
                         HttpServletResponse resp) throws ServletException, IOException {

        ServletContext servletContext = this.getServletContext();

        // 设置请求转发路径
        RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/demo1");

        requestDispatcher.forward(req, resp);
    }
}

在xml文件中需要配置。
4、读取资源文件,比如JDBC配置

c、ServletConfig

1、 可以获取 Servlet 程序的别名 servlet-name 的值
2、 获取初始化参数 init-param
3、 获取 ServletContext 对象
在这里插入图片描述init-param在springMVC中可以用来配置spring的配置文件。

五、Servlet生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
Servlet 初始化后调用 init () 方法。init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化

Servlet 调用 service() 方法来处理客户端的请求。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

Servlet 销毁前调用 destroy() 方法。
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。也就是web服务停止的时候,destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值