Java-Servlet技术入门笔记-1

简介: 一、Servlet技术1、什么是ServletServlet是JaveEE规范之一,规范就是接口Servlet是JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器Servlet是运行在服务器上的一个java小程序,它可以接收客户端发送来的请求,并响应数据给客户端 l

一、Servlet技术

1、什么是Servlet

1.Servlet是JaveEE规范之一,规范就是接口

2.Servlet是JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器

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

2、手动实现Servlet程序

1.编写一个类去实现Servlet接口

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

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

package com.first.cyh;
import jakarta.servlet.*;
import java.io.IOException;
public class HelloServlet 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("Hello Servlet!");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
    }
}
<?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">
    <!--给Tomcat配置Servlet程序-->
    <servlet>
        <!--给Servlet程序起一个别名,一般是类名-->
        <servlet-name>HelloServlet</servlet-name>
        <!--Servlet程序的全类名-->
        <servlet-class>com.first.cyh.HelloServlet</servlet-class>
    </servlet>
    <!--给Servlet程序配置访问地址-->
    <servlet-mapping>
        <!--告诉服务器我当前配置的地址给哪个Servlet程序用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--
            配置访问地址
            /斜杠在服务器解析时表示地址为http://ip:port/工程路径
            /hello表示地址为http://ip:port/工程路径/hello
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

3、通过注解配置访问路径url-pattern

Servlet3.0支持注解配置——@WebServlet()

不用再编写xml文件,只需要在实现了Servlet的类加上该注解即可

1.一个servlet可以配置多个访问路径@WebServlet({"/hello","/hi",“nihao”})

2.路径定义规则(xxx可以为*,即通配符)

1./xxx

2./xxx/xxx:多层路径,目录结构

3.*.do

通配符优先级低,会在匹配不到时才访问

4、url地址到Servlet程序的访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7L80toVE-1636276443278)(C:\Users\Ken-Chy\Desktop\大二临时\00自学部分\后端\笔记\url地址如何访问到Servlet程序.png)]

5、Servlet的生命周期

1.执行Servlet构造器方法

2.执行init初始化方法

  • 第一、二步是在第一次访问的时候创建Servlet程序时才调用

3.执行service方法

  • 每次访问都会调用

4.执行destroy销毁方法

  • 在web工程停止的时候调用

6、GET和POST请求的分发处理

package com.first.cyh;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
public class HelloServlet implements Servlet {
    public HelloServlet() {
        System.out.println("你好鸭");
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("初始化成功咯!");
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //ServletRequest和HttpServletRequest是两个接口,HttpServletRequest继承自ServletRequest
        //此处的形式参数其实是HttpServletRequest接口的实现类,因为接口不能实例化,所以传进来的是实现类
        //因为需要实现ServletRequest到HttpServletRequest的强制类型转换(父类到子类)
        //只有父类对象是用子类构造方法生成的才能实现强制转换,所以传进来的参数应该是HttpServletRequest接口的实现类
        //强制类型转换,因为HTTPServletRequest接口才有getMethod方法来判断请求的类型
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
        if(method.equals("GET")){
            doGet();
        }
        else if("POST".equals(method)){
            doPost();
        }
    }
    private void doGet() {
        System.out.println("我是GET请求");
    }
    private void doPost() {
        System.out.println("我是POST请求");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
        System.out.println("拜拜QAQ");
    }
}

7、通过继承HttpServlet实现Servlet程序

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


1.编写一个类去继承HttpServlet类(Servlet是接口,HttpServlet是类)

2.根据业务需要重写doGet()或doPost()方法

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

package com.first.cyh;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello doPost");
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello doGet");
    }
}
<?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>HelloServlet</servlet-name>
        <servlet-class>com.first.cyh.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <!--新增部分-->
    <servlet>
        <servlet-name>HelloServlet2</servlet-name>
        <servlet-class>com.first.cyh.HelloServlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet2</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
</web-app>

8、使用IDEA创建Servlet程序

1.项目结构->Facets->点开Web工程->在底部“根源”处把选项勾上

2.在需要创建Servlet程序的软件包处右键新建->Servlet->为程序命名->去掉创建注解类选项的勾

3.配置文件自动生成改Servlet程序的配置->手动配置该Servlet程序访问路径

4.重写Servlet程序的doGet()和doPost()方法

9、Servlet的继承体系

Servlet接口


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-glUAuPVZ-1636276443280)(C:\Users\Ken-Chy\Desktop\大二临时\00自学部分\后端\笔记\Servlet接口.png)]


Servlet继承体系


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BMmnO2xE-1636276443282)(C:\Users\Ken-Chy\Desktop\大二临时\00自学部分\后端\笔记\Servlet继承关系.png)]


二、ServletConfig类

ServletConfig类是Servlet程序的配置信息类


二者都是由Tomcat负责创建,我们负责使用


Servlet程序默认是第一次访问时创建对象,而ServletConfig是每个Servlet程序创建时就创建一个对应的ServletConfig对象

1、ServletConfig类的三大作用

1.可以获取Servlet程序的别名servlet-name的值

2.获取初始化参数init-param

3.获取ServletContext对象

<!--给Tomcat配置Servlet程序-->
    <servlet>
        <!--给Servlet程序起一个别名,一般是类名-->
        <servlet-name>HelloServlet</servlet-name>
        <!--Servlet程序的全类名-->
        <servlet-class>com.first.cyh.HelloServlet</servlet-class>
        <!--init-param是初始化参数-->
        <!--新增部分-->
        <!--可以配置多个参数-->
        <init-param>
            <!--参数名-->
            <param-name>username</param-name>
            <!--参数值-->
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql//localhost/test</param-value>
        </init-param>
        <!--新增部分-->
    </servlet>
public class HelloServlet implements Servlet {
  @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("初始化成功咯!");
        //获取配置文件中servlet-name的值
        System.out.println("servlet程序的别名是" + servletConfig.getServletName());
        //获取配置文件中的初始化参数init-param
        System.out.println("初始化参数username的值是" + servletConfig.getInitParameter("username"));
        System.out.println("初始化参数url的值是" + servletConfig.getInitParameter("url"));
        //获取ServletContext对象
        System.out.println(servletConfig.getServletContext());
    }
//其他方法省略
}
//输出结果
/*
  初始化成功咯!
    servlet程序的别名是HelloServlet
    初始化参数username的值是root
    初始化参数url的值是jdbc:mysql//localhost/test
    org.apache.catalina.core.ApplicationContextFacade@5cd687b4
*/

2、注意事项

如果Servlet程序继承HttpServlet类时重写了init(ServletConfig config) throws ServletException方法,需要加上super.init(config)

//这是GenericServlet类(HttpServlet类的父类)中的方法
public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }
public void init() throws ServletException {
    }
public ServletConfig getServletConfig() {
        return this.config;
    }
public class HelloServlet2 extends HttpServlet {
    @Override
    //Tomcat生成ServletConfig对象并调用init程序
    public void init(ServletConfig config) throws ServletException {
        //super.init(config);
        //如果没有调用父类的init(config)方法,则Tomcat创建的ServletConfig值丢失
        //即config属性(定义在GenericServlet类中)没有保存值
        System.out.println("doSth");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello doPost");
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello doGet");
        //由于GenericServlet类中的config没有保存值,所以getServletConfig()方法出现空指针异常
        ServletConfig servletConfig = getServletConfig();
        System.out.println("Servlet程序的别名为" + servletConfig.getServletName());
    }
}


相关文章
|
12天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
18天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
18天前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
33 1
|
21天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
24天前
|
存储 安全 Java
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
64 5
|
21天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
32 1
|
21天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
21天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
24天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
39 3
|
24天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
22 1
下一篇
无影云桌面