一、HttpServletRequest
1. HttpServletRequest的作用
- 每次只要有请求进入 Tomcat 服务器, Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法( doGet 和 doPost) 中给我们使用。 我们可以通过 HttpServletRequest 对象, 获取到所有请求的信息。
2. 常用的API
3. 请求中文乱码问题
4. 请求的转发
- 请求转发是指, 服务器收到请求后, 从一次资源跳转到另一个资源的操作叫请求转发。
- 代码实现:
- sddddddddddsd
- base标签设置跳转时的参照地址
- ![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 对象来进行设置
2. 如何往客户端回传数据
3. 请求重定向
三、 书城项目第二阶段
1. JavaEE项目的三层架构
- 分层的目的是为了解耦。 解耦就是为了降低代码的耦合度。 方便项目后期的维护和升级。
Note: POJO(Plain Ordinary Java Object)简单的Java对象
- 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 配置常用的工具类:
- JdbcUtils: 获取链接和关闭链接
- 导入需要的 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 />
- 导入需要的 jar 包(数据库和连接池需要) : druid-1.1.9.jar 、mysql-connector-java-5.1.7-bin.jar 、
- JdbcUtils: 获取链接和关闭链接
- 2.3.1 配置常用的工具类:
- 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业务层
- 2.7 编写 web 层
- 2.7.1、 实现用户注册的功能
- 图解用户注册的流程:
- 图解用户注册的流程:
- 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 程序
- 2.7.4 LoginServlet 程序
- 2.7.1、 实现用户注册的功能