Servlet实现简单的用户登录功能实例代码
作者:少女总裁、
这篇文章主要给大家介绍了关于利用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); } }
到此这篇关于Servlet实现简单的用户登录功能的文章就介绍到这了,更多相关Servlet实现用户登录功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!