用户登录(JDBC+)

用户登录案例需求:
	1.编写login.html登录页面
		username & password 两个输入框
	2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表
	3.使用JdbcTemplate技术封装JDBC
	4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
	5.登录失败跳转到FailServlet展示:登录失败,用户名或密码错误

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/day14/LoginServlet" method="post">
        用户名:<input type="text" name="username"> <br>
        密码:<input type="password" name="password"><br>

        <input type="submit" value="登录">

    </form>
</body>
</html>

2.需要的配置文件druid.properties

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

3.需要的jar包

spring-tx-5.0.0.RELEASE.jar
commons-beanutils-1.8.0.jar
commons-logging-1.2.jar
druid-1.0.9.jar
mchange-commons-java-0.2.12.jar
mysql-connector-java-5.1.37-bin.jar
spring-beans-5.0.0.RELEASE.jar
spring-core-5.0.0.RELEASE.jar
spring-jdbc-5.0.0.RELEASE.jar

4.数据库Mysql

CREATE TABLE USER(	
			id INT PRIMARY KEY AUTO_INCREMENT,
			username VARCHAR(32) UNIQUE NOT NULL,
			PASSWORD VARCHAR(32) NOT NULL
		);

5.创建实体类 domain文件夹下面

package com.itcsl.domain;

/*
	用户的实体类
 */
public class User {
	private int id;
	private String username;
	private  String password;

	public User() {
	}

	public User(int id, String username, String password) {
		this.id = id;
		this.username = username;
		this.password = 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 + '\'' +
				'}';
	}
}

6.创建包Utils,编写工具类JDBCUtils

package com.itcsl.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * JDBC的工具类,使用Durid连接池
 */
public class JDBCUtils {
	private static DataSource ds;
	static {

		try {
			//1.加载配置文件
			Properties pro = new Properties();
			//使用ClassLoad加载配置文件,获取字节输入流
			InputStream inputStream = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
			pro.load(inputStream);
			//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();
	}
}

7.创建包cn.itcast.dao,创建类UserDao,提供login方法

package com.itcsl.dao;

import com.itcsl.domain.User;
import com.itcsl.util.JDBCUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

/*
	操作数据库中User表的类
 */
public class UserDao {
	//声明JDBCTemplate对象公用
	private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
	/**
	 * 登陆方法
	 * @param loginUser 只有用户名和密码
	 * @return 包含用户全部数据,没有查询到,返回null值
	 */
	public User login(User loginUser){
		try {
			//1.编写sql
			String sql="SELECT * FROM USER WHERE username=? AND PASSWORD=?";
			//2.调用方法
			User user = template.queryForObject(sql,
					new BeanPropertyRowMapper<User>(User.class),
					loginUser.getUsername(), loginUser.getPassword());
				return user;
		}catch (DataAccessException e)
		{
			e.printStackTrace();//记录日志
			return null;
		}
	}
}

8.编写LoginServlet类

package com.itcsl.web.servlet;

import com.itcsl.dao.UserDao;
import com.itcsl.domain.User;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

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

		 */
		//2.获取所有请求参数
		Map<String, String[]> map = req.getParameterMap();
		//3/创建一个User对象
		User loginUser = new User();
		//3.2使用BeanUtils封装
		try {
			//import org.apache.commons.beanutils.BeanUtils;
			BeanUtils.populate(loginUser,map);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		//4.调用UserDao的login方法
		UserDao dao = new UserDao();
		User user = dao.login(loginUser);

		//5.判断user
		if (user!=null){
			//登录成功
			req.setAttribute("user",user);
			req.getRequestDispatcher("/successServlet").forward(req,resp);
		}else{
			//登陆失败
			req.getRequestDispatcher("/failServlet").forward(req,resp);
		}
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doGet(req, resp);
	}
}


9.编写failServlet类

package com.itcsl.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/failServlet")
public class failServlet extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//给页面写一句话

		//设置编码
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("登陆失败,用户名或密码错误");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request,response);
	}
}


10.编写successServlet类

package com.itcsl.web.servlet;

import com.itcsl.domain.User;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/successServlet")
public class successServlet extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		User user = (User) request.getAttribute("user");

		if (user!=null){
			//给页面写一句话

			//设置编码
			response.setContentType("text/html;charset=utf-8");
			response.getWriter().write("登陆成功,"+user.getUsername()+"欢迎你");

		}
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request,response);
	}
}

简化的数据封装

public class BeanUtilsTest {
	@Test
	public void test(){
		User user = new User();
		try {
			BeanUtils.setProperty(user,"username","zhangsan");
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		System.out.println(user);
	}
}

最好能够有测试类

package com.itcsl.test;

import com.itcsl.dao.UserDao;
import com.itcsl.domain.User;
import org.junit.Test;

public class UserDaoTest {
	@Test
	public void  testLogin(){
		User loginuser = new User();
		loginuser.setUsername("admin");
		loginuser.setPassword("123");

		UserDao dao = new UserDao();
		User user = dao.login(loginuser);

		System.out.println(user);
	}

}

posted @ 2020-08-24 09:04  忘山川  阅读(272)  评论(0编辑  收藏  举报