23. Servlet入门 - 用户注册案例
2023-03-14 22:33:47 时间
23. Servlet入门 - 用户注册案例
案例-注册
1. 需求
1571732869531
2. 三层架构
- 软件中分层:按照不同功能分为不同层,通常分为三层:表现层(web层),业务层,持久(数据库)层。
img
- 不同层次包名的命名
分层 | 包名(公司域名倒写) |
---|---|
表现层(web层) | com.web |
业务层(service层) | com.service |
持久层(数据库访问层) | com.dao |
JavaBean | com.bean |
工具类 | com.utils |
- 分层的意义:
- 解耦:降低层与层之间的耦合性。
- 可维护性:提高软件的可维护性,对现有的功能进行修改和更新时不会影响原有的功能。
- 可扩展性:提升软件的可扩展性,添加新的功能的时候不会影响到现有的功能。
- 可重用性:不同层之间进行功能调用时,相同的功能可以重复使用。
- 程序设计的宗旨:
- 高内聚低耦合
- 可扩展性强
- 可维护性强
- 可重用性强
3. 完成注册案例
3.1 注册案例思路
image-20191209154418825
3.2准备工作
3.2.1 创建数据库
create database userdemo;
use userdemo;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(40) DEFAULT NULL,
`password` varchar(40) DEFAULT NULL,
`address` varchar(40) DEFAULT NULL,
`nickname` varchar(40) DEFAULT NULL,
`gender` varchar(10) DEFAULT NULL,
`email` varchar(20) DEFAULT NULL,
`status` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
3.2.2 创建工程结构
image-20210112083937875
3.2.3 创建JavaBean
在 pojo 包下,创建 User 类,如下:
image-20210112084156225
public class User implements Serializable{
private Integer id;
private String username;
private String password;
private String address;
private String nickname;
private String gender;
private String email;
private String status;//1 表示已激活 0表示未激活
//...
}
3.3 配置Maven依赖
3.3.1 配置数据库相关依赖
- mysql驱动
- druid
- dbutils
- beanutils
在项目的 pom.xml 中设置依赖,如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lijw</groupId>
<artifactId>javaweb_userdemo_01</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 打包的方式 -->
<packaging>war</packaging>
<!-- 项目属性,设置jdk 以及 编码 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- 设置依赖 -->
<dependencies>
<!-- dbutils 依赖 -->
<!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils -->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
<!-- druid依赖 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>
<!-- mysql连接依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<!-- 导入 BeanUtils 依赖 -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<!-- 导入 commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!--引入junit的依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--引入servlet的依赖-->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
3.4 需要的工具类和配置文件
- DruidUtil
- druid.properties
image-20210215171518750
3.4.2 druid.properties
配置 druid 连接数据库的相关参数。
url=jdbc:mysql://localhost:3306/userdemo?rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
username=root
password=Lijw******密码**********0
driverClassName=com.mysql.jdbc.Driver
initialSize=10
maxActive=10
3.4.1 DruidUtil:用于获取数据库连接池
package com.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.util.Properties;
public class DruidUtil {
private static DataSource dataSource;
static {
try {
//1. 创建Properties对象
Properties properties = new Properties();
//2. 将配置文件转换成字节输入流
InputStream is = DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties");
//3. 使用properties对象加载is
properties.load(is);
//druid底层是使用的工厂设计模式,去加载配置文件,创建DruidDataSource对象
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource(){
return dataSource;
}
}
3.4.3 DruidUtilTest:测试 DruidUtil 获取数据库连接
public class DruidUtilTest {
@Test
public void getDataSource() throws SQLException {
// 获取druid的数据库连接池
DataSource dataSource = DruidUtil.getDataSource();
//测试插入数据
QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
String sql = "insert into user(`username`, `password`, `address`, `nickname`, `gender`, `email`) values (?,?,?,?,?,?)";
//将user用户存储的数据 插入 到数据库中
int i = queryRunner.update(sql, "testuser05", "483212", "深圳", "DevOps海洋的渔夫", "male", "123@qq.com");
System.out.println("插入的数据行数: " + i);
}
}
执行如下:
image-20210215181045692
好了,在这里我们准备好数据库连接的代码了,下面我们来逐步简单实现用户注册的案例。
4. 注册案例实现
4.1 注册页面
image-20210215174146646
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<!-- 提交注册信息的表单:每个字段的name值需要与数据库的字段名一致,方便后续使用BeanUtils.populate封装数据 -->
<form action="/userDemo/register" method="post">
用户名<input type="text" name="username"><br>
密码<input type="text" name="password"><br>
昵称<input type="text" name="nickname"><br>
地址<input type="text" name="address"><br>
邮箱<input type="text" name="email"><br>
性别<input type="radio" name="gender" value="male">男
<input type="radio" name="gender" value="female">女
<br>
<input type="submit" value="注册">
</form>
</body>
</html>
启动 tomcat 查看该页面,如下:
image-20210215174350090
好了,注册页面已经写好了, 下面我们来继续写注册业务的Servlet
4.2 RegisterServlet的代码
image-20210215181311490
package com.servlet;
import com.pojo.User;
import com.utils.DruidUtil;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.dbutils.QueryRunner;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
/**
* @author Aron.li
* @date 2021/2/15 17:44
*/
@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 在最前面解决乱码问题:请求参数的中文乱码,响应的中文乱码
//解决请求参数的中文乱码
request.setCharacterEncoding("UTF-8");
//解决响应中文乱码
response.setContentType("text/html;charset=utf-8");
//2. 获取所有的请求参数
Map<String, String[]> parameterMap = request.getParameterMap();
System.out.println("接收到的参数: ");
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
for (String value : entry.getValue()) {
System.out.println(entry.getKey() + ": " + value);
}
}
//3. 使用BeanUtils 将parameterMap中的数据,存储到User对象中
User user = new User();
//设置默认的status为"0"
user.setStatus("0");
try {
// 使用 BeanUtils.populate 将接收到的参数保存到 user 对象中
BeanUtils.populate(user,parameterMap);
//4. 使用DBUtils将用户信息存储到数据库
//这里需要mysql驱动、druid、dbutils的jar包
QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
String sql = "insert into user values (null,?,?,?,?,?,?,?)";
//将user用户存储的数据 插入 到数据库中
queryRunner.update(sql,user.getUsername(),user.getPassword(),user.getAddress(),
user.getNickname(),user.getGender(),user.getEmail(),user.getStatus());
//如果注册成功,则向浏览器响应一句"注册成功"
response.getWriter().write("注册成功");
} catch (Exception e) {
e.printStackTrace();
//如果注册失败,则向浏览器响应一句"注册失败"
response.getWriter().write("注册失败");
}
}
}
在注册页面执行注册如下:
image-20210215181420271
4.3 在数据库中查看插入的注册数据
mysql> select * from user G
*************************** 1. row ***************************
id: 1
username: testuser05
password: 483212
address: 深圳
nickname: DevOps海洋的渔夫
gender: male
email: 123@qq.com
status: 0
1 row in set (0.00 sec)
mysql>
4.4 创建登录成功的首页 index.html
在上面的 RegisterServlet 注册成功之后,只是在页面中返回 注册成功 的信息。下面我们写一个登录成功的页面,提供页面重定向。
image-20210215181705163
4.5 修改 RegisterServlet 中,注册成功之后跳转至 index.html
image-20210215182016293
package com.servlet;
import com.pojo.User;
import com.utils.DruidUtil;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.dbutils.QueryRunner;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
/**
* @author Aron.li
* @date 2021/2/15 17:44
*/
@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 在最前面解决乱码问题:请求参数的中文乱码,响应的中文乱码
//解决请求参数的中文乱码
request.setCharacterEncoding("UTF-8");
//解决响应中文乱码
response.setContentType("text/html;charset=utf-8");
//2. 获取所有的请求参数
Map<String, String[]> parameterMap = request.getParameterMap();
System.out.println("接收到的参数: ");
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
for (String value : entry.getValue()) {
System.out.println(entry.getKey() + ": " + value);
}
}
//3. 使用BeanUtils 将parameterMap中的数据,存储到User对象中
User user = new User();
//设置默认的status为"0"
user.setStatus("0");
try {
// 使用 BeanUtils.populate 将接收到的参数保存到 user 对象中
BeanUtils.populate(user,parameterMap);
//4. 使用DBUtils将用户信息存储到数据库
//这里需要mysql驱动、druid、dbutils的jar包
QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
String sql = "insert into user values (null,?,?,?,?,?,?,?)";
//将user用户存储的数据 插入 到数据库中
queryRunner.update(sql,user.getUsername(),user.getPassword(),user.getAddress(),
user.getNickname(),user.getGender(),user.getEmail(),user.getStatus());
//如果注册成功,则向浏览器响应一句"注册成功"
// response.getWriter().write("注册成功");
//如果注册成功,跳转至 index.html
response.sendRedirect("/userDemo/index.html");
} catch (Exception e) {
e.printStackTrace();
//如果注册失败,则向浏览器响应一句"注册失败"
response.getWriter().write("注册失败");
}
}
}
4.6 测试注册页面
image-20210215181915592
image-20210215181933542
5. 小结
- 注册本质: 向数据库插入一条记录
- 思路(在RegisterServlet)
- 获得用户提交的数据, 使用BeanUtils封装成User对象
- 补全User对象(状态)
- 使用DBUtils向数据库里面插入一条记录
- 响应
相关文章
- 数据孤岛是业务效率的无声杀手
- 2023展望:新的一年将给大数据分析领域带来什么?
- 阿里云ADB基于Hudi构建Lakehouse的实践
- 大数据在医疗保健领域的使用案例
- 微软增加说明:KB5021751 更新扫描已经 / 即将过时 Office 过程中不会触碰用户隐私
- 2022 Gartner全球云数据库管理系统魔力象限发布 腾讯云数据库入选
- 场景化、重实操,分享一个实时数仓实践案例
- Arctic的湖仓一体践行之路
- 分布式计算MapReduce究竟是怎么一回事?
- 淘系数据模型治理优秀实践
- 大数据分析对医疗保健的影响
- 当我们说大数据Hadoop,究竟在说什么?
- 2022年及以后大数据的五个发展趋势
- 网易严选离线数仓治理实践
- 2023 年数据治理趋势
- 一份“靠谱”的年度经营计划,你学会了吗?
- 漫谈对大数据的思考
- 测试一下,读懂数据的能力,你有吗?
- 用艺术的眼光探索数据之美
- 聊聊数据分析成果如何落地