登录 案例的 需求描述 :
!!!!! 有三层 概念 : 现实中 控制层 服务层 持久层 之后会有 SSM 的 Spring的框架的;解决
1: 编写的 login.html 登录案例 : username 与password 的 input 输入 框
2: 使用 D瑞典 数据库 连接技术 操 mysql ,day14 数据库 user表
3: 你JDBCTempalte 技术封装的 JDBC
4: 登录成功跳转 SuccessServlet 页面 提示success 成功语句 :
5: 登录失败 跳转到 FailServlet 页面 Fail 的信息
思维导图 =========================
实施分析 : login.html ----- loginServlet ------ UserDao
前端 --- login.html
|
java 后端: Servlet ----- 操作数据库的 类
|
MySQL 数据库
1:客户端 在填写
html 里的 form表单 action =请求Servlet的路径
后input里 输入用户名 与密码 点击 submit 实现 提交到servlet 里
2:提交数据到 servlet里 : ------ 逻辑代码还会在servlet 写 的 -----------
设置编码 : 在请求与 转发 的时候 会涉及
ServletDispatcher forward(requ,resp)
获取 username 与 password ==== 在 HttpServlet 里的 service 方法里的
---- 其中参数 里request 就可以获取 用户输入参数 : parameter 系列
getParameter (String name) :获取用户输入的 字符串 : 根据参数名 获取参数值
3:将 用户名和密码 username password , 封装带user对象 : 一以类 的方式 封装数据
---- 这也对应了 java类来 与 数据库 表 的 操作
4: 调用 UserDao的 login 方法 查询 , 获取 返回值 对象
获取:数据库 里 是否有 储存 的 , 用户信息 ---- 先要判断
5:逻辑 判断 user是否为null : null登录 失败 转发到 失败的页面
--- 一个request域 里的 转发
IDEA 里 创建 module : 选择不创建 web.xml ???为什么不创建web.xml 这里用作jar包的放置
创建项目 ----- 导入 html 页面 配置文件 jar 包
========jar 包的 使用 ============ :
------- 要用的jar 包--------
mysql-connector-java 5.1.37
数据库连接池 用 的 Druid-1.0.9 jar
springTemplate 技术 : spring5 : beans , core ,jdbc ,tx 。
------- jar包在IDEA 里的 位置 :创建libs
src : 下的配置文件
web :静态资源 发布程序后要首先访问的 界面html :
-- jar包: 创建WEB-INF 里 创建lib ---- 放 jar 包 ==== 注意lib 不要写成 libs
library : 使用idea加载这些资源
CREATE DATABASE day14;
USE day14;
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32)UNIQUE NOT NULL,
PASSWORD VARCHAR(32) NOT NULL);
搭建 ================== 后端
==== 创建 com.fhw.domian.User类 :==============
package com.fhw.domian;
/* 用户 实体类*/
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 + '\'' +
'}';
} }
DAO === connection 连接 数据库 : 操作数据库的类
com.fhw.dao.UserDao
-----------》
package com.fhw.dao;
import com.fhw.domian.User;
/* 操作数据库的 类*/
public class UserDao {
/*
* 定义login 的方法
* 入参 的是 User 出参的 是 User */
public User login(){
return null;
}}
=== 连接数据库 ===== 用的是Durid 德鲁伊 技术 用 JDBCTemplate 连接
— 创建工具类 ----- 所有的 变量与方法 都是 静态修饰
有2步
— 1:获取连接池对象 ---- 2:获取连接Connection 对象
###1: 定义 静态共享的 静态变量 DataSource :用的是 sql ==== import javax.sql.DataSource;
2:获取connection 对象 throws SqlException { ===== import java.sql.Connection;
return ds,getConnection();
}
3: 获取连接池 对象 DataSource getDataSource(){
}
/* JDBC 工具类用的Durid============ 搭架 ====
*/
public class JDBCUtils {
private static DataSource ds;
private static DataSource getDs(){
return ds;
}
private static Connection getConnecion () throws SQLException {
return ds.getConnection();
}} ====================================
2个方法都 return到 DataSource 里
------ 需要资源 了 =============》 静态代码块 :
--------- 都需要try catch 里 -----------
1:获取连接池 : 需要加载 配置文件 初始化连接池对象 =====
需要加载 配置文件 :文件 要在 properties 就 面对像 调用.Load()方法
获取配置文件 用的 是 反射 来进行
2: 创建连接池对象 ; 使用jar包的Druid 对象 调用 数据资源工厂 来 传入 , 初始化给静态变量
com.alibaba.druid.pool.DruidDataSourceFactory;
-------- 完整的 代码 真呈现 ---------
package com.fhw.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/* JDBC 工具类用的Durid
public class JDBCUtils {
private static DataSource ds;
static { //1:加载配置文件 2 初始化连接处对象
//文件在 哪里 properties 的配置文件里 类加载器 调用字节输入流
try {
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("");
Properties pro = new Properties();
pro.load(is);
// 2 初始化连接处对象
ds = DruidDataSourceFactory.createDataSource(pro);
}catch (IOException e){
e.printStackTrace();
} catch (Exception e) {
}
}
private static DataSource getDs(){
return ds;
}
private static Connection getConnecion () throws SQLException {
return ds.getConnection();
} }
=========== UserDao 类里 用 JDBCTemplate 入参 JDBCUtils()对象共享
1:编写 sql 语句 : String sel =“select*from user where username=? and password=?”
2 调用template 的query 方法 使用 beanpropertyRowMapper 泛型是还是User
参数字节码 来获取查询到user对象return 即可
package com.fhw.dao;
import com.fhw.domian.User;
import com.fhw.util.JDBCUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
/* 操作数据库的 类*/
public class UserDao {
//用 JDBCTemplate 入参 JDBCUtils()对象共享
private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDs());
/*
* 定义login 的方法
* 入参 的是 User 出参的 是 User */
public User login(User loginUser){
try {
//1: 定义sql 语句
String sql = "select * from user where username = ? and password = ?";
// 2: 获取 user 对象 : 使用 Template 里Druid 里的 query 方法
User user = template.queryForObject(sql, new BeanPropertyRowMapper(User.class),
loginUser.getUsername(), loginUser.getPassword());
return user;
}catch (DataAccessException e){
e.printStackTrace();//记录日志
return null;
}
}}
====== test 测试类 =============
package com.fhw.test;
import com.fhw.dao.UserDao;
import com.fhw.domian.User;
import org.junit.Test;
,
public class UserDaoTest {
@Test
/* 测试 数据库里 是否能够 查询到信息
* 数据库的类 UserDao 参数里要用到User 类
* */
public void testLogin(){
User loginuser = new User();
loginuser.setUsername("fhw");
loginuser.setPassword("123");
UserDao userDao = new UserDao();
User user = userDao.login(loginuser);
System.out.println(user);
}}
====== servlet、 的 逻辑 ===== 编写
创建 LoginServlet
在doget 方法里 是指编码 :
==========优化 :在注册多次输入框 验证的 工具类的 BeanUtils
*********** commons-beanutils-1.8.0.jar 的工具类 免费与开源的 *********
原理 : 获取 的request.getparameterMap()简化操做
使用jar 包 Apache的工具而立里为我们 提供的
用 jar 包的方式 : 加 入 lib : 在loginServlet 里 使用 :
request.setCharacterEncoding("utf-8") :
//获取所有请求的参数 :
Map map=request.getParameterMap();
// 创建user对象
User LoginUser= nwe User();
//使用 BeanUtils.populate 来封装 try catch:
BeanUtils.populate(loginUser.map)
loginServlet的额 里要做 的是 :
request 的一系列的操作 :
设置编码 : request.setCharacterEnCoding(utf-8);
获取请求的参数 :String username= request.getPrameter(“username”);
String password= request.getParameter("password");
封装 到 实体类 ;里 User loginUser= new User();
loginUser.setUsername(username);
loginuser.setPasword(paasword);
new UserDao().login(loginUser);
入参到实体 类 里
优化 :
Map map = request.getParameterMap();
User loginUser = new User();
//使用beanUtils 工具类 来加载 自动加载 与 解析 :
try {
BeanUtils.populate(loginUser,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
=SuccessServlet --------------------------------
daPost方法里
获取域 中的对象
User user = (User) request.getAttribute(“user”);//字符串 强转为 实体类对象
判断对象不为空
response.setContentType(“text/html;charset=utf-8”);
response.getWriter().write(" 登录成功 ,用户名 或密码错误!");
、= FailServlet --------------------------------
daPost方法里
response.setContentType(“text/html;charset=utf-8”);
response.getWriter().write(" 登录失败 用户名 或密码错误!");
=========================== 登录案例实现 详细 实现
数据库创建 -------------------------------------
create database 库名
create table 表名()
id int primary key Auto_increment
username varchar(32)not null
password varchar(32)unique not null
insert into 表名values(‘fhw’,‘123’) 插入数据
后端编写 --------------------------------------
WEB-INF ---------------
lib -----------------------
连接数据库 所用的技术jar包
spring -----------
spring-beans-5.0.0.RELEASE.jar
spring-core-5.0.0.RELEASE.jar
spring-jdbc-5.0.0.RELEASE.jar
spring-tx-5.0.0.RELEASE.jar
connection ------------
JDBC ------
Alibaba ------
druid-1.0.9.jar
mysql -------
mysql-connector-java-5.1.37-bin.jar
数据库 表 与 javabean的加载解析 ----
commons-beanutils-1.8.0.jar
---------------------
mchange-commons-java-0.2.12.jar
commons-logging-1.2.jar
src ---------------------------------
druid.properties 配置文件 ------------------
driverClassName连接库的类型
uri: 连接库 所在的地址: http port 路径
username用户名
password密码
initialSize初始 连接数
maxActive:最大连接数
maxWait等待3000毫秒
包的路径 -------------------------
com.fhw
dao -------------------
UserDao类
java Template()加载JDBCutil 类连接数据库
login方法里
try catch
sql语句
Template 里Druid 里的 query 方法
user 用户
domain -----------------
User类
与数据库table 对应的Javabean
web ---------------------------------------------
servlet -------------------
LoginServlet ---------------------
获取请求request.getParameterMap() 或者
BeanUtils工具类加载
调用UserDao的login()
判断 与 转发
if(user==null){ }
转发 到 登录失败
request.getDispatcher("/转发路径").forward( requ,resp)
else
储存到request 域 里
setAttribute()
转发 到 登录成功
request.getDispatcher("/转发路径").forward( requ,resp)
SuccessServlet --------------------------------
daPost方法里
获取域 中的对象
User user = (User) request.getAttribute("user");//字符串 强转为 实体类对象
判断对象不为空
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(" 登录成功 ,用户名 或密码错误!");
FailServlet --------------------------------
daPost方法里
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(" 登录失败 用户名 或密码错误!");
util -------------------------------------------
JDBCtils ------------------------------
private static DataSource
static{代码块 加载}
反射 获取配置文件 的path
new Properties().load( 加载)
初始化Drui连接池
getDataSource()
getConnection()
前端编写 -----------------------------------------------------------------------------
创建login.html ------------------------------
form表单 ---------------------------
action
input
用户名 type text , name username
密码 type password , name password
提交 type submit value "登录"
测试 --------------------------------------------------
Junit test ---------------------------
testLogin方测试法
new User类 ----- setUsername setPassword
new DaoUser类 ---- 调用login方法 传参 System out.println()
浏览器 输入 路径测试 ------ 访问login.html-------输入input 框 :用户名 与 密码
点击提交 -------