一、HttpServletRequest

1. HttpServletRequest的作用

  • 每次只要有请求进入 Tomcat 服务器, Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法( doGet 和 doPost) 中给我们使用。 我们可以通过 HttpServletRequest 对象, 获取到所有请求的信息。

    2. 常用的API

    image.png

    image.png
    image.png

3. 请求中文乱码问题

image.png

4. 请求的转发

  • 请求转发是指, 服务器收到请求后, 从一次资源跳转到另一个资源的操作叫请求转发。
  • image.png
  • 代码实现:
    • image.pngsddddddddddsd
    • image.png
  • base标签设置跳转时的参照地址
    1. - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22435741/1629718677195-89e879e2-8330-40ff-ae53-afece5311287.png#align=left&display=inline&height=348&margin=%5Bobject%20Object%5D&name=image.png&originHeight=348&originWidth=775&size=56157&status=done&style=none&width=775)

二、HttpServletResponse

1. HttpServletResponse的作用

  • 每次请求进来, Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。
  • 我们如果需要设置返回给客户端的信息, 都可以通过 HttpServletResponse 对象来进行设置

image.png

2. 如何往客户端回传数据

image.png
image.png
image.png

3. 请求重定向

image.png

三、 书城项目第二阶段

1. JavaEE项目的三层架构

image.png

  • 分层的目的是为了解耦。 解耦就是为了降低代码的耦合度。 方便项目后期的维护和升级。

image.png
Note: POJO(Plain Ordinary Java Object)简单的Java对象

  • 创建book项目的结构
    • image.png

      2. 开始book商城项目

      07.ServLet-2 - 图17
  • 2.1 创建数据库,保存t_user用户表 ``sql // 1. 创建数据库book DROP DATABASE IF EXISTS book; CREATE DATABASE book; USE book; CREATE TABLE t_user(idINT PRIMARY KEY AUTO_INCREMENT,usernameVARCHAR(20) NOT NULL UNIQUE,passwordVARCHAR(32) NOT NULL,email` VARCHAR(200) );

INSERT INTO t_user(username,password,email) VALUES(‘admin’,’admin’,’admin@atguigu.com’); SELECT * FROM t_user;


- 2.2 创建User.java, 保存用户信息
```java
public class User {
    private int id;
    private String username;
    private String password;
    private String email;
}
  • 2.3 数据库工具类的编写
    • 2.3.1 配置常用的工具类:
        1. JdbcUtils: 获取链接和关闭链接
            1. 导入需要的 jar 包(数据库和连接池需要) : druid-1.1.9.jar 、mysql-connector-java-5.1.7-bin.jar 、
                  -  **Druid是一个JDBC组件,它包括三部分: **
                  - DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 <br />
                  - DruidDataSource 高效可管理的数据库连接池。 <br />
                  - SQLParser <br />
              

image.png

     - 2. 在 src 源码目录下编写 jdbc.properties 属性配置文件:
                    - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22435741/1629780959011-70c9b6ee-b211-41e1-8873-610d7aea3588.png#align=left&display=inline&height=346&margin=%5Bobject%20Object%5D&name=image.png&originHeight=346&originWidth=1146&size=40111&status=done&style=none&width=1146)
  • 2.3.2 Java代码的编写JdbcUtils.java ```java package com.atguigu.utils;

import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties;

public class JdbcUtils { private static DruidDataSource dataSource; private static Connection conn; static{ Properties properties =new Properties() ; // 1. 读取jdbc.properties属性的配置文件 InputStream inputStream = com.alibaba.druid.util.JdbcUtils.class.getClassLoader().getResourceAsStream(“jdbc.properties”); try { // 2. 从流中加载数据 properties.load(inputStream); // 3. 创建了数据库连接池 dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties); // 4. 验证连接池是否创建成功 System.out.println(dataSource.getConnectCount()); }catch (Exception e){ e.printStackTrace(); } }

/**
 * 获取数据库连接池中的连接
 * @return 如果返回失败,说明获取连接失败
 */
public static Connection getConnection(){
    conn = null;
    try{
        conn = dataSource.getConnection();
    }catch (Exception e){
        e.printStackTrace();
    }
    return conn;
}

/**
 * 关闭连接
 * @param connection
 */
public static void close(Connection connection){
    if(connection !=null){
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
public static void main(String[] args) {
}

}


- 2.4 BaseDao的编写
```java
package com.atguigu.utils;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class JdbcUtils {

    private static DruidDataSource dataSource;
    private static Connection conn;
    static{
        Properties properties =new Properties() ;
        // 1. 读取jdbc.properties属性的配置文件
        InputStream inputStream = com.alibaba.druid.util.JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
        try {
            // 2. 从流中加载数据
            properties.load(inputStream);
            // 3. 创建了数据库连接池
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
            // 4. 验证连接池是否创建成功
            System.out.println(dataSource.getConnectCount());
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接池中的连接
     * @return 如果返回失败,说明获取连接失败
     */
    public static Connection getConnection(){
        conn = null;
        try{
            conn = dataSource.getConnection();
        }catch (Exception e){
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 关闭连接
     * @param connection
     */
    public static void close(Connection connection){
        if(connection !=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
    }

}
  • 2.5 BaseDao.java类的具体UserDao测试类 ```java package com.atguigu.dao.impl;

import com.atguigu.dao.UserDao; import com.atguigu.pojo.User;

public class UserDaoImpl extends BaseDao implements UserDao { @Override public User queryUserByUsername(String username) { String sql = “select id, username,password,email from t_user where username = ?”; return queryForOne(User.class, sql, username); }

@Override
public User queryUserByUsernameAndPassword(String username, String password) {
    String sql = "select `id`, `username`,`password`,`email` from t_user where username = ? and password = ?";
    return queryForOne(User.class, sql, username);
}

@Override
public int saveUser(User user) {
    String sql = "insert into t_user(`username`,`password`,`email`) values(?,?,?)";
    return update(sql, user.getUsername(),user.getPassword(),user.getEmail());
}

}

```

  • 2.6 Service业务层

image.png

  • 2.7 编写 web 层
    • 2.7.1、 实现用户注册的功能
      • 图解用户注册的流程:
        • image.png
    • 2.7.2 修改 regist.html 和 regist_success.html 页面
      - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22435741/1629802290312-e6b884ad-6a83-483d-b7f4-27d1f8416866.png#align=left&display=inline&height=511&margin=%5Bobject%20Object%5D&name=image.png&originHeight=511&originWidth=782&size=207358&status=done&style=none&width=782)
      
    • 2.7.3 编写 RegistServlet 程序
      • image.png
      • image.png
    • 2.7.4 LoginServlet 程序
      • image.png