实训Day02

今日知识

  • 请求方式
  • Servlet
  • Web三层架构
  • JDBC

请求方式(RESTful规范)

请求

含义

包含请求的全部信息

组成

  • 请求行
    • 请求路径、请求协议和版本、请求方式
  • 请求头
    • 用来描述请求的额外信息
  • 请求体
    • 用来携带请求参数
    • get请求没有请求体,参数拼接在url后面
    • post请求有请求体

五种请求

GET(SELECT)

从服务器取出资源(一项或多项)

POST(CREATE)

在服务器新建一个资源

PUT(UPDATE)

在服务器更新资源(客户端提供改变后的完整资源)

PATCH(UPDATE)

在服务器更新资源(客户端提供改变的属性)

DELETE(DELETE)

在服务器删除资源

Servlet

Servlet开发步骤

  • extends HttpServlet
  • 重写方法
    • doGet(req, resp)
    • doPost(req, resp)
  • 配置
    • 注解
      • @WebServlet(“/路径”) /路径代表该 servlet 类能处理的请求路径
    • web.xml

Servlet生命周期

  1. 执行Servlet构造器方法,加载Servlet的时候。如果Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例。
  2. 执行init()初始化方法,当Servlet被实例化后,Tomcat调用init()方法初始化这个对象。
  3. 执行service()方法,所有的请求都是service()方法处理的。
  4. 执行destroy()销毁方法,当Web工程停止的时候会自动调用destroy()方法(注意:一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁)。

Servlet文件配置开发

1
2
3
4
5
6
7
8
9
<servlet>
<servlet-name>名字</servlet-name>
<servlet-class>全限定包名</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>名字</servlet-name>
<url-pattern>路径绑定</url-pattern>
</servlet-mapping>

JavaWeb目录结构

  • 根目录
    • META-INF
      • MANIFEST.MF
      • INDEX.LIST
      • x.SF
      • x.DSA
      • services/
    • WEB-INF
      • web.xml

        • 配置文件
      • classes

        • 所有可用的class文件
      • lib

        • 所需要的JAR包
      • src

        • 源码目录,按照包名结构放置各个文件
      • database.properties

        • 数据库配置文件
      • tags

        • 存放自定义标签文件
      • jsp

      • jsp2

Web三层架构

三层

表现层

主要是指与用户交互的界面,用于接收用户输入的数据和显示处理后用户需要的数据。

业务逻辑层

主要是指与用户交互的界面,用于接收用户输入的数据和显示处理后用户需要的数据。

数据访问层

与数据库打交道,主要实现对数据的增、删、改、查。

优点

  • 高内聚
    • 尽可能类的每个成员方法只完成一件事。
  • 低耦合
    • 减少类内部,一个成员方法调用另一个成员方法。

JDBC

含义

java操作数据库的一套规范[接口]
数据库厂商实现了该规范[驱动包]
包含了java代码和数据库通信细节

Maven导入JDBC

在项目根目录下的 pom.xml 文件中添加

1
2
3
4
5
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>

开发步骤

  • 导入驱动
  • 写代码
    • 注册驱动
    • 获取连接
      • Connection conn = DriverManager.getConn("url", "账号", "密码")
    • 获取操作数据库对象
      • PrepareStatement statement = conn.prepareStatement("sql")
      • executeUpdate [insert update delete]
      • executeQuery [select]
    • 资源释放

案例

注册驱动

1
2
3
4
5
6
7
8
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
// 通过反射将数据库驱动导入jvm中
} catch (ClassNotFoundException e) {
System.out.println("ClassNotFoundException");
}
}

获取链接

1
2
3
4
5
6
7
8
9
10
public static Connection getConnection(String url, String account, String password){
Connection con = null;
try {
con = DriverManager.getConnection(url, account, password);
// 通过驱动管理器获取连接
} catch (SQLException e) {
System.out.println("SQLException");
}
return con;
}

资源释放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void close(ResultSet resultSet, PreparedStatement preparedStatement, Connection con) {
try {
// 分别对结果集、预处理语句和数据库连接进行释放
if (resultSet != null) {
resultSet.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}

综合使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public static void main(String[] args) {
Connection con = JDBCUtil.getConnection("jdbc:mysql://localhost:3306/nacl", "root", "yjh983258108.");
// 获取数据库连接
if (con == null) {
System.out.println("nullpointer");
return;
}
String sql = "select * from book where title like ?";
// 查询数据库语句
// ? 号为占位符
PreparedStatement stat = null;
ResultSet resultSet = null
try {
stat = con.prepareStatement(sql);
// 获得预处理语句
stat.setString(1, "%三体%");
// 为占位符填充数据
resultSet = stat.executeQuery();
// 获取查询结果数据集
while (resultSet.next()) {
// 逐个打印作者名
System.out.println(resultSet.getString("author"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
JDBCUtil.close(resultSet, stat, con);
}
}

实训Day02
http://yjh-2860674406.github.io/2023/07/06/编程/实训/Day02/
Author
Ye JinHua
Posted on
July 6, 2023
Licensed under