当前位置:   article > 正文

5分钟教你用java做最简单的登录系统_java编写简单登录系统程序

java编写简单登录系统程序

目录

      前言

一. 项目需求和分析

二. 准备工作资源

三. 编写逻辑代码 

四. 测试及运行 

五. 反思总结 


前言

JavaWeb学了有一段时间了,学到了很多东西,但学归学,它是不是真正成为自己的了还真不好说。俗话说得好,如果你能用自己的语言给别人把一个晦涩难懂的东西讲清楚,那你就真的会了。故作此文,教大家搭建一个非常基础的登录系统,顺便巩固一下这段时间学的重要知识。 

 

一.项目需求和分析

1.用户登录:

1. 编写login.html登录页面:username $ password 两个输入框

2. 使用Druid数据库连接池技术,操作mysql,db1数据库中user表

3. 使用JdbcTemplate技术封装JDBC

4. 登录成功跳转到SuccessServlet展示:登录成功,username,欢迎你

5. 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误

2.需求分析:     

 

二.  准备工作资源

1.工具:

* idea企业版(因为企业版才集成的有Tomcat服务器)

* 各种依赖jar包和驱动:

        链接:https://pan.baidu.com/s/1fKEaSDFllKVUR-QasSgA5g 提取码:lx4o 

* Mysql5.7:Mysql 8可能会遇到一些问题,版本不一样有些规则会修改,所以尽量按我的环境来,我都踩过这些坑

* jdk1.8或以上:如果提示有无效版本,你可以换高版本的jdk,我还有个jdk14换着用的

* Navicat for Mysql:根据自己喜好,可有可无,也可以用其他的可视化数据库操作软件

2.创建项目模块

 选择new->Module->Java Enterprise.

配置如下:只需要改这三项 :

                 JavaEE version改成Java EE 7

                 勾选Web Application,

                 取消Create web.xml的勾选就可以了,其他不用管,Next

 位置仅供参考

创建完成后先在web文件夹下创建俩文件夹用来存储依赖jar包和驱动包

这些依赖包并不能直接使用,我们要右键点击lib文件夹,或者我们把这些包全部选中再右键,然后add as library->Level选Module Library,这样这些jar包就生效了。啥,不知道add as library是啥东西,点右边吧 ——> 传送门,带你飞~ 

根据需求分析我们了db1数据库并创建user表,我添加了一条数据用于后面验证demo是否成功。

为了使用 druid数据库连接池技术 来操作数据库,我们引入druid.properties来配置数据库,放在src目录下即可。

(链接:https://pan.baidu.com/s/14gU_aEYped66A0wm_P4zJQ 提取码:v0se)

准备工作搞定~ 

三. 编写逻辑代码 

 1.编写登录页面(login.html)

明人不说暗话,咱也不会,咋也不整那么多花里胡哨的,有那个意思就行了。

放到web目录下

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Login</title>
  6. </head>
  7. <body>
  8. <!-- action指定的路径为:虚拟目录+资源路径-->
  9. <form action="/login_demo2/loginServlet" method="post">
  10. 用户名:<input type="text" name="username"><br>
  11. 密码:<input type="password" name="password"><br>
  12. <input type="submit" value="登录">
  13. </form>
  14. </body>
  15. </html>

 2.编写用户实体类(User)

这里面装的都是用户的各个属性。为啥要这样写呢?单独把用户封装起来,然后用户操作数据库等操作单独写接口,这样才能高内聚,低耦合的效果。

放到src.cn.it.np.domain目录下(给你个完整项目路径,你看看就知道了)

  1. package cn.it.np.domain;
  2. /**
  3. * 用户的实体类(JavaBean)
  4. */
  5. public class User {
  6. //用户id
  7. private int id;
  8. //用户名
  9. private String username;
  10. //密码
  11. private String password;
  12. public int getId() {
  13. return id;
  14. }
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18. public String getUsername() {
  19. return username;
  20. }
  21. public void setUsername(String username) {
  22. this.username = username;
  23. }
  24. public String getPassword() {
  25. return password;
  26. }
  27. public void setPassword(String password) {
  28. this.password = password;
  29. }
  30. @Override
  31. public String toString() {
  32. return "User{" +
  33. "id=" + id +
  34. ", username='" + username + '\'' +
  35. ", password='" + password + '\'' +
  36. '}';
  37. }
  38. }

3.编写JDBC工具类(JDBCUtils)

由于用到了Druid和Template,为了封装和简化Mysql的操作,我们一般都会编写一个JDBC工具类,让我们更方便的获取连接池对象或Connection对象 ,用到了Druid的知识。

什么?你说你不知道什么叫Druid!点右边带你坐飞机 ——> 带你装b,带你飞

放到src.cn.it.np.util目录下

  1. package cn.it.np.util;
  2. import com.alibaba.druid.pool.DruidDataSourceFactory;
  3. import javax.sql.DataSource;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.sql.Connection;
  7. import java.sql.SQLException;
  8. import java.util.Properties;
  9. /**
  10. * JDBC工具类 使用Druid
  11. */
  12. public class JDBCUtils {
  13. private static DataSource ds;
  14. static {
  15. try {
  16. //1.加载配置文件
  17. Properties pro = new Properties();
  18. //使用ClassLoader加载配置文件,获取字节输入流
  19. InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
  20. pro.load(is);
  21. //2.初始化连接池对象
  22. ds = DruidDataSourceFactory.createDataSource(pro);
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. //获取连接池对象
  30. public static DataSource getDataSource(){
  31. return ds;
  32. }
  33. //获取连接Connection对象
  34. public static Connection getConnection() throws SQLException {
  35. return ds.getConnection();
  36. }
  37. }

4.编写数据库接口类(UserDao)

百度Dao如下:

DAO(Data Access Object)是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。

它负责和数据库打交道,我们通过它来将用户实体类User和数据库连接起来实现判断用户账号密码是否在数据库中的操作。这里主要用到了Spring框架里的 JdbcTemplate,同时还用到了工具类JDBCUtils。什么?你说你不知道Template?快点击这里吧!——> 带你飞 

放到src.cn.it.np.dao目录下

  1. package cn.it.np.dao;
  2. import cn.it.np.domain.User;
  3. import cn.it.np.util.JDBCUtils;
  4. import org.springframework.dao.DataAccessException;
  5. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  6. import org.springframework.jdbc.core.JdbcTemplate;
  7. /**
  8. * 操作数据库中User表的类
  9. */
  10. public class UserDao {
  11. //声明JDBCTemplate对象共用
  12. private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
  13. /**
  14. * 登录方法
  15. * @param loginUser 只有用户名和密码
  16. * @return user包含用户所有信息
  17. */
  18. public User login(User loginUser){
  19. try {
  20. //1.编写sql
  21. String sql = "select * from user where username = ? and password = ?";
  22. //2.调用template的query方法
  23. // User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), loginUser.getUsername(), loginUser.getPassword());
  24. User user = template.queryForObject(sql,
  25. new BeanPropertyRowMapper<User>(User.class), loginUser.getUsername(), loginUser.getPassword());
  26. return user;
  27. } catch (DataAccessException e) {
  28. e.printStackTrace();
  29. return null;
  30. }
  31. }
  32. }

5.编写业务逻辑类(loginServlet、successServlet、failServlet) 

判断用户是否成功登陆及后续的跳转操作,用到了Servlet的请求与转发操作。

啥?你说你不知道?快飞吧 ——> 好,你飞了

loginServlet

  1. package web.servlet;
  2. import cn.it.np.dao.UserDao;
  3. import cn.it.np.domain.User;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. @WebServlet("/loginServlet")
  11. public class loginServlet extends HttpServlet {
  12. @Override
  13. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  14. //1.设置字符编码
  15. req.setCharacterEncoding("utf-8");
  16. //2.接收user数据
  17. String username = req.getParameter("username");
  18. String password = req.getParameter("password");
  19. //3.封装成User对象
  20. User loginuser = new User();
  21. loginuser.setUsername(username);
  22. loginuser.setPassword(password);
  23. //4.判断与转发
  24. UserDao dao = new UserDao();
  25. User user = dao.login(loginuser);
  26. if(user != null){
  27. //登录成功
  28. //存储共享数据
  29. req.setAttribute("user",user);
  30. req.getRequestDispatcher("/successServlet").forward(req,resp);
  31. }else{
  32. //登录失败
  33. req.getRequestDispatcher("/failServlet").forward(req,resp);
  34. }
  35. }
  36. @Override
  37. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  38. this.doGet(req,resp);
  39. }
  40. }

successServlet

  1. package web.servlet;
  2. import cn.it.np.domain.User;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. @WebServlet("/successServlet")
  10. public class successServlet extends HttpServlet {
  11. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  12. this.doGet(request,response);
  13. }
  14. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. //1.获取request域中共享的user数据
  16. User user = (User)request.getAttribute("user");
  17. //2.页面打印
  18. response.setContentType("text/html;charset=utf-8");
  19. response.getWriter().write("欢迎" + user.getUsername() + "登录成功!");
  20. }
  21. }

 failServlet

  1. package web.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. @WebServlet("/failServlet")
  9. public class failServlet extends HttpServlet {
  10. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  11. this.doGet(request,response);
  12. }
  13. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14. //页面打印
  15. response.setContentType("text/html;charset=utf-8");
  16. response.getWriter().write("登录失败");
  17. }
  18. }

6.这中间我们还可以穿插单元检测比如我们写完UserDao这个类的时候,我们如何检测其是否正确,这时候就用到了单元检测。

只要在要检测部分前面加上注解 @Test 即可(说到这里可能有些小小白会无法运行,那肯定是你没有导包。idea很智能,点一下注解,alt+enter键回车就能自动导包了)

  1. package cn.it.np.test;
  2. import cn.it.np.dao.UserDao;
  3. import cn.it.np.domain.User;
  4. import org.junit.Test;
  5. public class UserDao_Test {
  6. @Test
  7. public void testLogin(){
  8. User loginuser = new User();
  9. loginuser.setUsername("zhangsan");
  10. loginuser.setPassword("666");
  11. UserDao dao = new UserDao();
  12. User user = dao.login(loginuser);
  13. System.out.println(user);
  14. }
  15. }

 然后点击左侧的播放按钮,如果成功输出user信息则说明UserDao模块是ok的。

 至此,项目基本完成,看看能不能运行吧!

四. 测试及运行 

这里要注意检查你的login.html页面,action必须指定为:虚拟目录+资源路径。这里我Tomcat部署项目时设置的虚拟目录为/login_demo2.

进入登陆页面 

 

登陆失败时: 

登陆成功时 

五. 反思总结 

 通过本次项目的学习和演示,我总结出以下一个登陆模块编写流程:

前端界面(login.html)-> 用户实体类(User)-> 数据库接口类(UserDao) -> 中间可穿插单元测试类(UserDao_Test等测试类) -> 用到什么工具类就写什么工具类(JDBCUtils)-> 逻辑类(按业务逻辑写完剩下的常规类)

经过多次bug的折磨,我明白要经常进行unit测试,要养成好习惯,希望大家能一起进步,成为大牛牛!


更新

        和之前的代码不完全一致,是重新写的,要注意的是这里没用UserDao写全,为了快速搭建我就写死了。你们需要可以用UserDao接口,方法和上面是一样的new User对象来接收。用了jsp简化书写,加入验证码验证功能。

checkCodeServlet 

  1. package cn.it.np;
  2. import javax.imageio.ImageIO;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import javax.servlet.http.HttpSession;
  9. import java.awt.*;
  10. import java.awt.image.BufferedImage;
  11. import java.io.IOException;
  12. import java.util.Random;
  13. @WebServlet("/checkCodeServlet")
  14. public class checkCodeServlet extends HttpServlet {
  15. @Override
  16. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  17. //1.定义图片宽高
  18. int width = 100;
  19. int height = 50;
  20. //2.创建一个对象,在内存中存图片
  21. BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  22. //3.美化图片,掏出画笔开始搞
  23. Graphics g = image.getGraphics();
  24. //4.先给图片填个色
  25. g.setColor(Color.orange);
  26. g.fillRect(0,0,width,height);
  27. //5.在图片的边缘画一画使图片效果更好
  28. g.setColor(Color.blue);
  29. g.drawRect(0,0,width-1,height-1);
  30. //7.制造干扰条纹
  31. Random ran = new Random();
  32. g.setColor(Color.gray);
  33. for(int i=0;i<8;i++){
  34. int x1 = ran.nextInt(width);
  35. int x2 = ran.nextInt(width);
  36. int y1 = ran.nextInt(height);
  37. int y2 = ran.nextInt(height);
  38. g.drawLine(x1,y1,x2,y2);
  39. }
  40. //6.画验证码字符
  41. StringBuilder sb = new StringBuilder();
  42. g.setColor(Color.black);
  43. String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  44. for(int i=1;i<=4;i++){
  45. //创造不超过str长度的随机下标
  46. int index = ran.nextInt(str.length());
  47. //获得该随机下标对应的字符
  48. char ch = str.charAt(index);
  49. sb.append(ch);
  50. //在适当的位置画字符
  51. g.drawString(ch + "",width/5*i,height/2);
  52. }
  53. //用session存储验证码字符
  54. String str_checkCode = sb.toString();
  55. HttpSession session = req.getSession();
  56. session.setAttribute("checkCode",str_checkCode);
  57. //将图片输出到屏幕上
  58. ImageIO.write(image,"jpg",resp.getOutputStream());
  59. }
  60. @Override
  61. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  62. this.doGet(req,resp);
  63. }
  64. }

loginServlet 

  1. package cn.it.np;
  2. import javax.imageio.ImageIO;
  3. import javax.servlet.RequestDispatcher;
  4. import javax.servlet.ServletContext;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.*;
  8. import java.awt.*;
  9. import java.awt.image.BufferedImage;
  10. import java.io.IOException;
  11. import java.util.Random;
  12. @WebServlet("/loginServlet")
  13. public class loginServlet extends HttpServlet {
  14. @Override
  15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  16. //1.获取表单参数
  17. String username = req.getParameter("username");
  18. String password = req.getParameter("password");
  19. String checkCode = req.getParameter("checkCode");
  20. //2.判断验证码和密码是否正确
  21. //获取验证码
  22. HttpSession session = req.getSession();
  23. String str_checkCode =(String) session.getAttribute("checkCode");
  24. //删除session中存储的验证码
  25. session.removeAttribute("checkCode");
  26. //验证码正确,判断账号密码是否正确
  27. if(str_checkCode != null && checkCode.equalsIgnoreCase(str_checkCode)){
  28. //账号密码也正确
  29. if(username.equals("zhangsan") && password.equals("666")){//使用UserDao接口
  30. //用session存储用户信息并转发到success.jsp页面
  31. session.setAttribute("username",username);
  32. resp.sendRedirect(req.getContextPath() + "/success.jsp");
  33. }else{
  34. //账号密码不正确
  35. req.setAttribute("fail","用户名或密码错误!");
  36. req.getRequestDispatcher(req.getContextPath() + "/login.jsp").forward(req,resp);
  37. }
  38. }else{
  39. //验证码不正确,跳转到login.jsp,提示验证码错误
  40. req.setAttribute("codeFail","验证码错误!");
  41. req.getRequestDispatcher(req.getContextPath() + "/login.jsp").forward(req,resp);
  42. }
  43. }
  44. @Override
  45. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  46. this.doGet(req,resp);
  47. }
  48. }

login.jsp

  1. <%@ page import="java.awt.image.BufferedImage" %>
  2. <%@ page import="java.awt.*" %>
  3. <%@ page import="java.util.Random" %>
  4. <%@ page import="javax.imageio.ImageIO" %>
  5. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  6. <html>
  7. <head>
  8. <title>login</title>
  9. <script>
  10. window.onload = function (ev) {
  11. document.getElementById("checkCode").onclick = function (ev1) {
  12. this.src = "/checkCodeServlet?time=" + new Date().getTime();
  13. }
  14. }
  15. </script>
  16. <style>
  17. div{
  18. color: red;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <form action="/loginServlet" method="post">
  24. <table>
  25. <tr>
  26. <td>用户名</td>
  27. <td><input type="text" name="username"></td>
  28. </tr>
  29. <tr>
  30. <td>密码</td>
  31. <td><input type="password" name="password"></td>
  32. </tr>
  33. <tr>
  34. <td>验证码</td>
  35. <td><input type="text" name="checkCode"></td>
  36. </tr>
  37. <tr>
  38. <td colspan="2"><img src="/checkCodeServlet" id="checkCode"></td>
  39. </tr>
  40. <tr>
  41. <td colspan="2">
  42. <input type="submit" value="登录">
  43. </td>
  44. </tr>
  45. </table>
  46. </form>
  47. <div><%=request.getAttribute("fail") == null ? "" : request.getAttribute("fail")%></div>
  48. <div><%=request.getAttribute("codeFail") == null ? "" : request.getAttribute("codeFail")%></div>
  49. </body>
  50. </html>

success.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>success</title>
  5. </head>
  6. <body>
  7. <h1>欢迎你,<%=request.getSession().getAttribute("username")%>
  8. </body></h1>
  9. </html>

运行结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/175257
推荐阅读
相关标签
  

闽ICP备14008679号