Servlet实现用户登录功能

1、创建html界面

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

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

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

2 、创建数据库

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

3、创建用户实体类

	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、创建jdbc工具类

这里使用的是c3p0 / druid 两种数据库连接池技术 分别需要在项目导入相应的jar包

public class JDBCUtils { 
private static DataSource ds ;
static { 
try { 
//1.加载配置文件
Properties pro = new Properties();
//使用ClassLoader加载配置文件,获取字节输入流
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();
}
system.out.println("=============================================================")
public class JDBCButil { 
final static ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
// 获取连接方法
// 返回一个连接对象
public static Connection getCon() { 
// 连接使用c3p0进行获取
// 使用c3p0数据库连接池获取连接
Connection connection = null;
try { 
connection = comboPooledDataSource.getConnection();
} catch (SQLException e) { 
System.err.println("获取连接失败");
return null;
}
return connection;
}
// DML方法
// 不支持事务 单条sql语句执行
public static boolean DML(String sql, Object... o) { 
// 获取连接
Connection con = getCon();
// 创建预编译对象
try { 
PreparedStatement ps = con.prepareStatement(sql);
for (int i = 0; i < o.length; i++) { 
ps.setObject((i + 1), o[i]);
}
ps.executeUpdate();
} catch (SQLException e) { 
System.out.println("查询执行失败:" + sql);
return false;
}
return true;
}
// DML方法
// 支持事务 多条sql语句执行
public static boolean DML(Connection con, String sql, Object... o) { 
// 创建预编译对象
try { 
PreparedStatement ps = con.prepareStatement(sql);
for (int i = 0; i < o.length; i++) { 
ps.setObject((i + 1), o[i]);
}
ps.executeUpdate();
} catch (SQLException e) { 
System.out.println("查询执行失败:" + sql);
return false;
}
return true;
}
// 查询dql语句方法
public static <E> ArrayList<E> DQL(String sql, Class<E> c, Object... o) { 
ArrayList<E> list = new ArrayList<>();
try { 
// 获取连接
Connection con = getCon();
// 准备预编译对象
PreparedStatement ps = con.prepareStatement(sql);
// 获取元数据 准备存储所有列名的数组
ResultSetMetaData metaData = ps.getMetaData();
// 创建指定长度用于存储列名的数组
String[] names = new String[metaData.getColumnCount()];
// 循环为names数组进行赋值
for (int i = 0; i < names.length; i++) { 
names[i] = metaData.getColumnLabel(i + 1);// 获取指定列名
}
for (int i = 0; i < o.length; i++) { 
ps.setObject(i+1, o[i]);
}
// 执行sql返回结果集
ResultSet rs = ps.executeQuery();
while (rs.next()) { 
// 每一行数据就是一个对象
// 使用反射创建对象
E obj = c.newInstance();
// 当前行所有列名 在names数组中存储
// 循环names数组取出当前行对应数据
for (String colname : names) { 
Object value = rs.getObject(colname);// 获取列名对应值
// 将值存入相应对象
// 使用反射获取类中同名的属性对象
Field field = c.getDeclaredField(colname);
// 私有属性使用前必须赋权
field.setAccessible(true);
// 调用属性对象的set方法为指定对象进行赋值
field.set(obj, value);
}
// 列名循环结束后对应对象属性已经全部进行赋值
// 将对象存储至集合中
list.add(obj);
}
} catch (Exception e) { 
e.printStackTrace();
return null;
}
return list;
}
}ublic class JDBCUtils { 
private static DataSource ds ;
static { 
try { 
//1.加载配置文件
Properties pro = new Properties();
//使用ClassLoader加载配置文件,获取字节输入流
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;
}

5、创建提供登录方法的userdao

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

6、编写登录的servlet

@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、 编写FailServlet和SuccessServlet类

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

本文地址:https://blog.csdn.net/weixin_45289374/article/details/110498412