23. Servlet入门 – 用户注册案例

23. Servlet入门 – 用户注册案例

案例-注册

1. 需求

23. Servlet入门 - 用户注册案例
1571732869531

2. 三层架构

  • 软件中分层:按照不同功能分为不同层,通常分为三层:表现层(web层),业务层,持久(数据库)层。
23. Servlet入门 - 用户注册案例
img
  • 不同层次包名的命名
分层 包名(公司域名倒写)
表现层(web层) com.web
业务层(service层) com.service
持久层(数据库访问层) com.dao
JavaBean com.bean
工具类 com.utils
  • 分层的意义:

    1. 解耦:降低层与层之间的耦合性。
    2. 可维护性:提高软件的可维护性,对现有的功能进行修改和更新时不会影响原有的功能。
    3. 可扩展性:提升软件的可扩展性,添加新的功能的时候不会影响到现有的功能。
    4. 可重用性:不同层之间进行功能调用时,相同的功能可以重复使用。
  • 程序设计的宗旨:

    • 高内聚低耦合
    • 可扩展性强
    • 可维护性强
    • 可重用性强

3. 完成注册案例

3.1 注册案例思路

23. Servlet入门 - 用户注册案例
image-20191209154418825

3.2准备工作

3.2.1 创建数据库
create database userdemo;
use userdemo;

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11NOT NULL AUTO_INCREMENT,
  `username` varchar(40DEFAULT NULL,
  `password` varchar(40DEFAULT NULL,
  `address` varchar(40DEFAULT NULL,
  `nickname` varchar(40DEFAULT NULL,
  `gender` varchar(10DEFAULT NULL,
  `email` varchar(20DEFAULT NULL,
  `status` varchar(10DEFAULT NULL,
  PRIMARY KEY (`id`)
ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
3.2.2 创建工程结构
23. Servlet入门 - 用户注册案例
image-20210112083937875
3.2.3 创建JavaBean

在 pojo 包下,创建 User 类,如下:

23. Servlet入门 - 用户注册案例
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
23. Servlet入门 - 用户注册案例
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);
    }
}

执行如下:

23. Servlet入门 - 用户注册案例
image-20210215181045692

好了,在这里我们准备好数据库连接的代码了,下面我们来逐步简单实现用户注册的案例。

4. 注册案例实现

4.1 注册页面

23. Servlet入门 - 用户注册案例
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 查看该页面,如下:

23. Servlet入门 - 用户注册案例
image-20210215174350090

好了,注册页面已经写好了, 下面我们来继续写注册业务的Servlet

4.2 RegisterServlet的代码

23. Servlet入门 - 用户注册案例
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("注册失败");
        }
    }
}

在注册页面执行注册如下:

23. Servlet入门 - 用户注册案例
image-20210215181420271

4.3 在数据库中查看插入的注册数据

mysql> select * from user G
*************************** 1. row ***************************
      id1
username: testuser05
password483212
 address: 深圳
nickname: DevOps海洋的渔夫
  gender: male
   email: 123@qq.com
  status0
1 row in set (0.00 sec)

mysql> 

4.4 创建登录成功的首页 index.html

在上面的 RegisterServlet 注册成功之后,只是在页面中返回 注册成功 的信息。下面我们写一个登录成功的页面,提供页面重定向。

23. Servlet入门 - 用户注册案例
image-20210215181705163

4.5 修改 RegisterServlet 中,注册成功之后跳转至 index.html

23. Servlet入门 - 用户注册案例
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 测试注册页面

23. Servlet入门 - 用户注册案例
image-20210215181915592
23. Servlet入门 - 用户注册案例
image-20210215181933542

5. 小结

  1. 注册本质: 向数据库插入一条记录
  2. 思路(在RegisterServlet)
    • 获得用户提交的数据, 使用BeanUtils封装成User对象
    • 补全User对象(状态)
    • 使用DBUtils向数据库里面插入一条记录
    • 响应


原文始发于微信公众号(海洋的渔夫):23. Servlet入门 – 用户注册案例

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/34460.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!