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仍然存在,销毁的方式有
-
Servlet 容器关闭
当 Tomcat 或其他 Servlet 容器关闭时,所有已加载的 Servlet 实例都会被销毁。
-
应用被卸载
当从 Servlet 容器中卸载应用(如删除 WAR 包)时,该应用中的所有 Servlet 实例会被销毁。
-
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进行遍历输出

浙公网安备 33010602011771号