23. Servlet入门 – 用户注册案例
案例-注册
1. 需求
2. 三层架构
-
软件中分层:按照不同功能分为不同层,通常分为三层:表现层(web层),业务层,持久(数据库)层。
-
不同层次包名的命名
分层 | 包名(公司域名倒写) |
---|---|
表现层(web层) | com.web |
业务层(service层) | com.service |
持久层(数据库访问层) | com.dao |
JavaBean | com.bean |
工具类 | com.utils |
-
分层的意义:
-
解耦:降低层与层之间的耦合性。 -
可维护性:提高软件的可维护性,对现有的功能进行修改和更新时不会影响原有的功能。 -
可扩展性:提升软件的可扩展性,添加新的功能的时候不会影响到现有的功能。 -
可重用性:不同层之间进行功能调用时,相同的功能可以重复使用。 -
程序设计的宗旨:
-
高内聚低耦合 -
可扩展性强 -
可维护性强 -
可重用性强
3. 完成注册案例
3.1 注册案例思路
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 创建工程结构
3.2.3 创建JavaBean
在 pojo 包下,创建 User 类,如下:
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
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);
}
}
执行如下:
好了,在这里我们准备好数据库连接的代码了,下面我们来逐步简单实现用户注册的案例。
4. 注册案例实现
4.1 注册页面
<!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 查看该页面,如下:
好了,注册页面已经写好了, 下面我们来继续写注册业务的Servlet
4.2 RegisterServlet的代码
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("注册失败");
}
}
}
在注册页面执行注册如下:
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 注册成功之后,只是在页面中返回 注册成功 的信息。下面我们写一个登录成功的页面,提供页面重定向。
4.5 修改 RegisterServlet 中,注册成功之后跳转至 index.html
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 测试注册页面
5. 小结
-
注册本质: 向数据库插入一条记录 -
思路(在RegisterServlet) -
获得用户提交的数据, 使用BeanUtils封装成User对象 -
补全User对象(状态) -
使用DBUtils向数据库里面插入一条记录 -
响应
原文始发于微信公众号(海洋的渔夫):23. Servlet入门 – 用户注册案例
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/34460.html