需求:
登录功能 
登录页面输入用户名和密码, 到数据库进行验证 ,如果成功跳转到success.html页面,失败跳转到error.html页面
数据库 mysql,数据表 t_user表【表中的字段 :name 用户名,pwd 密码】
实现:
mysql 存储数据建表 
jdbc操作java代码连接查询数据库里对应的字段
servlet将 html和java连接起来,用login来登录转发到成功或者失败页面。
实现步骤:
jdbc 
依赖 jar包,数据库连接的util DBUtil数据库连接工具类
mysql 连接
db.properties 数据库连接配置
核心代码实现:(DAO层)
sql语句 查询:String sql = "select * from t_user  where name=? and pwd =? ";
创建一个实体类和数据库表对应,dao层 用户名和密码验证,返回一个结果 对象 
servlet调用DAO层:如果用户存在 ,不为空,跳转到ok.html页面 ;如果不存在,对象为空, 登录失败 error.html

前台页面:
login.html【登录界面】

 <!DOCTYPE html>
<html>
<head>
<title>login.html</title>
<meta charset="utf-8">
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body>
<form action="UserLogin">
用户名:<input type="text" name="uname" id="uname" /><br>
密码:<input type="password" name="pwd" id="pwd" /><br>
<input value="登录" type="submit"/>
</form>
</body>
</html>

success.html【登录成功界面】

 <!DOCTYPE html>
<html>
<head>
<title>success.html</title>
<meta charset="utf-8">
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body>
This is 登录成功 page.看到女神<br>
<div>
<img src="imges/success.jpg" width="800px" height="500px"/>
</div>
</body>
</html>

error.html【登录失败界面】

 <!DOCTYPE html>
<html>
<head>
<title>error.html</title>
<meta charset="utf-8">
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body>
This is 登录失败 page.一直在转悠转悠 <br>
<div>
<img src="imges/error.gif" />
</div>
</body>
</html>

entity层【实体类】

 package boom.servlet.entity;
/**
* 实体类
* @author Administrator
*
*/
public class T_user {
// 对应着数据库表的字段
private int id;
private String name;
private String pwd;
// 无参构造方法
public T_user() {
}
// 有参构造方法
public T_user(int id, String name, String pwd) {
super();
this.id = id;
this.name = name;
this.pwd = pwd;
}
// getter setter
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
// 重写toString
@Override
public String toString() {
return "T_user [id=" + id + ", name=" + name + ", pwd=" + pwd + "]";
} }

util层【封装的JDBC数据库连接】

 package boom.servlet.util;

 import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* 连接数据库的工具类
* @author Administrator
*
*/
public class DBUtil {
private static String driver;
private static String url;
private static String username;
private static String password; static {
// 创建properties对象获取属性文件的内容
Properties p = new Properties();
// 获取属性配置文件的读取流对象
InputStream is = DBUtil.class.getResourceAsStream("/db.properties");
try {
// 加载属性配置文件
p.load(is);
// 获取jdbc参数
driver = p.getProperty("driver");
url = p.getProperty("url");
username = p.getProperty("username");
password = p.getProperty("password");
// 加载驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // 获取Connection对象
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
} // 封装获取PreparedStatement对象
public static PreparedStatement getPreparedStatement(String sql,
Connection conn) { PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ps; } // 封装获取Statement对象
public static Statement getStatement(Connection conn) {
Statement stmt = null;
try {
stmt = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
return stmt; } // 关闭资源
//父类可以调用 子类继承过的父类方法
public static void closeAll(ResultSet rs, Statement ps, Connection conn) {
try {
if(rs!=null ){
rs.close();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
try {
if(ps!=null ){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
// 封装DML
public static int executeDML(String sql, Object... objs) {
// 创建连接对象
Connection conn = getConnection();
// 创建sql命令对象
PreparedStatement ps = DBUtil.getPreparedStatement(sql, conn);
// 给占位符赋值
try {
conn.setAutoCommit(false);
for (int i = 0; i < objs.length; i++) {
ps.setObject(i + 1, objs[i]);
}
int i = ps.executeUpdate();
conn.commit();
return i;
} catch (Exception e) {
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} finally {
// 关闭资源
DBUtil.closeAll(null, ps, conn);
}
// 返回结果
return -1;
}
// 测试数据库是否连接成功
public static void main(String[] args) {
Connection conn = DBUtil.getConnection();
System.out.println(conn);
}
}

dao层【user实现类】

 package boom.servlet.dao;

 import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import boom.servlet.entity.T_user;
import boom.servlet.util.DBUtil; /**
* 登录查询实现类
* @author Administrator
*select * from t_user where name='admin' and pwd='admin'
*/
public class UserDaoImpl {
// 返回对象
public T_user getUser(String name,String pwd){
String sql = "select * from t_user where name=? and pwd =? ";
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
T_user user= null;
//1.创建连接
conn = DBUtil.getConnection();
try {
//2.获取预处理块对象 preparestatement
ps = conn.prepareStatement(sql);
//3.绑定参数
ps.setString(1, name);
ps.setString(2, pwd);
//4.执行SQL语句 5.获取结果集
rs = ps.executeQuery();
//6.遍历结果集存放到 user对象中
while(rs.next()){
int id = rs.getInt("id");
String name2 = rs.getString("name");
String pwd2 = rs.getString("pwd");
//将数据放到对象中
user = new T_user(id,name2,pwd2);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
//7.关闭资源
DBUtil.closeAll(rs, ps, conn);
}
return user;
}
}

servlet层【获取前端页面登录验证】

 package boom.servlet.servlet;

 import java.io.IOException;

 import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import boom.servlet.dao.UserDaoImpl;
import boom.servlet.entity.T_user;
/**
* 获取前端页面登录验证
* @author Administrator
*
*/
public class UserLogin extends HttpServlet {
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 1、获取login用户提交的数据【账户,密码】
String uname = request.getParameter("uname");
String pwd = request.getParameter("pwd");
// 2、调用业务逻辑层。简化后调用dao层
UserDaoImpl daoImpl = new UserDaoImpl();
T_user user = daoImpl.getUser(uname, pwd);
String path = "/login.html";
if (user != null) {
path = "/success.html";
} else {
path = "/error.html";
}
// 3 根据dao的查询结果 ,跳转到成功或失败页面
request.getRequestDispatcher(path).forward(request, response); }
}

test层【测试dao层是否连接成功】

 package boom.servlet.test;

 import boom.servlet.dao.UserDaoImpl;
import boom.servlet.entity.T_user; /**
* 测试dao层
* @author Administrator
*
*/
public class TestUserDao {
public static void main(String[] args) {
UserDaoImpl daoImpl = new UserDaoImpl();
T_user user = daoImpl.getUser("boom", "123");
if(user != null){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
}
}

数据库配置文件【db.properties】

演示界面:

Servlet登录小案例的更多相关文章

  1. Servlet入门小案例

    案例一:tomcat9.jdk1.8 1.eclipse创建web项目 1)创建一个Dynamic web project,名字为Servlet_hjh 2)在src下创建一个包,为com.hjh.d ...

  2. Session小案例------完成用户登录

    Session小案例------完成用户登录     在项目开发中,用户登陆功能再平常只是啦,当用户完毕username和password校验后.进入主界面,须要在主界面中显示用户的信息,此时用ses ...

  3. JSP +MySQL实现网站的登录与注册小案例

    为了练手,我就自己试着做了一个网站的登录与注册的小案例.由于没有做美化处理,所以界面并不是很好看. 网站实现的功能如下: 用户首次注册功能 用户登录功能 项目目录展示: 下面我将会分模块展示 注册模块 ...

  4. 《java入门第一季》之类小案例(模拟用户登录)

    首先是做一个用户登录的小案例.在此基础上加入其它逻辑. import java.util.Scanner; /* * 模拟登录,给三次机会,并提示还有几次.如果登录成功,就可以玩猜数字小游戏了. * ...

  5. Servlet 实现訪问量的统计小案例

    今天学习了Servlet的基础知识,学习了一个统计訪问量的小案例,记录一下 package cn.selevet_01; import java.io.IOException; import java ...

  6. WEB 小案例 -- 网上书城(四)

    针对于这个小案例我们今天讲解结账操作,也是有关这个案例的最后一次博文,说实话这个案例的博文写的很糟糕,不知道该如何去表述自己的思路,所以内容有点水,其实说到底还是功力不够. 处理思路 点击结账,发送结 ...

  7. session的两个小案例

    学完了session,写两个小案例加深一下对session的巩固. 1. 用户登陆案例 登陆html页面提交后,将参数带给处理登陆的servlet,该servlet将获得登陆的用户名和密码,并将这些信 ...

  8. 黑马day14 踢人小案例

    本案例介绍: 使用监听器来实现踢人小案例,仅仅有管理员才有踢人的功能. 1.搭建开发环境,导入本案例须要的jar包.以及一个准备好的数据库工具类:提供数据源的方法...当中我已经在数据库中加入了三个用 ...

  9. JavaWeb_(Struts2框架)Ognl小案例查询帖子

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

随机推荐

  1. 新股定价谁说了算?一文读懂中国IPO询价制度

    总体来说,在市场化条件下,确定股票首次公开发行的价格可以分为两个步骤:一是股票估值:选择一定的股票估值模型,对拟发行股票的公司进行估值,并初步确定发行价格和询价区间:二是发现股票市场价格,主要方式是I ...

  2. UITableView+FDTemplateLayoutCell计算行高显示<二>

    之前记录过一篇UITableView+FDTemplateLayoutCell计算行高不成功的博客... 传送门:http://www.cnblogs.com/pengsi/p/6571311.htm ...

  3. Server2008实验——私钥和添加数据恢复代理程序

    导出和安装私钥 当一个用户加密一个文件的时候,生成证书,拥有证书的私钥的用户才能够解开这个加密文件:为了防止私钥丢失导致加密文件不可打开,可以导出私钥给同一个用户组的用户帮忙打开: 1.创建[xl]和 ...

  4. Kubernetes web界面kubernetes-dashboard安装【h】

    本文讲述的是如何部署K8s的web UI,前提是已经有一个k8s集群后,按照如下步骤进行即可.(如下步骤都是在master节点上进行操作) 1.下载kubernetes-dashboard.yaml文 ...

  5. ARB扩展与标准OpenGL的关系

    由于OpenGL的标准更新不是很频繁,因此,当某种技术应用流行起来时,显卡厂商为了支持该技术,会使用自己的扩展来实现该功能.但是不同厂商如果有不同的实现,那么程序编写将会异常繁琐.因此多个厂商共同协商 ...

  6. pandas中groupby的参数:as_index

    参考:https://blog.csdn.net/cjsyr6wt/article/details/78200444?locationNum=11&fps=1 以下是pandas官方的解释: ...

  7. luoguP2664树上游戏(点分治)

    题目链接:https://www.luogu.org/problem/P2664 题意:给定一颗带点权的树,结点数n<=1e5,点权<=1e5,用s(i,j)表示从i到j的路径上不同点权数 ...

  8. LeetCode 141 ——环形链表(JAVA)

    给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 1: 输入: ...

  9. Codeforces 1228E. Another Filling the Grid

    传送门 看到 $n=250$ 显然考虑 $n^3$ 的 $dp$ 设 $f[i][j]$ 表示填完前 $i$ 行,目前有 $j$ 列的最小值是 $1$ 的合法方案数 那么对于 $f[i][j]$ ,枚 ...

  10. L1-025. 正整数A+B 简单复习一下,。

    本题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000].稍微有点麻烦的是,输入并不保证是两个正整数. 输入格式: 输入在一行给出A和B,其间以空格分开.问题是A和B不一定是满 ...