热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

登录案例_需求分析以及代码实现

登录案例_需求分析以及代码实现用户登录案例需求:1.编写login.html登录页面username& password 两个输入框2.使用Druid数据库连接池技

登录案例_需求分析以及代码实现

用户登录案例需求:

  1.编写login.html登录页面

    username &  password  两个输入框

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

  3.使用JdbcTemplate技术封装JDBC

  4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您

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

 

 

 

 

分析:

  1.创建项目,导入html页面,配置文件,jar包

   druid.properties配置文件:

driverClassName=com.mysql.jdbc.Driver
url
=jdbc:mysql:///day14
username=root
password
=root
initialSize
=5
maxActive
=10
maxWait
=3000

  login.html









用户名:


密码:




  2.创建数据库环境

CREATE TABLE USER(
id
INT PRIMARY KEY AUTO_INCREMENT,
username
VARCHAR(32) UNIQUE NOT NULL,
password
VARCHAR(32) NOT NULL
);
SELECT * FROM USER;

 

  3.创建com.itcast.user包,创建类User

/**
* 用户的实体类
*/
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}

  4.编程JDBCUtils工具类

public class JDBCUtils {
// 成员变量
private static DataSource ds;
//静态模块
static {
try {
//1.加载配置文件
Properties pro = new Properties();
//使用加载配置文件,获取字节输入流
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//2.初始化连接池对象
ds = DruidDataSourceFactory.createDataSource(pro);
}
catch (IOException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接池对象
*/
public static DataSource getDataSource(){
return ds;
}
/**
* 获取连接Connection对象
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
}

 

  5.创建包dao,创建UserDao,提供login方法

public class UserDao {
//声明JDBCTemplate对象共用
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
/**
* 登录方法
*
*
@param loginUser 只有用户名和密码
*
@return user包含用户全部数据,没有查询到,返回null
*/
public User login(User loginUser) {
try {
//编写sql
String sql = "select * from USER where username = ? and password = ?";
//调用query方法
User user = template.queryForObject(sql,
new BeanPropertyRowMapper<>(User.class),
loginUser.getUsername(), loginUser.getPassword());
return user;
}
catch (DataAccessException e) {
e.printStackTrace();
return null;
}
}
}

  6、编写LoginServlet类

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置编码
req.setCharacterEncoding("utf-8");
//2.获取请求参数
String username = req.getParameter("username");
String password
= req.getParameter("password");
//3.封装user对象
User loginUser = new User();
loginUser.setUsername(username);
loginUser.setPassword(password);
//4.调用UserDao的login方法
UserDao dao = new UserDao();
User user
= dao.login(loginUser);
//5.判断user
if (user == null){
//登陆失败
req.getRequestDispatcher("/failServlet").forward(req, resp);
}
else {
//登陆成功
//存储数据
req.setAttribute("user", user);
//转发
req.getRequestDispatcher("/successServlet").forward(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}

  

  7、login.html中form表单的action路径的写法

    虚拟目录+Servlet的资源路径

DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<form action="loginServlet" method="post">
用户名:
<input type="text" name="username"> <br>
密码:
<input type="password" name="password"><br>
<input type="submit" value="登录">
form>
body>
html>

  

  8、编写SuccessServlet登陆成功页面和FailServlet登陆失败页面

    SuccessServlet登陆成功页面:

@WebServlet(name = "successServlet", value = "/successServlet")
public class successServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取response域中共享的user对象
User user = (User) request.getAttribute("user");
if (user!= null){
//给页面写一句话
//设置编码
response.setContentType("text/html;charset=utf-8");
//输出
response.getWriter().write("登录成功!"+user.getUsername()+"欢迎您");
}
}
}

  FailServlet登陆失败页面:

@WebServlet(name = "failServlet", value = "/failServlet")
public class failServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//给页面写一句话
//设置页面编码
response.setContentType("text/html;charset=utf-8");
//输出
response.getWriter().write("登陆失败,用户名或密码错误");
}
}

 



推荐阅读
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
  • 蒜头君的倒水问题(矩阵快速幂优化)
    蒜头君将两杯热水分别倒入两个杯子中,每杯水的初始量分别为a毫升和b毫升。为了使水冷却,蒜头君采用了一种特殊的方式,即每次将第一杯中的x%的水倒入第二杯,同时将第二杯中的y%的水倒入第一杯。这种操作会重复进行k次,最终求出两杯水中各自的水量。 ... [详细]
  • 经过一年的思考,我发现自己对开发的兴趣并不浓厚,而对算法研究则更加热衷。本文将探讨开发与算法之间的本质差异,并分享我的未来学习计划。 ... [详细]
  • 周排行与月排行榜开发总结
    本文详细介绍了如何在PHP中实现周排行和月排行榜的开发,包括数据库设计、数据记录和查询方法。涉及的知识点包括MySQL的GROUP BY、WEEK和MONTH函数。 ... [详细]
  • ThinkPHP RBAC 实战:登录验证详解
    本文将详细介绍 ThinkPHP 框架中的 RBAC(角色基础访问控制)系统,特别是登录验证部分。我们将通过实际代码示例,展示如何实现用户登录验证、验证码生成及验证、以及登录后的权限管理。 ... [详细]
  • Bootstrap 缩略图展示示例
    本文将展示如何使用 Bootstrap 实现缩略图效果,并提供详细的代码示例。 ... [详细]
  • 本文介绍了一种支付平台异步风控系统的架构模型,旨在为开发类似系统的工程师提供参考。 ... [详细]
  • 使用 Git Rebase -i 合并多个提交
    在开发过程中,频繁的小改动往往会生成多个提交记录。为了保持代码仓库的整洁,我们可以使用 git rebase -i 命令将多个提交合并成一个。 ... [详细]
  • Manacher算法详解:寻找最长回文子串
    本文将详细介绍Manacher算法,该算法用于高效地找到字符串中的最长回文子串。通过在字符间插入特殊符号,Manacher算法能够同时处理奇数和偶数长度的回文子串问题。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • Python多线程详解与示例
    本文介绍了Python中的多线程编程,包括僵尸进程和孤儿进程的概念,并提供了具体的代码示例。同时,详细解释了0号进程和1号进程在系统中的作用。 ... [详细]
  • 本文详细介绍了Linux系统中用于管理IPC(Inter-Process Communication)资源的两个重要命令:ipcs和ipcrm。通过这些命令,用户可以查看和删除系统中的消息队列、共享内存和信号量。 ... [详细]
  • A*算法在AI路径规划中的应用
    路径规划算法用于在地图上找到从起点到终点的最佳路径,特别是在存在障碍物的情况下。A*算法是一种高效且广泛使用的路径规划算法,适用于静态和动态环境。 ... [详细]
  • 本文详细介绍了如何在PHP中记录和管理行为日志,包括ThinkPHP框架中的日志记录方法、日志的用途、实现原理以及相关配置。 ... [详细]
author-avatar
手机用户2502862581
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有