接着前面的登陸模塊的進化史,帶你們回顧java學習歷程(一) 繼續往下面講html
前面咱們去實現登陸功能,都是想着要完成這個功能,直接在處理實際業務的類中去開始寫具體的代碼一步步實現,也就是面向過程的編程。前端
那麼如今咱們站在設計的角度上去實現該如何作呢?實際上在項目開發的時候,需求規劃和數據庫設計好以後,咱們開始寫代碼,每每只用寫一些接口出來,接口裏面只有一些各個業務對應的空方法,沒有具體的實現,在架構師進行接口設計的時候,就已經想好了該功能以後經過實現與調用這個接口確定是能夠實現的,等各個功能相關的接口設計好以後,剩下的就是程序員去實現與調用這些接口,就跟填空同樣。在作接口設計的時候只用關心方法的形參與返回值類型,能夠寫好對應的接口文檔,描述每一個接口的做用,接口中每一個方法的形參的含義和返回值的含義,這樣能夠更好的方便團隊開發。其實這個跟作房子很像,作房子也是先把設計圖作好,而後搭建框架,剩下的就是碼磚了。java
在咱們使用函數(方法)的時候,咱們要理解一個概念。一去一回(也能夠說是請求與響應),特別是在作http請求時更加明顯。在非void返回類型的函數中,都是須要retrun一個返回值的,而調用函數給形參傳遞實參的時候,這個過程咱們就能夠看作是「去」,在函數體類作一大堆的邏輯與業務的處理,待處理完以後,就返回一個結果回去,這個就是「回」。android
好比作一個網頁登錄的功能,首先是從html裏面的輸入框將用戶名和密碼信息(實參)傳遞到服務端,服務端就存在一個checkLogin的函數來接收前端傳遞過來的實參,而後去查詢數據庫,處理完結果以後返回一個結果告知前端是否登陸成功,前端能夠根據這個返回值進行UI界面的提示與界面跳轉等工做。在作分紅業務涉及的時候,前面的用戶名和密碼可能還要通過幾回函數之間的傳遞,可是都是又去有回。像web設計中的ajax與android網絡請求retorfit中都體現的特別明顯,你們充分理解了一去一回的原理以後,能夠更加的方便咱們對功能模塊進行設計。程序員
好下面,咱們具體來經過代碼進行展現。web
咱們新建一個java工程,而後此時咱們不着急去寫代碼,先作個分包(package)的工做,至關於一個組織架構,使代碼結構更加清晰,也更方便閱讀與維護。ajax
dao這個包下面就用來存放咱們的接口,daoimpl下面用來存放咱們的接口實現類,main做爲項目的主入口,用來存放具體業務的實現,pojo用來存放數據模型類(等下具體講解pojo的做用),utils用來存放工具類(把上一章咱們寫好的DBHelper放到這個包下)。sql
POJO(Plain Old Java Objects)簡單的Java對象,實際就是普通JavaBeans,其中有一些屬性及其getter setter方法的類,有時能夠做爲value object或dto(Data Transform Object)來使用.固然,若是你有一個簡單的運算屬性也是能夠的,但不容許有業務方法,能夠當作是與數據庫中的表相映射的 java 對象。數據庫
咱們在pojo包下面新建一個User類編程
/** * */ package com.xdw.pojo; /** * @author xiadewang *2018年1月14日 */ public class User { private int id; private String username; private String password; /** * @param id * @param username * @param password */ public User(int id, String username, String password) { super(); this.id = id; this.username = username; this.password = password; } /** * @return the id */ public int getId() { return id; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @return the username */ public String getUsername() { return username; } /** * @param username the username to set */ public void setUsername(String username) { this.username = username; } /** * @return the password */ public String getPassword() { return password; } /** * @param password the password to set */ public void setPassword(String password) { this.password = password; } }
下面咱們面向接口進行編程,好比說咱們如今的業務有以下:
一、登陸
二、註冊
三、根據id查詢用戶信息
四、根據username查詢用戶信息
五、修改用戶密碼
這時候,若是是面向過程設計的話,咱們就想着先去完整的完成登陸的功能,而後完成註冊的功能,而後繼續下面的345的業務。
換成接口設計的話,就是咱們先在dao下面新建一個接口UserDao,具體代碼以下
/** * */ package com.xdw.dao; import com.xdw.pojo.User; /** * @author xiadewang *2018年1月14日 */ public interface UserDao { /** * 傳遞用戶名和密碼來校驗登陸 * @param username * @param password * @return */ public boolean checkLogin(String username,String password); /** * 傳遞user對象來校驗登錄 * @param user * @return */ public User checkLogin(User user); /** * 傳遞user對象進來,返回值1表明註冊成功,0表明註冊失敗 * @param user * @return */ public int register(User user); /** * 傳遞int型的id參數,返回值爲user對象 * @param id * @return */ public User getUserById(int id); /** * 傳遞字符串類型的用戶名,返回值爲user對象 * @param username * @return */ public User getUserByUsername(String username); /** * 傳遞要修改密碼的user對象,和要修改的密碼,返回值1表明修改爲功,0表明修改失敗 * @param user * @param password * @return */ public int modifyPassword(User user,String password); }
因爲這裏的功能很簡單,直接把接口說明文檔寫到了註釋之中,這個時候設計工做就完了,下面換個程序員來完成程序的完整功能。
在daoimpl包下面寫一個接口實現類UserDaoImpl,以下
/** * */ package com.xdw.daoimpl; import java.sql.ResultSet; import java.sql.SQLException; import com.xdw.dao.UserDao; import com.xdw.pojo.User; import com.xdw.utils.DBHelper; /** * @author xiadewang *2018年1月14日 */ public class UserDaoImpl implements UserDao { /* (non-Javadoc) * @see com.xdw.dao.UserDao#checkLogin(java.lang.String, java.lang.String) */ @Override public boolean checkLogin(String username, String password) { // TODO Auto-generated method stub return false; } /* (non-Javadoc) * @see com.xdw.dao.UserDao#checkLogin(com.xdw.pojo.User) */ @Override public User checkLogin(User user) { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see com.xdw.dao.UserDao#register(com.xdw.pojo.User) */ @Override public int register(User user) { // TODO Auto-generated method stub return 0; } /* (non-Javadoc) * @see com.xdw.dao.UserDao#getUserById(int) */ @Override public User getUserById(int id) { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see com.xdw.dao.UserDao#getUserByUsername(java.lang.String) */ @Override public User getUserByUsername(String username) { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see com.xdw.dao.UserDao#modifyPassword(com.xdw.pojo.User, java.lang.String) */ @Override public int modifyPassword(User user, String password) { // TODO Auto-generated method stub return 0; } }
這些都是編譯器自動生成的代碼,這個時候咱們甚至都不用去完成裏面每一個方法的具體內容,能夠直接跳到實現業務的主類中去實現咱們的業務,由於這些方法都會存在一個默認的返回值,並不影響程序的編譯與運行。
這個時候咱們在main包中建立一個實現業務的類MainClass,以下
/** * */ package com.xdw.main; import com.xdw.dao.UserDao; import com.xdw.daoimpl.UserDaoImpl; import com.xdw.pojo.User; /** * @author xiadewang *2018年1月14日 */ public class MainClass { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub UserDao userDao=new UserDaoImpl(); if(userDao.checkLogin("xdw","123456")) { System.out.println("用戶xdw登陸成功"); }else { System.out.println("用戶xdw登陸失敗"); } if(userDao.checkLogin("xxx","1234")) { System.out.println("用戶xxx登陸成功"); }else { System.out.println("用戶xxx登陸失敗"); } User user1=new User(1,"xdw","123456"); User user2=new User(2,"xxx","ttt"); if(userDao.checkLogin(user1) !=null) { System.out.println("用戶xdw登陸成功"); }else { System.out.println("用戶xdw登陸失敗"); } if(userDao.checkLogin(user2) !=null) { System.out.println("用戶xxx登陸成功"); }else { System.out.println("用戶xxx登陸失敗"); } } }
這裏,我只用2個重載的checkLogin方法作了業務展現,你們如今能夠運行下,運行結果以下
進行到了,其實整個業務的設計與實現就完成了,剩下的工做咱們就是要去具體的完善接口實現類的內容了,讓他們更加的符合實際的業務處理,好比要鏈接數據庫作真實的數據處理,這裏只用第一個checkLogin作下舉例,完善後的UserDaoImpl以下:
/** * */ package com.xdw.daoimpl; import java.sql.ResultSet; import java.sql.SQLException; import com.xdw.dao.UserDao; import com.xdw.pojo.User; import com.xdw.utils.DBHelper; /** * @author xiadewang *2018年1月14日 */ public class UserDaoImpl implements UserDao { private String sql = null; private DBHelper db1 = null; private ResultSet ret = null; /* (non-Javadoc) * @see com.xdw.dao.UserDao#checkLogin(java.lang.String, java.lang.String) */ @Override public boolean checkLogin(String username, String password) { // TODO Auto-generated method stub try { sql = "select * from user where username= ? and password= ?";// SQL語句 db1 = new DBHelper(sql);// 建立DBHelper對象 db1.pst.setString(1, username); db1.pst.setString(2, password); ret = db1.pst.executeQuery();// 執行語句,獲得結果集 if(ret.next()) { return true; } ret.close(); db1.close();// 關閉鏈接 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } /* (non-Javadoc) * @see com.xdw.dao.UserDao#checkLogin(com.xdw.pojo.User) */ @Override public User checkLogin(User user) { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see com.xdw.dao.UserDao#register(com.xdw.pojo.User) */ @Override public int register(User user) { // TODO Auto-generated method stub return 0; } /* (non-Javadoc) * @see com.xdw.dao.UserDao#getUserById(int) */ @Override public User getUserById(int id) { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see com.xdw.dao.UserDao#getUserByUsername(java.lang.String) */ @Override public User getUserByUsername(String username) { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see com.xdw.dao.UserDao#modifyPassword(com.xdw.pojo.User, java.lang.String) */ @Override public int modifyPassword(User user, String password) { // TODO Auto-generated method stub return 0; } }
到這裏就不用我來囉嗦接口的重要做用了吧,java的核心我的以爲就是類、對象與接口,特別是面向接口編程。
初學者每每會以爲接口沒什麼鳥用,原本能夠幾行代碼實現的功能,恰恰要添加一個接口出來,還要再添加一個實現類,不光增長代碼還繞來繞去。
經過這裏的接口編程的演示,你們有沒有發現可讓咱們作項目的時候思路更加清晰,代碼可閱讀和可擴展性也越強。咱們要有一個概念,編程不是代碼越少越好,而是要設計與思路越清晰越好。
這篇就到此爲止,下一篇將引入servlet+jsp,到時候就會有UI界面了,前面的都仍是console控制檯輸出,可能會以爲不過癮,仍是以爲代碼沒有什麼用,不能運用到實際中。