目次
1. 開発要件
1. ログイン機能を完了します。
2. 登録機能を完了します。
3. 登録完了と同時に同じユーザー名を登録することはできません。
2. 環境構築
2.1、jarパッケージを構成する
まず、Web プロジェクトのプロジェクトを作成し、Web パッケージの WEB-INF 配下に lib パッケージを作成し、その中に mysql 接続 jar パッケージを配置します。mysql5 バージョンと mysql8 バージョンの jar パッケージはここで提供されます。 mysql のバージョンに対応し、mysql5 シリーズのバージョンの場合は 5.16 jar パッケージを使用し、mysql8 シリーズのバージョンの場合は 8.0.16 バージョンの jar パッケージを使用します。
リンク: https://pan.baidu.com/s/1loxaN41BXlfdePT_8DDBDw
抽出コード: 388i
以下のように設定します
注: 必ず入れた後にインポートしてください。jar パッケージを右クリックし、[ライブラリの追加] をクリックしてインポートします。
2.2、jdbc.properties ファイルを構成する
src ディレクトリに新しい jdbc.properties ファイルを作成し、次の内容を追加します。
jdbc.className=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test5
jdbc.username=root
jdbc.password=xxx
2.3. MVC 3 層パッケージの作成
開発では MVC 3 層アーキテクチャを使用する必要があるため、図に示すように、対応するパッケージを作成する必要があります。
3層とはdao層、サービス層、Web層で、Bean層はJavaBeanというエンティティクラスを格納する層、utilはツールクラスを格納するパッケージです。
2.4、JDBCUtil クラスの保存
次のコードを util パッケージの JDBCUtil クラスに追加します。
public class JDBCUtil {
public JDBCUtil() {
}
private static String className;
private static String url;
private static String username;
private static String password;
private static Connection conn = null;
static {
Properties pro = null;
InputStream is = null;
try {
is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
pro = new Properties();
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
className = pro.getProperty("jdbc.className");
url = pro.getProperty("jdbc.url");
username = pro.getProperty("jdbc.username");
password = pro.getProperty("jdbc.password");
//加载驱动
try {
Class.forName(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//获取连接
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
return conn;
}
public static void close(ResultSet rs, Statement stmt, Connection conn) {
try {
if (rs != null) {
rs.close();
rs = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (stmt != null) {
stmt.close();
stmt = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Statement stmt, Connection conn) {
try {
if (stmt != null) {
stmt.close();
stmt = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2.5、mysqlを作成する
テーブル t_user を作成する
CREATE TABLE `t_user` (
`username` varchar(20) NOT NULL,
`password` varchar(20) NOT NULL,
PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ご自身でデータを追加してください
3. コード開発
3.1、Web レイヤーの開発
フロントエンドから送信されるデータをシミュレートするために、ここではスキャナーを使用してデータを取得しますが、実際の開発ではWeb層でサーブレット技術を使用してフロントエンドのデータを取得します。
public class UserWeb {
public static void main(String[] args) {
//创建service对象
UserService userService=new UserServiceImpl();
System.out.println("请选择选项");
System.out.println("1-----登录");
System.out.println("2-----注册");
Scanner sc =new Scanner(System.in);
int i = sc.nextInt();
switch (i){
case 1:
System.out.println("请输入账号");
Scanner sc1=new Scanner(System.in);
String username = sc1.nextLine();
System.out.println("请输入密码");
Scanner sc2=new Scanner(System.in);
String password = sc2.nextLine();
//创建user对象 把用户输入的账号密码封装对象
User user=new User();
user.setUsername(username);
user.setPassword(password);
boolean flag1 = userService.login(user);
if(flag1==true){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
break;
case 2:
System.out.println("请输入注册账号");
Scanner register1=new Scanner(System.in);
String s1 = register1.nextLine();
System.out.println("请输入注册密码");
Scanner register2=new Scanner(System.in);
String s2 = register2.nextLine();
User user1=new User();
user1.setUsername(s1);
user1.setPassword(s2);
boolean register = userService.register(user1);
if(register){
System.out.println("注册成功");
}else{
System.out.println("注册失败,用户已存在");
}
break;
default:
System.out.println("你输入的有误");
}
}
}
3.2、サービス層の開発
サービス層も、dao 層と同様、インターフェースおよび実装クラスです。
UserServiceインターフェース
public interface UserService {
//登录功能
public boolean login(User user);
//注册功能
public boolean register(User user);
}
UserServiceImpl実装クラス
public class UserServiceImpl implements UserService {
//登录功能
@Override
public boolean login(User user) {
//创建userDao对象
UserDao userDao=new UserDaoImpl();
//调用login方法把参数user传递过去,得到一个返回值为user_data
User user_data = userDao.login(user);
//判断user_data是否为空
if(user_data!=null){
//不为空 证明查询出了用户 登录成功
return true;
}
//否则登录失败
return false;
}
//注册功能
@Override
public boolean register(User user) {
UserDao userDao=new UserDaoImpl();
//调用userDao中的queryByName方法里面传递一个用户名 得到返回值user1
User user1 = userDao.queryByName(user.getUsername());
//判断user1是否为空
if(user1!=null){
//不为空 证明用户存在 不能注册
return false;
}else{
//为空 则可以注册 调用注册方法
Boolean register = userDao.register(user);
//判断返回值是否注册成功
if(register){
//成功则返回true
return true;
}else{
//否则返回false
return false;
}
}
}
}
3.3、dao層の開発
UserDao インターフェースを作成する
public interface UserDao {
//登录方法
public User login(User user);
//注册方法
public Boolean register(User user);
//查询用户方法
public User queryByName(String username);
}
dao 層に impl パッケージを作成し、インターフェースの実装クラスを格納します。
クラスコードを実装する
public class UserDaoImpl implements UserDao {
//登录功能
@Override
public User login(User user) {
//调用工具类获取连接对象
Connection conn = JDBCUtil.getConnection();
//初始化对象
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// Statement stmt = conn.createStatement();
// String sql="select * from t_user where username='"+user.getUsername()+"' and password='"+user.getPassword()+"'";
// ResultSet rs = stmt.executeQuery(sql);
//解决sql注入问题
String sql = "select * from t_user where username= ? and password = ?";
//把sql语句传递给pstmt对象
pstmt = conn.prepareStatement(sql);
//给占位符赋值
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
//调用查询方法
rs = pstmt.executeQuery();
//对结果进行遍历
while (rs.next()) {
String username = rs.getString("username");
String password = rs.getString("password");
User user1 = new User();
user1.setUsername(username);
user1.setPassword(password);
//返回结果
return user1;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//释放资源
JDBCUtil.close(rs, pstmt, conn);
}
return null;
}
//注册功能
@Override
public Boolean register(User user) {
Connection conn = JDBCUtil.getConnection();
// Statement stmt = null;
PreparedStatement pstmt= null;
// stmt = conn.createStatement();
// String sql = "select * from t_user where username='" + user.getUsername() + "'";
// rs = stmt.executeQuery(sql);
try {
// String sql = "insert into t_user value('" + user.getUsername() + "','" + user.getPassword() + "')";
String sql2 = "insert into t_user value(?,?)";
pstmt = conn.prepareStatement(sql2);
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
int i;
i = pstmt.executeUpdate();
if (i == 1) {
return true;
} else {
return false;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(pstmt, conn);
}
//以上try里面出现错误直接返回false
return false;
}
@Override
public User queryByName(String username) {
Connection conn = JDBCUtil.getConnection();
ResultSet rs;
PreparedStatement pstmt;
String sql1 = "select * from t_user where username=?";
try {
pstmt = conn.prepareStatement(sql1);
pstmt.setString(1, username);
rs = pstmt.executeQuery();
while(rs.next()){
String username1 = rs.getString("username");
String password = rs.getString("password");
User user=new User();
user.setUsername(username1);
user.setPassword(password);
return user;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
3.4. ログイン機能のテスト
ユーザーウェブを実行する
3.5. 登録機能テスト