【JavaWeb】从零实现用户登录
1.数据库预备
1.1 SQL
创建数据库
create database db;
创建表
create table userInfo( id int primary key , name varchar(20), password varchar(20), age int, email varchar(20) );
导入测试数据
insert into userInfo values(1,'super','123',25,'123456@nova.com'); insert into userInfo values(2,'nova','111',26,'test@nova.com');
在SQLog或Navicat执行以上SQL语句之后,即完成了数据库的基础数据的预备
2. JavaWeb编程
2.1 配置文件
考虑在后续开发中,数据库的路径、用户名、密码等内容是可能会改变的,后续的开发中,应该尽量的避免修改代码,所以创建DBConfig.properties配置文件,将后续可能发生改变的内容放在配置文件中,后续只要修改配置文件即可。DBConfig.properties文件是以键值对的形式存储的。
DBConfig.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db
user=root
password=(这里写你的数据库密码)
2.2 封装数据库工具类
在编程中,应该习惯于使用面向对象的思想,增强代码的复用性、健壮性、可读性。所以,这里我将程序中对数据库的操作封装成一个工具类,并且内部的方法使用static修饰。
用static修饰的好处在于, static修饰的方法被放在JVM的静态方法区,随着类的加载而加载,能够使用类名调用方法,并且static执行的效率高,速度快,所以,我们封装的工具类应尽量使用静态的,要注意的是,静态的方法中,只能调用静态的成员变量。
DBUtil.java
package com.nova.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ResourceBundle; /** * 数据库工具类 * @author supernova * */ public class DBUtil { private static String url; private static String user; private static String pwd; //因为获取文件配置信息和加载驱动只需要执行一次,所以将这两个功能放入静态代码块中,随着类的加载而加载,能提高代码的效率 static { //获取配置文件信息 ResourceBundle bundle = ResourceBundle.getBundle("DBConfig"); url = bundle.getString("url"); user = bundle.getString("user"); pwd = bundle.getString("password"); //利用反射,加载驱动 try { Class.forName(bundle.getString("driver")); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //获取连接通道 public static Connection getConnection() throws SQLException{ return DriverManager.getConnection(url,user,pwd); } //关闭所有资源 public static void closeAll(Connection connection,PreparedStatement pStmt, ResultSet resultSet) throws SQLException{ if(connection != null){ connection.close(); } if(pStmt != null){ pStmt.close(); } if(resultSet != null){ resultSet.close(); } } }
2.3 JavaBean编程思想
在用户登录中,往往会需要在客户端显示当前登录用户的信息,比如当前用户名等,所以为了加强程序的可扩展性,在服务端的JDBC编程中执行数据库查询操作时,应将查询到的内容存到对象中,在后续需要使用用户信息时,只需将该对象返回给客户端即可,所以这就需要创建一个bean类,称为模型。bean类中成员变量的个数,类型应尽量与数据库表中的一致,以方便使用。
UserInfo.java
package com.nova.bean; public class UserInfo { private int id; private String name; private String password; private int age; private String email; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public UserInfo(int id, String name, String password, int age, String email) { super(); this.id = id; this.name = name; this.password = password; this.age = age; this.email = email; } public UserInfo() { super(); } @Override public String toString() { return "UserBean [id=" + id + ", name=" + name + ", password=" + password + ", age=" + age + ", email=" + email + "]"; } }
2.3 服务端主程序
ServerMain.java
package com.nova.test; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.nova.bean.UserInfo; import com.nova.util.DBUtil; /** * 服务端主程序 * @author supernova * */ public class ServerMain extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取客户端发来的用户名和密码 String user = req.getParameter("user"); String pwd = req.getParameter("pwd"); //打印流 PrintWriter pw = resp.getWriter();; Connection con = null; PreparedStatement pStmt = null; ResultSet resultSet = null; UserInfo userInfo = null; try{ con = DBUtil.getConnection();//获取数据库连接, String sql = "select * from userInfo where name = ? and password = ?"; pStmt = con.prepareStatement(sql); pStmt.setString(1, user); pStmt.setString(2, pwd); resultSet = pStmt.executeQuery(); if(resultSet.next()){ userInfo = new UserInfo(); userInfo.setId(resultSet.getInt("id")); userInfo.setName(resultSet.getString("name")); userInfo.setPassword(resultSet.getString("password")); userInfo.setEmail(resultSet.getString("email")); } if(userInfo != null){ //登录成功 pw.print("Login Success"); }else { //登录失败 pw.print("Login Failed"); } }catch(SQLException e){ e.printStackTrace(); }finally{ //最后需要把所有资源关闭 pw.close(); try { DBUtil.closeAll(con, pStmt, resultSet); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
2.4 导入mysql的jar包
下载mysql驱动jar包 下载链接:https://download.csdn.net/download/xin93/10334399
下载解压后,将jar包复制到MyEclipse工程目录的WebRoot/WEB-INF/lib中,并右键build path --> Add to build path
2.4 模拟客户端(网页)
在网页客户端的body标签中添加表单:
<form action="login"> username:<input type="text" name="user"/><br/> password:<input type="password" name="pwd"/><br/> <input type="submit" value="login"/> </form>
2.5 web.xml
在WebRoot/WEB-INF的目录下,打开web.xml文件,在web-app标签下添加:
<servlet> <servlet-name>ServerMain</servlet-name> <servlet-class>com.nova.test.ServerMain</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServerMain</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
3. 运行测试
点击Login按钮,登录成功。
输入错误的用户名密码,
登录失败