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


相关文章
|
1天前
|
安全 Java Apache
Java中的数据安全与隐私保护技术
Java中的数据安全与隐私保护技术
|
1天前
|
存储 缓存 NoSQL
Java中的内存数据库与缓存技术
Java中的内存数据库与缓存技术
|
1天前
|
存储 算法 安全
实现Java应用的数据加密与解密技术
实现Java应用的数据加密与解密技术
|
1天前
|
存储 安全 算法
Java中的数据加密与数字签名技术
Java中的数据加密与数字签名技术
|
2天前
|
Java UED 程序员
解决Java中的IllegalArgumentException异常的技术实践
解决Java中的IllegalArgumentException异常的技术实践
|
2天前
|
网络协议 Java
Java网络编程基础与Socket实现技术
Java网络编程基础与Socket实现技术
|
2天前
|
并行计算 Java 大数据
Java中的高效并行计算与多线程编程技术
Java中的高效并行计算与多线程编程技术
|
1天前
|
监控 网络协议 Java
Java中的WebSocket实时通信技术详解
Java中的WebSocket实时通信技术详解
|
1天前
|
分布式计算 Java Apache
Java中的RPC远程过程调用技术详解
Java中的RPC远程过程调用技术详解
|
1天前
|
存储 分布式计算 大数据
Java中的大数据处理与分析技术
Java中的大数据处理与分析技术