JavaSE_Vibatalk專案開發_part3_如何去讀取屬性文件的值_模擬資料庫功能_判斷用戶輸入正確是否

我們在之前  實現了  登入介面窗口的布局和組件的擺放、事件等撰寫

這次的目標是

(1)完成登入功能

(2)完成聊天介面


我們這裡  這篇先來搞定  輸入判別

這裡呢....由於小編沒碰過Java的資料庫且資料庫安裝需要龐大的時間
又是另一門專業技術
在此先教大家如何透過  新增「屬性文件」

模擬  判別是否符合資料庫中的使用者名稱及密碼功能

首先我們在我們的Vibatalk專案

-->右鍵--> 新增 --> 檔案






我們在此建立一個屬性文件  取名為 「db.properties」

切記: 是存放在  src 目錄下唷!!!!!



按下   「完成」  按鈕之後  就會看到 剛熱騰騰 出爐的  文件

被我們新建立在 Vibatalk 專案目錄之下



你會問  為何要這麼寫???  為何要寫在這裡??

如果是真正的 軟體(軟件)  一般通常不會這麼去寫
因為我們現在要連 資料庫(數據庫)
像是  著名的  聊天室 軟體
RC   或是  QQ
當使用者點擊完登入鈕後
它肯定是要把這裡的帳號密碼
帶至伺服器上面去
然後到伺服器(服務器)上驗證完之後
再返回至客戶端告訴使用者 你到底是登入成功還是登入失敗喔!!!!


我們現在不用資料庫因為還沒學XDD
我們這就用這份文件來替代我們的數據庫
那這就是一個很單純的  if ....  else  .... 邏輯 判斷



我們在來要撰寫  讀取文件屬性的  .java  程式  在 src檔案中

對 src  -->右鍵--> 新增 --> class


































IO流對文件的讀寫示意圖






這裡我們在剛剛文件中新增的內容

原則上
等號前面  叫做  「key」
等號後面  叫做  「value」













\





Java的代碼  運行


****.java  ----> ****.class ----->調用到內存運行

src目錄主要放    .java源代碼
bin目錄主要放   .class

這裡我們在剛剛新增了一個靜態方法

getValue

讀取屬性文件的key

根據文件屬性的key去得到該key對應的value值

我們來測試看看





程式碼部分  FileUtils.java



package com.viba.tools;

import java.io.InputStream;
import java.util.Properties;

public class FileUtils {
    
    //根據屬性文件的key(等號前面的字串),得到value(等號後頭的字串)的值
    public static String getValue(String key){
        //創建一個集合類 , 該集合對象裝key-value元素
        Properties p = new Properties();
        try{//異常處理
            //讀取bin目錄下的db.properties文件,並把該文件放入io流中
            InputStream readDB = FileUtils.class.getClassLoader().getResourceAsStream("db.properties");
            p.load(readDB);//把讀取的文件流對象,給Properties對象,該對象有自動獲取key-value的功能
            return p.getProperty(key);//根據key得到key對應的value值,如果沒找到key返回null
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
    public static void main( String[] args){
        //獲取java文件之絕對路徑
        //System.out.println( getValue("pwd") );//印出密碼字串123123
        System.out.println( getValue("username") );//印出Jerry
        /*
        String str = getValue( "abc" );
        System.out.println(str);//會印出null因為不存在此串
        */
        //String path = FileUtils.class.getClassLoader().getResource("").getPath();
        //System.out.println(path);
    }
    
    
    
    
    
    
    
    
    
    
    
    /*
    //根據uname 和 pwd 檢查用戶是否可以登入
    public boolean checkLogin(String uname , String pwd){
        String username = getValue("username");//從文件中,找出用戶名
        String password = getValue("pwd");//從文件中,找出密碼
        
        //判斷使用者輸入的用戶名及密碼是否和文件中已經存在的用戶名、密碼一致
        if(username.equals(uname) && password.equals(pwd)){
            return true;
        }
        
        return false ;
    }
    */
}



再來就是添加判斷
是否帳密兩個欄位輸入都是正確的方法
如果輸入都正確就可以登入


從文件中獲取了用戶名 及 密碼  之後

我們要進行  字串比對


這裡使用    String1.equals( String2 ) ;

寫好之後我們回到

我們第一個  java檔

在  加事件功能  區塊








Client_Login_UI  程式碼

package com.viba.ui;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import com.viba.tools.FileUtils;
public class Client_Login_UI extends JFrame{
    
    private ImageIcon loginLogo = null;//定義圖片組件(還未實體化)
    private JLabel showLogoLabel = null;//定義Label組件
    private int width = 515 , height = 350;
    
    private JLabel userLabel = null , pwdLabel = null;
    private JTextField userNameTextBox = null;//使用者名稱輸入框
    private JPasswordField pwdTextBox = null;//密碼輸入框
    private JButton loginBtn = null , resetBtn = null ;//兩個Button 一個登入 一個重置
    
    
    
    private Client_Login_UI()
    {
        init();
        addComponent();
        addListener();
        showFrame();
    }    
    //Step1.首先有各種組件要做初始化    
    private void init()
    {
        loginLogo = new ImageIcon("images/pic_top.jpg");//圖片初始化
        //showLogoLabel = new JLabel(loginLogo);//初始化JLabel ,並把圖片放入JLabel
        showLogoLabel = new JLabel(loginLogo,JLabel.CENTER);//初始化JLabel ,並把圖片放入JLabel
        //初始化剛建立的JLabel
        userLabel = new JLabel("用戶名:");
        userLabel.setForeground(Color.red); //設置為紅色
        pwdLabel = new JLabel("密   碼:");
        pwdLabel.setForeground(new Color(0,255,0)); //設置為綠色
        //初始化剛建立的JTextField , JPasswordField 
        userNameTextBox = new JTextField();
        pwdTextBox = new JPasswordField();    
        loginBtn = new JButton("登 入");
        loginBtn.setForeground(new Color(125,125,0));
        resetBtn = new JButton("重 置");
        resetBtn.setForeground(Color.orange);
    }
    //Step2.把各種組件在該方法中進行組裝
    private void addComponent()
    {   //窗口的默認布局為邊框布局
        this.setLayout(null);//設置容器布局為null
        this.add(showLogoLabel);//把showLogoLabel這個JLabel組件放入JFrame容器中
        showLogoLabel.setBounds(0 , 0 , width-5 , 100);//相對於this這個窗口的x座標,y座標,寬,高
        
        this.add(userLabel);
        userLabel.setBounds(50 , 100 , 180 , 30);//相對於this這個窗口的x座標,y座標,寬,高
        this.add(userNameTextBox);
        userNameTextBox.setBounds(120 , 100 , 200 , 30);//相對於this這個窗口的x座標,y座標,寬,高
        this.add(pwdLabel);
        pwdLabel.setBounds(50 , 150 , 180 , 30);//相對於this這個窗口的x座標,y座標,寬,高
        this.add(pwdTextBox);
        pwdTextBox.setBounds(120 , 150 , 200 , 30);//相對於this這個窗口的x座標,y座標,寬,高
        this.add(loginBtn);
        loginBtn.setBounds(100 , 190 , 100 , 30);//相對於this這個窗口的x座標,y座標,寬,高
        this.add(resetBtn);
        resetBtn.setBounds(200 , 190 , 100 , 30);//相對於this這個窗口的x座標,y座標,寬,高
    }
    //Step3.加事件功能
    private void addListener()
    {
        //關閉窗口事件
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //給登入按鈕添加事件
        loginBtn.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO 自動產生的方法 Stub
                String username = userNameTextBox.getText();//獲取usernameTextBox文本輸入框值
                String pwd = pwdTextBox.getText();//獲取pwdTextBox文本輸入框值
                boolean b = FileUtils.checkLogin(username , pwd);
                //對 username  和  pwd   進行字符串長度判斷
                if(username.length() == 0 || pwd.length() == 0)
                {
                    JOptionPane.showMessageDialog(null , "你有沒輸入的欄位喔");
                }
                else
                {
                    if(b == true)
                    {
                        System.out.println("成功登入");
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null , "用戶名或密碼錯誤");
                    }
                }
                
                //System.out.println("完成登入");
            }
        });
        //給重置按鈕添加事件
        resetBtn.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO 自動產生的方法 Stub
                userNameTextBox.setText("");
                pwdTextBox.setText("");
            }
        });
        
    }
    //Step4.顯示窗口組件
    private void showFrame()
    {
        //讓窗口在螢幕正中間彈出
        int screenWidth = (int) this.getToolkit().getScreenSize().getWidth();
        int screenHeight = (int) this.getToolkit().getScreenSize().getHeight();
        int x = (screenWidth - width) / 2;
        int y = (screenHeight -height) / 2;
        this.setLocation(x,y);//窗口在屏幕中顯示的座標
        //this.setLocation(250,200);
        
        //第一步彈出一個空窗口配置寬、高
        this.setResizable(false);//不讓窗口大小變化
        this.setSize( width , height );
        //(setSize(width ,height );
        this.setVisible(true);
    }
    public static void main(String[] args)
    {
        new Client_Login_UI();
    }
}


 FileUtils.java 程式碼


package com.viba.tools;

import java.io.InputStream;
import java.util.Properties;

public class FileUtils {
    
    //根據屬性文件的key(等號前面的字串),得到value(等號後頭的字串)的值
    public static String getValue(String key){
        //創建一個集合類 , 該集合對象裝key-value元素
        Properties p = new Properties();
        try{//異常處理
            //讀取bin目錄下的db.properties文件,並把該文件放入io流中
            InputStream readDB = FileUtils.class.getClassLoader().getResourceAsStream("db.properties");
            p.load(readDB);//把讀取的文件流對象,給Properties對象,該對象有自動獲取key-value的功能
            return p.getProperty(key);//根據key得到key對應的value值,如果沒找到key返回null
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
    //根據uname 和 pwd 檢查用戶是否可以登入
        public static boolean checkLogin(String uname , String pwd){
            String username = getValue("username");//從文件中,找出用戶名
            String password = getValue("pwd");//從文件中,找出密碼
            
            //判斷使用者輸入的用戶名及密碼是否和文件中已經存在的用戶名、密碼一致
            if(username.equals(uname) && password.equals(pwd)){
                return true;
            }
            else{
                return false ;
            }
            
        }
        
    
    //public static void main( String[] args){
        //獲取java文件之絕對路徑
        //System.out.println( getValue("pwd") );//印出密碼字串123123
        //System.out.println( getValue("username") );//印出Jerry
        
        //String str = getValue( "abc" );
        //System.out.println(str);//會印出null因為不存在此串
        
        //String path = FileUtils.class.getClassLoader().getResource("").getPath();
        //System.out.println(path);
    //}
}





以上是這篇學習分享



留言

這個網誌中的熱門文章

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header

經得起原始碼資安弱點掃描的程式設計習慣培養(三)_7.Cross Site Scripting(XSS)_Stored XSS_Reflected XSS All Clients

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題