登录案例的演示 涉及request的转发

登录 案例的 需求描述 :
!!!!! 有三层 概念 : 现实中 控制层 服务层 持久层 之后会有 SSM 的 Spring的框架的;解决

  1:  编写的 login.html 登录案例  : username  与password   的 input  输入 框 
  2:  使用 D瑞典 数据库 连接技术    操 mysql  ,day14   数据库       user表     
  3:  你JDBCTempalte  技术封装的 JDBC  
  4:  登录成功跳转 SuccessServlet  页面   提示success 成功语句  : 
  5:   登录失败   跳转到  FailServlet 页面   Fail 的信息  

思维导图 =========================
登录案例的演示 涉及request的转发_第1张图片
登录案例的演示 涉及request的转发_第2张图片
实施分析 : 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加载这些资源 

登录案例的演示 涉及request的转发_第3张图片
登录案例的演示 涉及request的转发_第4张图片
创建数据库 :

   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);

登录案例的演示 涉及request的转发_第5张图片
搭建 ================== 后端
==== 创建 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 + '\'' +
            '}';
}   }

登录案例的演示 涉及request的转发_第6张图片
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();
    }   }
    

登录案例的演示 涉及request的转发_第7张图片
=========== 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;
    }
}}

登录案例的演示 涉及request的转发_第8张图片

====== 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);
}}

登录案例的演示 涉及request的转发_第9张图片
====== 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();
        }

登录案例的演示 涉及request的转发_第10张图片
=SuccessServlet --------------------------------
daPost方法里
获取域 中的对象
User user = (User) request.getAttribute(“user”);//字符串 强转为 实体类对象
判断对象不为空
response.setContentType(“text/html;charset=utf-8”);
response.getWriter().write(" 登录成功 ,用户名 或密码错误!");
登录案例的演示 涉及request的转发_第11张图片
= FailServlet --------------------------------
daPost方法里
response.setContentType(“text/html;charset=utf-8”);
response.getWriter().write(" 登录失败 用户名 或密码错误!");
登录案例的演示 涉及request的转发_第12张图片

=========================== 登录案例实现 详细 实现

数据库创建  -------------------------------------
	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 框 :用户名 与  密码
			点击提交  -------

你可能感兴趣的:(javaweb基础)