javaEE servlet基础

javaEE servlet基础

前言:Servlet 是javaee中用于后端开发的api,运行在服务器端,负责处理客户端(如浏览器)的 HTTP 请求并

生成动态响应。它是 Java EE(现 Jakarta EE)规范的一部分,广泛应用于企业级 Web 开发,通过学习该api有助

于我们在日后学习java的一些高级框架比如Spring MVC等,这些框架都是基于servlet。

1.0 路由设置

我们这里选用Marven来管理servlet项目,首先学习一下servlet的路由方式

首先我们重载一下doGet方法,这个方法来自于HttpServlet,会在客户端向映射地址发送get请求时触发

由于网页的访问本身就是一个get请求,所以该方法会在访问我们路由绑定的地址页面时触发

package com.javaeeexample.eetest;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class IndexServlet extends HelloServlet{
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("IndexServlet doGet");
        //super.doGet(request, response);
    }
}

我们需要在web.xml进行配置,设置其的路由地址

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
         version="6.0">
    <servlet>
        <servlet-name>Index</servlet-name>
        <servlet-class>com.javaeeexample.eetest.IndexServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Index</servlet-name>
        <url-pattern>/index</url-pattern>
    </servlet-mapping>
</web-app>

其中

    <servlet>
        <servlet-name>Index</servlet-name>
        <servlet-class>com.javaeeexample.eetest.IndexServlet</servlet-class>
    </servlet>

设置了一个对应的servlet,将我们在前面写的类绑定了上去

下面的servlet-mapping则是设置路由,设置后我们在访问url-pattern的地址时就会触发上面的servlet从而

触发到我们绑定的类,因为存在http请求,所以doGet方法会被触发

除了上面这种路由方式,我们还可以直接在类的代码上面实现路由

具体例子如下

package com.javaeeexample.eetest;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/index")
public class IndexServlet extends HelloServlet{
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String name = request.getParameter("name");
        PrintWriter out = response.getWriter();
        out.println("name:" + name);
        //super.doGet(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String pass = req.getParameter("pass");
        PrintWriter out = resp.getWriter();
        out.println("pass:" + pass);
        //super.doPost(req, resp);
    }
}

我们在类的前面添加@WebServlet("/index")也实现了绑定路由

1.1 数据接受 以及输出

我们在doGet函数中接受了两个参数,一个是request 一个是response,我们同调用request的方法获得传入的数

据,通过response来进行输出,来看一个简单的例子

package com.javaeeexample.eetest;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

public class IndexServlet extends HelloServlet{
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String name=request.getParameter("name");
        PrintWriter out=response.getWriter();
        out.println("name:"+name);
        //super.doGet(request, response);
    }
}

用该方式我们可以获得通过get方法传递的键名为name的值,并将其进行输出

与之类似,如果我们想要获得post传递的数据,还存在有doPost方法,具体的使用如下

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String pass = req.getParameter("pass");
        PrintWriter out = resp.getWriter();
        out.println("pass:" + pass);
        //super.doPost(req, resp);
    }

doPost方法在我们使用post方法向路由绑定地址发送数据时触发

还有很多其他的方法可以让我们去重载,当使用其对应的方法传递数据时触发

1.2 一些其他的方法

我们创建的servlet类在第一次请求时应用启动时在servlet容器(例如tomcat)中完成实例化,整个过程为

加载类 → 调用构造函数 → 调用 init 方法,我们可以重载对应的方法去实现一些功能

例如:

package com.javaeeexample.eetest;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    // 显式定义无参构造函数
    public IndexServlet() {
        System.out.println("IndexServlet 无参构造函数");
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String name = request.getParameter("name");
        PrintWriter out = response.getWriter();
        out.println("name:" + name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String pass = req.getParameter("pass");
        PrintWriter out = resp.getWriter();
        out.println("pass:" + pass);
    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("init");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service");
        super.service(req, resp); // 确保请求分发
    }
}

在控制台输出的结果分别为:

IndexServlet 无参构造函数
init
service

service方法在每次发送请求时都会触发

表明了这几个函数运行的顺序,需要注意的是,如果我们不止到我们重载的函数原本是干什么的,最好在重载时执

行一下其父的对应函数,以免出现错误,比如service还有个功能是给doPost等方法进行请求分发,我们必须保证

该功能的实现

需要注意的是,当我们初次访问对应的路由地址时,这三个函数都会触发,但当servlet初始化创建完毕后,

刷新页面时只会触发service,此时用的还是原来的servlet,一个servlet,在创建后,即使我们退出对应的页面

servlet仍然存在,销毁的方式有

  1. Servlet 容器关闭

    当 Tomcat 或其他 Servlet 容器关闭时,所有已加载的 Servlet 实例都会被销毁。

  2. 应用被卸载

    当从 Servlet 容器中卸载应用(如删除 WAR 包)时,该应用中的所有 Servlet 实例会被销毁。

  3. Servlet 配置更新

    如果修改了 Servlet 的配置(如 web.xml 或注解),容器可能会重新加载 Servlet,导致旧的实例被销毁。

对应的destory就是销毁时触发的方法

1.3 数据库操作

JDBC(Java Database Connectivity) 是 Java 提供的一套用于连接和操作关系型数据库的

标准 API。它允许 Java 应用程序通过统一的接口与各种数据库(如 MySQL、PostgreSQL、Oracle 等)进行交

互。接下来学习用jdbc来操作mysql数据库,首先我们要到maven官网下载Mysql-java的数据库驱动,再在项目目

录下新建驱动文件夹,将驱动放在驱动文件夹下,最后将驱动添加为库。

接下来在代码中注册数据库驱动和建立数据库连接:

        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://localhost:3306/mydb";
        Connection connection = DriverManager.getConnection(url, "root", "XXXXXXX");

接下来就是执行我们的sql语句并输出了:

package com.javaeeexample.eetest;

import javax.xml.transform.Result;
import java.sql.*;

public class Database {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url="jdbc:mysql://localhost:3306/mydb";
        Connection connection = DriverManager.getConnection(url, "root", "XXXXXXX");
        String sql ="select * from users ;";
        Statement statement = connection.createStatement();
        ResultSet result =statement.executeQuery(sql);
        while (result.next()){
            int id = result.getInt("id");
            String name = result.getString("username");
            String password =result.getString("password");
            System.out.println("id:"+id+"\n"+"name:"+name+"\n"+"password:"+password);
        }

    }
}

Statement对象用于执行sql语句,需要注意的是,executeQuery方法专门用来执行查询操作,其他的操作要使用

其他的方法。最后获得的result需要通过next进行遍历输出

posted @ 2025-01-24 23:08  折翼的小鸟先生  阅读(39)  评论(0)    收藏  举报