• “综合”web项目编写------手把手0基础教学(二)


    上一节介绍了编写综合项目的基本流程  “综合”web项目编写------手把手0基础教学(一)

    这里将继续介绍项目的编写,一个一个功能挨个实现。

    目录

    实现用户的登录功能

    一 . 编写工具包---封装数据库链接

    二 . 构建数据模型

    三 . 构建功能模型

    四.编写客户端jsp文件

    五 . 编写控制端Servlet

    第一步.先注册servlet

    第二步.设置请求字符集编码格式(“utf-8”)

    第三步.获取请求参数

    第四步.调取功能模型中的功能(这里调用的是登录login功能)

    第五步.返回响应


    实现用户的登录功能

    一 . 编写工具包---封装数据库链接

    我们在功能编写之前可以先做一下准备工作,编写一下工具包,将一些要重复使用的代码封装起来,比如:数据库的链接(对数据库增删改查都要使用),来避免后面重复写。具体代码如下:

    1. package com.my.until;
    2. import java.sql.Connection;
    3. import java.sql.Driver;
    4. import java.sql.DriverManager;
    5. import java.sql.SQLException;
    6. public class DBUntil { //封装数据库的链接
    7. //属性
    8. private static final String DRIVER = "com.mysql.jdbc.Driver";
    9. private static final String URL = "jdbc:mysql://localhost:3306/a01";
    10. private static final String USER = "root";
    11. private static final String PASSWORD = "1234";
    12. //方法
    13. //链接数据库
    14. public Connection getConn(){
    15. try {
    16. //注册驱动
    17. Class.forName(DRIVER);
    18. //链接数据库
    19. return DriverManager.getConnection(URL,USER,PASSWORD);
    20. } catch (ClassNotFoundException e) {
    21. e.printStackTrace();
    22. } catch (SQLException e) {
    23. e.printStackTrace();
    24. }
    25. return null;
    26. }
    27. }

    二 . 构建数据模型

    编写entity包,创建实体类

    实体类是根据数据表进行创建的,我们在先前的数据库中构建了一个users表,那么我们可以根据表来构建用户(user)模型

    用户类此时实现序列化接口,然后据数据库中的表定义属性,自动生成方法getter()和setter()

    具体代码和注释如下:

    1. package com.my.entity;
    2. import java.io.Serializable;
    3. //Serializable是序列化接口,实现序列化是为了数据库表中的每一条数据保存到对象中,不再在控制台输出,在客户端显示
    4. public class Users implements Serializable {//实现一个序列化接口
    5. //属性:
    6. //根据数据库表中的属性构建
    7. private Integer id;
    8. private String userName;
    9. private String userPwd;
    10. //方法:getter和setter方法,alt+insert自动生成
    11. public Integer getId() {
    12. return id;
    13. }
    14. public void setId(Integer id) {
    15. this.id = id;
    16. }
    17. public String getUserName() {
    18. return userName;
    19. }
    20. public void setUserName(String userName) {
    21. this.userName = userName;
    22. }
    23. public String getUserPwd() {
    24. return userPwd;
    25. }
    26. public void setUserPwd(String userPwd) {
    27. this.userPwd = userPwd;
    28. }
    29. }

    三 . 构建功能模型

    数据模型构建完,要开始搭建功能模型,我们首先编写功能接口,该接口中存放用户可以实现的功能名,具体代码如下:

    1. package com.my.dao;
    2. //定义功能
    3. import com.my.entity.Users;
    4. public interface UsersDao {
    5. //登录功能
    6. Users login(String userName, String userPwd);
    7. }

    完成功能接口后,我们要在Impl文件中对接口进行实现,重写接口中的方法,具体代码如下:

    1. package com.my.dao.Impl;
    2. import com.my.dao.UsersDao;
    3. import com.my.entity.Users;
    4. import com.my.until.DBUntil;
    5. import java.sql.Connection;
    6. import java.sql.PreparedStatement;
    7. import java.sql.ResultSet;
    8. import java.sql.SQLException;
    9. public class UsersDaoImpl extends DBUntil implements UsersDao {
    10. private Connection conn = null;
    11. private PreparedStatement ps = null;
    12. private ResultSet rs = null;
    13. //编写登录功能
    14. @Override
    15. public Users login(String userName, String userPwd) {
    16. Users user = null;
    17. //获取链接,注册驱动
    18. conn = getConn(); //工具包中关于数据库链接的方法
    19. //编写sql语句
    20. String sql = "select userName,userPwd from Users where userName = ?";
    21. try {
    22. //把sql语句发送到数据库中
    23. ps = conn.prepareStatement(sql);
    24. //给?赋值
    25. ps.setString(1,userName);
    26. //执行sql语句
    27. rs = ps.executeQuery();
    28. //判断rs是否为空
    29. if(rs.next()){
    30. user = new Users();
    31. user.setId(rs.getInt(1));
    32. user.setUserName(rs.getString(2));
    33. user.setUserPwd(rs.getString(3));
    34. }
    35. } catch (SQLException e) {
    36. e.printStackTrace();
    37. }
    38. return user;
    39. }
    40. }

    四.编写客户端jsp文件

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: dell
    4. Date: 2022/11/17
    5. Time: 17:31
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <html>
    10. <head>
    11. <title>登录页面title>
    12. head>
    13. <body>
    14. <center>
    15. <form action="/UsersServlet?action=login" method="post">
    16. <h1>欢迎登录h1>
    17. <hr color="red" width="50%">
    18. <p>账号:<input type="text" name="user" value="user">p>
    19. <p>密码:<input type="password" name="password" value="password">p>
    20. <p>
    21. <input type="submit" value="登录"/>
    22. p>
    23. form>
    24. center>
    25. body>
    26. html>

    效果:

    五 . 编写控制端Servlet

    我们上面编写的jsp页面目前是无法实现功能的,下面将通过Servlet的编写让实现登录

    编写Servlet实现登录功能,主要分为五大步,其余的就是在这五步中进行拓展

    第一步.先注册servlet

    用servlet注册完毕,才真正将我们的user类创建完毕,注册Servlet有两种方式,一种是通过注解@WebServlet,另一种则是更改配置文件web.xml

    第二步.设置请求字符集编码格式(“utf-8”)

    第三步.获取请求参数

    第四步.调取功能模型中的功能(这里调用的是登录login功能)

    注意:在调用功能时,要在最开头创建功能模型对象

    第五步.返回响应

    响应分为两种状态:

    1.成功状态:将请求信息保存到session作用域中(目的:在浏览器关闭之前,信息都可以一直使用)

    2.失败状态:采用重定向,返回页面

    以下附详细代码注释:

    1. package com.my.servlet;
    2. import com.my.dao.Impl.UsersDaoImpl;
    3. import com.my.dao.UsersDao;
    4. import com.my.entity.Users;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.annotation.WebServlet;
    7. import javax.servlet.http.HttpServlet;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import java.io.IOException;
    11. //注册Servlet,注册完Servlet才是真正创建了User类
    12. @WebServlet("/UsersServlet")
    13. public class UsersServlet extends HttpServlet {
    14. //创建功能模型对象
    15. UsersDao m = new UsersDaoImpl();
    16. //重写方法
    17. @Override
    18. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    19. doPost(req,resp);
    20. }
    21. @Override
    22. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    23. //设置字符集编码格式
    24. req.setCharacterEncoding("utf-8");
    25. //获取请求参数
    26. String action = req.getParameter("action");
    27. //判断action值
    28. if("login".equals(action)){ //登录
    29. //获取参数
    30. String user = req.getParameter("user");
    31. String password = req.getParameter("password");
    32. //调用登录功能
    33. Users auser = m.login(user, password);
    34. //返回响应:有两种状态,成功/失败
    35. if(auser!=null){//登录成功
    36. //将信息保存到session作用域中(目的:在浏览器关闭之前,信息都可以一直被保存)
    37. req.getSession().setAttribute("auser",auser);
    38. req.getRequestDispatcher("/success.jsp").forward(req,resp);
    39. System.out.println("登录成功!");
    40. }else{
    41. //重定向返回登录页面
    42. resp.sendRedirect("/index.jsp");
    43. System.out.println("登录失败,请检查账号密码!");
    44. }
    45. }
    46. }
    47. }

    到这里,我们最简单的登录功能已经实现,但是我们可以对此进行拓展,比如登录成功可以记住密码,实现自动登录等.......下面,我们实现记住密码和自动登录两个功能

    由于我们之前已经将数据模型和功能模型搭建好了,后面我们在添加功能时就不用再重复搭建,直接编写功能,修改jsp页面即可

    注:这里我们的记住密码和自动登录属于登录功能,无需在功能模型中添加,只修改jsp,servlet代码

    我们对servlet代码进行补充,详细注释见代码:

    1. package com.my.servlet;
    2. import com.my.dao.Impl.UsersDaoImpl;
    3. import com.my.dao.UsersDao;
    4. import com.my.entity.Users;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.annotation.WebServlet;
    7. import javax.servlet.http.Cookie;
    8. import javax.servlet.http.HttpServlet;
    9. import javax.servlet.http.HttpServletRequest;
    10. import javax.servlet.http.HttpServletResponse;
    11. import java.io.IOException;
    12. //注册Servlet,注册完Servlet才是真正创建了User类
    13. @WebServlet("/UsersServlet")
    14. public class UsersServlet extends HttpServlet {
    15. //创建功能模型对象
    16. UsersDao m = new UsersDaoImpl();
    17. //重写方法
    18. @Override
    19. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    20. doPost(req,resp);
    21. }
    22. @Override
    23. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    24. //设置字符集编码格式
    25. req.setCharacterEncoding("utf-8");
    26. //获取请求参数
    27. String action = req.getParameter("action");
    28. //判断action值
    29. if("login".equals(action)){//登录
    30. //获取请求参数:
    31. String user =req.getParameter("user");
    32. String password = req.getParameter("password");
    33. String jiZhu = req.getParameter("jiZhu");
    34. String auto = req.getParameter("auto");
    35. //先执行登录
    36. Users auser = m.login(user,password);
    37. //判断登录是否成功!
    38. if (auser != null){//登录成功
    39. //把信息保存会话级作用域:
    40. req.getSession().setAttribute("auser",auser);
    41. //判断是否记住密码:
    42. //记住账号密码和记住密码
    43. Cookie user_cookie = new Cookie("user",user);
    44. Cookie password_cookie = new Cookie("password",password);
    45. Cookie jiZhu_cookie = new Cookie("jiZhu",jiZhu);
    46. Cookie auto_cookie = new Cookie("auto",auto);
    47. if("1".equals(jiZhu)){//记住密码
    48. //判断是否自动登录:
    49. if("1".equals(auto)){
    50. auto_cookie.setMaxAge(60*60);
    51. }
    52. //设置记住密码的时间
    53. user_cookie.setMaxAge(60*60);
    54. password_cookie.setMaxAge(60*60);
    55. jiZhu_cookie.setMaxAge(60*60);
    56. }else{//忘记密码
    57. //设置记住密码的时间
    58. user_cookie.setMaxAge(0);
    59. password_cookie.setMaxAge(0);
    60. jiZhu_cookie.setMaxAge(0);
    61. auto_cookie.setMaxAge(0);
    62. }
    63. //把记住密码添加到响应当中
    64. resp.addCookie(user_cookie);
    65. resp.addCookie(password_cookie);
    66. resp.addCookie(jiZhu_cookie);
    67. resp.addCookie(auto_cookie);
    68. //请求转发到成功页面!!!
    69. req.getRequestDispatcher("/success.jsp").forward(req,resp);
    70. System.out.println("登录成功!");
    71. }else{
    72. //重定向返回登录页面
    73. resp.sendRedirect("/index.jsp");
    74. System.out.println("登录失败,请检查账号密码!");
    75. }
    76. }
    77. }
    78. }

    我们编写客户端jsp页面,引入c标签库,对存放在请求域中的数据进行操作

    具体代码和注释如下:

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: dell
    4. Date: 2022/11/17
    5. Time: 17:31
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    10. <html>
    11. <head>
    12. <title>登录页面title>
    13. head>
    14. <body>
    15. <center>
    16. <h1>欢迎登录h1>
    17. <hr color="red" width="50%">
    18. <form action="/UsersServlet?action=login" method="post">
    19. <p>账号:<input type="text" name="user" value="${cookie.user.value}">p>
    20. <p>密码:<input type="password" name="password" value="${cookie.password.value}">p>
    21. <p>
    22. <input type="checkbox" name="jiZhu" value="1"
    23. <c:if test="${cookie.jiZhu.value == 1}"> checked c:if>
    24. >记住密码
    25. <input type="checkbox" name="auto" value="1">自动登录
    26. <c:if test="${cookie.auto.value == 1}">
    27. <%-- 自动登录 --%>
    28. <jsp:forward page="/UsersServlet?action=login&user=${cookie.user.value}&password=${cookie.password.value}&jiZhu=1&auto=1">jsp:forward>
    29. c:if>
    30. p>
    31. <p>
    32. <input type="submit" value="登录"/>
    33. p>
    34. form>
    35. center>
    36. body>
    37. html>

    到此为止,我们的登录功能就编写完毕

    下一节我们将介绍分页功能,通过分页来展示用户列表

  • 相关阅读:
    有没有不排队还便宜好用的云渲染呢?
    Java算法:快速排序
    【quartz】从数据库中读取配置实现动态定时任务
    记录crack某IDE插件过程
    PyTorch 深度学习之卷积神经网络(高级篇)Advanced CNN(十)
    java支持多任务之间的依赖协作关系
    Java泛型进阶学习
    【SA8295P 源码分析 (二)】110 - OpenWFD Display 美信加串器 MAX96783 - 解串器 MAX96774 初始化寄存器详解
    彻底弄懂C#中delegate、event、EventHandler、Action、Func的使用和区别
    高性能Java对象转换工具MapStruct
  • 原文地址:https://blog.csdn.net/qq_54641516/article/details/127910275