Servlet实现简单的用户登录功能实例代码

 更新时间:2020年12月04日 11:59:02   作者:少女总裁、  
这篇文章主要给大家介绍了关于利用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实现用户登录功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java如何执行cmd命令

    Java如何执行cmd命令

    这篇文章主要介绍了Java如何执行cmd命令问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Java栈和基础队列的实现详解

    Java栈和基础队列的实现详解

    这篇文章主要介绍了Java数据结构中的栈与队列,在Java的时候,对于栈与队列的应用需要熟练的掌握,这样才能够确保Java学习时候能够有扎实的基础能力。本文小编就来详细说说Java中的栈与队列,需要的朋友可以参考一下
    2022-02-02
  • Java ArrayDeque使用方法详解

    Java ArrayDeque使用方法详解

    这篇文章主要为大家详细介绍了Java ArrayDeque的使用方法,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • Java常量池知识点总结

    Java常量池知识点总结

    本篇文章给大家通过理论原理等方便彻底分析了Java常量池的相关知识,有兴趣的朋友阅读学习下吧。
    2017-12-12
  • JAVA实现 springMVC方式的微信接入、实现消息自动回复实例

    JAVA实现 springMVC方式的微信接入、实现消息自动回复实例

    本篇文章主要介绍了JAVA实现 springMVC方式的微信接入、实现消息自动回复,这里整理了详细的代码,有需要的小伙伴可以参考下。
    2016-12-12
  • 每天练一练Java函数与算法Math函数总结与字符串转换整数

    每天练一练Java函数与算法Math函数总结与字符串转换整数

    这篇文章主要介绍了Java函数与算法Math函数总结与字符串转换整数,每天练一练,水平在不知不觉中提高,需要的朋友快过来看看吧
    2021-08-08
  • java和 javaw 及 javaws的区别解析

    java和 javaw 及 javaws的区别解析

    这篇文章主要介绍了java和 javaw 及 javaws的区别解析,本文通过实例给大家详细介绍,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 全网最深分析SpringBoot MVC自动配置失效的原因

    全网最深分析SpringBoot MVC自动配置失效的原因

    这篇文章主要介绍了全网最深分析SpringBoot MVC自动配置失效的原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java调用shell脚本解决传参和权限问题的方法

    Java调用shell脚本解决传参和权限问题的方法

    今天小编就为大家分享一篇关于Java调用shell脚本解决传参和权限问题的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Spring中的拦截器HandlerInterceptor详细解析

    Spring中的拦截器HandlerInterceptor详细解析

    这篇文章主要介绍了Spring中的拦截器HandlerInterceptor详细解析,HandlerInterceptor 是 Spring 框架提供的一个拦截器接口,用于在请求处理过程中拦截和处理请求,需要的朋友可以参考下
    2024-01-01

最新评论