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());
    }
}


相关文章
|
25天前
|
监控 Cloud Native Java
Quarkus 云原生Java框架技术详解与实践指南
本文档全面介绍 Quarkus 框架的核心概念、架构特性和实践应用。作为新一代的云原生 Java 框架,Quarkus 旨在为 OpenJDK HotSpot 和 GraalVM 量身定制,显著提升 Java 在容器化环境中的运行效率。本文将深入探讨其响应式编程模型、原生编译能力、扩展机制以及与微服务架构的深度集成,帮助开发者构建高效、轻量的云原生应用。
126 44
|
19天前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
202 1
|
11天前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
164 0
|
8天前
|
前端开发 Java API
Java入门教程:掌握Spring MVC的双向数据绑定技术
以上步骤展示了如何利用 Spring MVC 实现双向数据绑定:从显示表单、提交表单、验证输入、直至返回结果页面都涉及到不同层次间交互过程,在整个过程都无需手动去编写繁琐代码去手动获取或设置每一项值。
69 20
|
28天前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
292 3
|
2月前
|
Java 测试技术 API
2025 年 Java 开发者必知的最新技术实操指南全览
本指南涵盖Java 21+核心实操,详解虚拟线程、Spring Boot 3.3+GraalVM、Jakarta EE 10+MicroProfile 6微服务开发,并提供现代Java开发最佳实践,助力开发者高效构建高性能应用。
309 4
|
2月前
|
NoSQL Java 关系型数据库
Java 从入门到进阶完整学习路线图规划与实战开发最佳实践指南
本文为Java开发者提供从入门到进阶的完整学习路线图,涵盖基础语法、面向对象、数据结构与算法、并发编程、JVM调优、主流框架(如Spring Boot)、数据库操作(MySQL、Redis)、微服务架构及云原生开发等内容,并结合实战案例与最佳实践,助力高效掌握Java核心技术。
222 0
|
19天前
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
108 0
|
19天前
|
Java API 数据库
2025 年最新 Java 实操学习路线,从入门到高级应用详细指南
2025年Java最新实操学习路线,涵盖从环境搭建到微服务、容器化部署的全流程实战内容,助你掌握Java 21核心特性、Spring Boot 3.2开发、云原生与微服务架构,提升企业级项目开发能力,适合从入门到高级应用的学习需求。
279 0
|
29天前
|
监控 Java API
2025 年全新出炉的 Java 学习路线:从入门起步到实操精通的详细指南
2025年Java学习路线与实操指南,涵盖Java 21核心特性、虚拟线程、Spring Boot 3、微服务、Spring Security、容器化部署等前沿技术,助你从入门到企业级开发进阶。
229 0

热门文章

最新文章