程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 第14天dbutils與案例,第14天dbutils案例

第14天dbutils與案例,第14天dbutils案例

編輯:JAVA綜合教程

第14天dbutils與案例,第14天dbutils案例


第14天dbutils與案例

第14天dbutils與案例    1

1.    1.dbutils介紹    2

2.    2.dbutils快速入門    2

3.    3.dbutils API詳解-DbUtils類    2

4.    4.dbutils API詳解-QueryRunner類    2

5.    5.dbutils API詳解-ResultSetHandler    3

6.    6.ResultSetHandler實現類介紹    3

7.    7.案例--添加商品分析    3

8.    8.案例--添加商品實現    4

9.    9.案例--查詢全部分析    4

10.    10.案例--查詢全部實現    4

11.    11.案例--修改分析    4

12.    12.案例--修改實現    4

 

知識點回顧:

 

dbutils介紹

 

如何學習新技術:

 

 

 

DBUtils是什麼?

 

作用:幫助java程序員,開發Dao層代碼的簡單框架。

 

框架作用:它是幫助程序員,提高開發效率的工具。(木工師傅,鋸子,錘子。。。)

 

JDBC幾技術本身是可以開發dao層代碼,那麼為什麼還需要學習,DBUtils?

 

JDBC技術的弊端分析:

 

回顧day13項目中JDBC代碼:

 

需求:操作jdbc數據庫,操作user表,獲取user表中所有的數據

 

 

代碼演示:

// 需求:獲取當前user表中所有的數據

    public List<User> findAllUser() {

        // 定義一個鏈接對象

        Connection conn = null;

        // 定義一個操作sql語句的對象

        PreparedStatement stmt = null;

        // 定義一個封裝結果集的對象

        ResultSet rs = null;

 

        try {

            conn = JDBCUtils.getConnection();

            String sql = "select * from user";

            stmt = conn.prepareStatement(sql);

            rs = stmt.executeQuery();

 

            // 准備一個list集合,保存User對象

            List<User> list = new ArrayList<User>();

            while (rs.next()) {

                User u = new User();

                u.setAddress(rs.getString("address"));

                u.setAge(rs.getInt("age"));

                u.setBirthday(rs.getDate("birthday"));

                u.setDescription(rs.getString("description"));

                u.setEmail(rs.getString("email"));

                u.setHobby(rs.getString("hobby"));

                u.setId(rs.getInt("id"));

                u.setName(rs.getString("name"));

                u.setPassword(rs.getString("password"));

                u.setSex(rs.getString("sex"));

 

                list.add(u);

            }

            return list;

        } catch (SQLException e) {

            e.printStackTrace();

            return null;

        } finally {

            // 釋放資源

            JDBCUtils.release(rs, stmt, conn);

        }

    }

 

JDBC弊端:

 

 

 

導致:程序員在開發的時候,大量的重復勞動。開發的周期長,效率低

 

DBUtils:它主要是封裝了JDBC的代碼,簡化了dao層的操作。

 

它主要是封裝了JDBC的代碼——DBUtils的底層還是JDBC,做了一次簡單的封裝方便程序員使用。

 

 

DBUtils由Apache公司提供——一個需要Java程序員關注的公司。雲計算,谷歌三篇論文,hadoop——大數據技術。

 

 

阿裡巴巴技術——大型分布式電商網站,技術特點,能解決高並發,高可用問題

B2B 企業與企業 做生意(電商平台)

B2C 天貓 企業與個人用戶(電商平台)

C2C 個人與個人 淘寶(電商平台)

 

阿裡雲開發者平台,共享了阿裡的電商開發的很多技術(雲計算,雲存儲,海量數據分析,智能推薦。。。。。)

 

 

學習新技術的思路:

 

 

 

 

 

下載:DBUtils——http://commons.apache.org/proper/commons-dbutils/

去下載頁面:

 

解壓:

解壓後:

 

 

學習一個類方式:

 

定義:

 

構造函數:

DbUtils()

 

成員函數:

 

 

 

 

總結:DbUtils,它是一個控制連接,控制事物,控制驅動加載的一個類。

 

注意:今天使用C3P0連接數據庫,所以不使用DbUtils類,但是,在關閉資源的時候,會使用到DbUtils,而且這個DbUtils關閉資源的方法,是框架自動調用,不需要程序員,書寫java代碼,手動調用。

 

 

老師既然不用,為何要學?

作為一個JDBC框架(操作數據庫),肯定需要有加載驅動,獲取連接,關閉資源的方法,所以DBUtils技術,設計了一個類(DbUtils).

 

那以後我要不要使用DbUtils類?

 

一般來說,不用,以後開發,使用框架,框架內部一般都使用C3P0連接數據庫

 

定義:

 

 

 

 

構造函數:

QueryRunner():創建一個與數據庫無關的queryRunner對象,後期在操作數據庫的時候,需要手動給一個Connection對象,它可以手動控制事物。

Connection.setAutoCommit(false);設置手動管理事務

Connection.commit();提交事務

 

QueryRunner(DataSource ds):創建一個與數據庫關聯的queryRunner對象,後期在操作數據庫的時候,不需要Connection對象,自動管理事物。

 

 

DataSource參數:就是c3p0數據庫連接池對象

 

c3p0數據庫連接池對象,它實現類java.sql.DateSource這個接口

 

ComboPooledDataSource extends AbstractPoolBackedDataSource implements PooledDataSource

 

PooledDataSource:PooledDataSource extends DataSource

 

成員方法:

 

增刪改方法:

 


update(Connection conn, String sql, Object... params):這是執行添加,修改和刪除sql語句的方法,三個參數(數據庫連接,sql語句,sql語句的參數)

 

    update(String sql, Object... params):這是執行添加,修改和刪除sql語句的方法,兩個參數(sql語句,sql語句的參數)

 

 

查詢的方法

 

    query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params):這是執行查詢sql語句的方法,四個參數(數據庫連接,sql語句,封裝數據的策略對象,sql語句的參數)

 

query(String sql, ResultSetHandler<T> rsh, Object... params):這是執行查詢sql語句的方法,三個參數(sql語句,封裝數據的策略對象,sql語句的參數)

 

 

 

構造函數與增刪改查方法的組合:

QueryRunner()

    update(Connection conn, String sql, Object... params)

query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)

 

QueryRunner(DataSource ds)

    update(String sql, Object... params)

    query(String sql, ResultSetHandler<T> rsh, Object... params)

 

 

策略:封裝數據到對象的方式(示例:將數據保存在User、保存到數組、保存到集合)

定義:

 

方法介紹:

 

注意:詳解參考ResultSetHandler實現類介紹

 

  • 使用QueryRunner對象完成增刪改的操作

  •  

    代碼演示:

    //需求:向user表插入一條數據

        @Test

        public void test1(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "insert into user values(null,?,?)";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                int update = qr.update(sql, "狗蛋","123456");

                System.out.println(update);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

        

        //需求:修改id==7的數據

        @Test

        public void test2(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "update user set name = ? where id = ?";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                int update = qr.update(sql, "柳巖",7);

                System.out.println(update);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

        

        //需求:刪除id==7的數據

        @Test

        public void test3(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "delete from user where id = ?";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                int update = qr.update(sql, 7);

                System.out.println(update);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

     

  • QueryRunner的query方法與ResultSetHandler接口介紹

    自定義策略:

     

    package cn.itcast.handler;

     

    import java.sql.ResultSet;

    import java.sql.SQLException;

    import java.util.ArrayList;

    import java.util.List;

     

    import org.apache.commons.dbutils.ResultSetHandler;

     

    import cn.itcast.domain.User;

    // ResultSetHandler<T>,<T>表示封裝結果的類型

    //MyHandler 是自定義的ResultSetHandler封裝結果集策略對象

    public class MyHandler implements ResultSetHandler<List<User>>{

     

        @Override

        public List<User> handle(ResultSet rs) throws SQLException {

            //封裝數據,數據從Resultset中獲取

     

            List<User> list = new ArrayList<User>();

            while(rs.next()){

                User u = new User();

                u.setId(rs.getInt("id"));

                u.setName(rs.getString("name"));

                u.setPwd(rs.getString("pwd"));

                

                list.add(u);

            }

            return list;

        }

     

    }

     

     

     

    測試代碼:

     

        //需求:獲取user表中所有的數據

        @Test

        public void test4(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "select * from user";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                List<User> list = qr.query(sql, new MyHandler());

                System.out.println(list);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

     

     

    效果:

    總結:

             1)創建queryRunner對象,用來操作數據庫

    2)設置一個sql語句,用來操作數據庫

    3)根據sql語句,執行相應的方法(insert 、 delete 、update===== update方法 || select=====query方法)

     

     

     

  • ResultSetHandler實現類介紹(由DBUtils框架給我們提供使用)

     

    實現類的學習方式:先測試,根據測試結果,總結當前實現類的按照什麼樣的方式封裝數據(策略)

     

     

    //需求:測試ArrayHandler策略

        //ArrayHandler:將查詢結果的第一行數據,保存到Object數組中

        @Test

        public void test5(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "select * from user";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                Object[] objects = qr.query(sql, new ArrayHandler());

                for (Object object : objects) {

                    System.out.println(object);

                }

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    效果:

    //需求:測試ArrayListHandler策略

        //ArrayListHandler:將查詢的結果,每一行先封裝到Object數組中,然後,將數據存入list集合

        @Test

        public void test6(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "select * from user";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                List<Object[]> list = qr.query(sql, new ArrayListHandler());

                for (Object[] objects : list) {

                    for (Object object : objects) {

                        System.out.println(object);

                    }

                    System.out.println("=====");

                }

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    效果:

     

    //需求:測試BeanHandler策略

        //BeanHandler:將查詢結果的第一行數據,封裝到user對象

        @Test

        public void test7(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "select * from user";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                User user = qr.query(sql, new BeanHandler<User>(User.class));

                System.out.println(user);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

     

    效果:

     

    //需求:測試BeanListHandler策略

        //BeanListHandler:將查詢結果的每一行封裝到user對象,然後,再存入list集合

        @Test

        public void test8(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "select * from user";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));

                System.out.println(list);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    效果:

    //需求:測試ColumnListHandler策略

        //ColumnListHandler:將查詢結果的指定列的數據封裝到list集合中

        @Test

        public void test9(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "select * from user";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                Object object = qr.query(sql, new ColumnListHandler(2));

                System.out.println(object);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    效果:

    //需求:測試MapHandler策略

        //MapHandler:將查詢結果的第一行數據封裝到map集合(key==列名,value==列值)

        @Test

        public void test10(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "select * from user";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                Map<String, Object> map = qr.query(sql, new MapHandler());

                System.out.println(map);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    效果:

     

    //需求:測試MapListHandler策略

        //MapListHandler:將查詢結果的每一行封裝到map集合(key==列名,value==列值),再將map集合存入list集合

        @Test

        public void test11(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "select * from user";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                List<Map<String, Object>> list = qr.query(sql, new MapListHandler());

                System.out.println(list);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    效果:

     

        //需求:測試BeanMapHandler策略

        //BeanMapHandler:將查詢結果的每一行數據,封裝到User對象,再存入map集合中(key==指定的列值,value==User)

        @Test

        public void test12(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "select * from user";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                Object object = qr.query(sql, new BeanMapHandler(User.class,2));

                System.out.println(object);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    效果:

     

    //需求:測試KeyedHandler策略

        //KeyedHandler:將查詢結果的每一行數據,封裝到map1集合(key==列名,value==列值),然後,將map1集合(有多個)存入map2集合(只有一個)

        //map2集合(key==指定的列,value==map1集合)

        @Test

        public void test13(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "select * from user";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                Object object = qr.query(sql, new KeyedHandler());

                System.out.println(object);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

     

    效果:

     

     

     

    //需求:測試ScalarHandler策略

        //ScalarHandler:封裝類似count、avg、max、min、sum。。。。函數的執行結果

        @Test

        public void test14(){

            

            //第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            //第二步:創建sql語句

            String sql = "select count(*) from user";

            //第三步:執行sql語句,params:是sql語句的參數

            //注意,給sql語句設置參數的時候,按照user表中字段的順序

            try {

                Object object = qr.query(sql, new ScalarHandler());

                System.out.println(object);

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    效果:

     

     

    DBUtils總結:

     

     

     

     

     

    練習案例——用戶聯系人管理系統

    需求:

     

    功能列表:

    注冊

    登陸

    查詢所有聯系人

    按條件查詢聯系人

    添加聯系人

    刪除聯系人

    修改聯系人

    分頁展示數據

     

    權限:1)在servelt 中做if判斷

                    2)將權限的數據保存在配置文件中,用戶請求的時候,根據配置文件查看用戶是否具有權限。

                    3)使用數據庫實現權限管理,涉及5張表

     

     

    補充內容(MD5加密分析):

     

    JDK API:

     

    獲取對象的API:

    加密的API:

     

    代碼演示:

    package cn.itcast.utils;

     

    import java.security.MessageDigest;

    import java.security.NoSuchAlgorithmException;

     

    /**

    * @author wjn

    * MD5加密工具類

    */

    public class MD5Utils {

     

        public static String getPwd(String pwd){

            //創建加密對象

            try {

                MessageDigest digest = MessageDigest.getInstance("md5");

                

                //調用加密對象的方法,加密的動作已經完成

                byte[] bs = digest.digest(pwd.getBytes());

                //接下來,我們要對加密後的結果,進行優化,按照mysql的優化思路走

                //mysql的優化思路:

                //第一步:將數據全部轉換成正數

                String hexString = "";

                for (byte b : bs) {

                    //b,它本來是一個byte類型的數據

                    //255,是一個int類型的數據

                    //b與255進行運算之後,會自動類型提升為int類型

                    //b 1001 1100 原來

                    //b 0000 0000 0000 0000 0000 0000 1001 1100

                    int temp = b & 255;

                    //第二步:將所有的數據,轉換成16進制的形式 1F 2B 3c

                    

                    //第三步:解決任意數據,都要輸出一個固定長度的字符串

                    if(temp < 16 && temp >= 0){

                        //如果進入判斷,表示當前數據,不能轉換成兩位的16進制格式

                        //那麼,我們可以,手動補上一個"0"

                        hexString = hexString +"0"+ Integer.toHexString(temp);

                    }else{

                        hexString = hexString + Integer.toHexString(temp);

                    }

                }

                return hexString;

                

            } catch (NoSuchAlgorithmException e) {

                //NoSuchAlgorithmException沒有這個加密的算法

                e.printStackTrace();

                return "";

            }

            

        }

        public static void main(String[] args) {

            String pwd = MD5Utils.getPwd("abc");

            System.out.println(pwd);

            //工具類加密結果: 900150983cd24fb0d6963f7d28e17f72

            //mysql加密結果:900150983cd24fb0d6963f7d28e17f72

        }

    }

     

     

    效果:

     

  • 案例--注冊功能實現

    開展工作:

     

    准備工作:

    1)創建數據庫

     

    2)創建web工程

     

     

    3)導入jar包(mysql驅動包、c3p0jar包、DBUtils包、BeanUtils包)

     

    為什麼要記住jar包?

    Jar包對應的都是技術,使用什麼jar包,使用什麼技術。

    後期,使用maven技術管理項目的jar包,使用pom.xml文件管理jar包

    他在管理的時候,都是通過jar包的名稱去管理。

     

     

    4)c3p0-config.xml配置文件

     

     

     

     

    6)創建與數據庫表對應的javabean

    User類:用戶實體

     

    Contact類:聯系人實體類

     

     

    注冊的功能需求明確:

     

    1)用戶的操作是什麼?

        在頁面上輸入注冊的信息

        提交注冊信息

     

    2)頁面需要哪些東西?

        需要一個表單,讓用戶可以輸入注冊信息

    需要一個提交按鈕,將數據發送到服務器

     

    3)服務器如何處理請求?

     

    Servlet要做什麼?

        獲取用戶請求數據(注冊信息)

    對驗證碼做校驗,不通過,返回注冊頁面,

    通過,將數據封裝到User對象中

     

     

     

    Service要做什麼?

        判斷當前用戶名是否已經存在

        存在,返回一個標記,告訴servlet,用戶名重復    

     

        不存在:

        將用戶輸入的明文密碼進行加密,

    調用dao注冊用戶

     

     

    Dao要做什麼?

     

        對service方法進行支持,注冊用戶到數據庫

     

    4)給用戶什麼樣的響應?

    根據不同的情況,給出不同的響應。

    所有的情況:

    驗證碼錯誤

    用戶名已經存在

    數據庫異常,服務器忙,請稍後再試

     

     

    思考功能的實現基本思路:

     

     

     

     

    老師:頁面可不可以寫表單的驗證,使用javascript技術?

    答:可以,注意頁面的表單驗證,必須前端js驗證和後台java代碼驗證都需要執行。

     

     

     

    頁面展示:

     

    Servlet代碼:

     

    package cn.itcast.web;

     

    import java.io.IOException;

    import java.lang.reflect.InvocationTargetException;

     

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

     

    import org.apache.commons.beanutils.BeanUtils;

     

    import cn.itcast.domain.User;

    import cn.itcast.service.UserService;

    import cn.itcast.service.impl.UserServiceImpl;

     

    public class RegisterServlet extends HttpServlet {

     

        public void doGet(HttpServletRequest request, HttpServletResponse response)

                throws ServletException, IOException {

            //第一步:接收請求

            request.setCharacterEncoding("utf-8");

            

            //第二步:驗證碼校驗

            String checkImg = request.getParameter("checkImg");

            String servletImg = (String)request.getSession().getAttribute("servletImg");

            //提問:servletImg調用equeals方法好,還是checkImg調用equeals好?

            //答:checkImg因為是用戶提交的數據,可能為null,容易發生空指針異常

            if(servletImg.equalsIgnoreCase(checkImg)){

                //驗證通過

                //第三步:封裝數據

                //bean:數據要被封裝到的對象(User)

                //properties :封裝了請求參數的map集合

                User u = new User();

                try {

                    BeanUtils.populate(u, request.getParameterMap());

                } catch (Exception e) {

                    e.printStackTrace();

                }

                //單獨封裝hobby

                String[] values = request.getParameterValues("hobby");

                String hobby = "";

                for (String string : values) {

                    hobby = hobby + ","+string;

                }

                hobby = hobby.substring(1);

                u.setHobby(hobby);

                //封裝數據完成

                //第四步:調用service方法

                //提問:老師,我自己寫的項目沒有使用接口,直接都是類之間調用,這樣可以嗎?

                //答:不可以,如果是類之間調用,那麼你後期,要使用新的類替換原來的內容,那麼你需要修改servlet service dao

                //如果使用接口開發,只需要替換實現類即可,操作簡單。

                

                UserService userService = new UserServiceImpl();

                int info = userService.register(u);

                //第五步:根據不同返回值,不同處理

                if(info == 1){

                    response.sendRedirect(request.getContextPath()+"/login.jsp");

                    return;

                }else if(info == -1){

                    request.setAttribute("msg", "用戶名重復");

                    request.getRequestDispatcher("/register.jsp").forward(request, response);

                    return;

                }else{

                    request.setAttribute("msg", "服務器已經很努力了,請在等我一下下");

                    request.getRequestDispatcher("/register.jsp").forward(request, response);

                    return;

                }

                

            }else{

                //驗證不通過

                request.setAttribute("msg", "驗證碼錯誤");

                request.getRequestDispatcher("/register.jsp").forward(request, response);

                return;

            }

        }

     

        public void doPost(HttpServletRequest request, HttpServletResponse response)

                throws ServletException, IOException {

            doGet(request, response);

        }

     

    }

     

     

     

    Service代碼:

     

    接口:

    package cn.itcast.service;

     

    import cn.itcast.domain.User;

     

    public interface UserService {

     

        /**

         * 注冊的方法

         * @param u

         * @return

         */

        int register(User u);

     

    }

     

    實現類:

     

    package cn.itcast.service.impl;

     

    import cn.itcast.dao.UserDao;

    import cn.itcast.dao.impl.UserDaoImpl;

    import cn.itcast.domain.User;

    import cn.itcast.service.UserService;

    import cn.itcast.utils.MD5Utils;

     

    public class UserServiceImpl implements UserService {

     

        private UserDao userDao = new UserDaoImpl();

        @Override

        public int register(User u) {

            // TODO :標記當前的代碼寫到這裡,還沒有完成,請繼續完成

            // 查詢用戶是否存在

            User user = userDao.findUserByName(u.getName());

            if(user != null){

                return -1;

            }else{

                // 不存在,先將用戶的密碼進行加密,然後,注冊用戶

                String pwd = MD5Utils.getPwd(u.getPassword());

                u.setPassword(pwd);

                

                return userDao.register(u);

            }

        

        }

     

    }

     

     

    Dao代碼:

     

    接口:

    package cn.itcast.dao;

     

    import cn.itcast.domain.User;

     

    public interface UserDao {

     

        /**

         * 根據用戶名查詢數據的方法

         * @param name

         * @return

         */

        User findUserByName(String name);

     

        /**

         * 注冊的方法

         * @param u

         * @return

         */

        int register(User u);

     

    }

     

     

    實現類:

    package cn.itcast.dao.impl;

     

    import java.sql.SQLException;

    import java.util.ArrayList;

    import java.util.List;

     

    import org.apache.commons.dbutils.QueryRunner;

    import org.apache.commons.dbutils.handlers.BeanHandler;

     

    import cn.itcast.dao.UserDao;

    import cn.itcast.domain.User;

    import cn.itcast.utils.JDBCUtils;

     

    public class UserDaoImpl implements UserDao {

     

        @Override

        public User findUserByName(String name) {

     

            // 第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            // ctrl+shift+f 格式化代碼

            // 第二步:創建sql語句

            String sql = "select * from user where name = ?";

            try {

                User user = qr.query(sql, new BeanHandler<User>(User.class), name);

                return user;

            } catch (SQLException e) {

                e.printStackTrace();

                throw new RuntimeException("獲取用戶數據失敗");

            }

            //throw throws:方法聲明 try catch finally 處理異常關鍵字

        }

     

        @Override

        public int register(User u) {

            // 第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            // 第二步:創建sql語句

            String sql = "insert into user values(null,?,?,?,?,?,?,?,?,?)";

            //創建一個集合List,用來存放sql語句參數

            List<Object> list = new ArrayList<Object>();

            list.add(u.getName());

            list.add(u.getPassword());

            list.add(u.getAge());

            list.add(u.getSex());

            list.add(u.getEmail());

            list.add(u.getHobby());

            list.add(u.getAddress());

            list.add(u.getDescription());

            list.add(u.getBirthday());

            

            try {

                return qr.update(sql, list.toArray());

            } catch (SQLException e) {

                e.printStackTrace();

                return -2;

            }

        }

     

    }

     

     

     

  • 案例--登錄功能實現(頁面顯示用戶信息)

    畫圖分析:

     

    Servlet代碼:

     

    package cn.itcast.web;

     

    import java.io.IOException;

     

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

     

    import cn.itcast.domain.User;

    import cn.itcast.service.UserService;

    import cn.itcast.service.impl.UserServiceImpl;

     

    public class LoginServlet extends HttpServlet {

     

        public void doGet(HttpServletRequest request, HttpServletResponse response)

                throws ServletException, IOException {

            request.setCharacterEncoding("utf-8");

            //接收請求的參數

            String username = request.getParameter("username");

            String pwd = request.getParameter("pwd");

            

            //調用service方法

            UserService userService = new UserServiceImpl();

            User loginUser = userService.login(username,pwd);

            if(loginUser == null){

                request.setAttribute("msg", "用戶名或者密碼錯誤");

                request.getRequestDispatcher("/login.jsp").forward(request, response);

                return;

            }else{

                //獲取方法的返回值,將數據保存到session,跳轉歡迎頁面

                request.getSession().setAttribute("loginUser", loginUser);

                response.sendRedirect(request.getContextPath()+"/welcome.jsp");

                return;

            }

            

        }

     

        public void doPost(HttpServletRequest request, HttpServletResponse response)

                throws ServletException, IOException {

            doGet(request, response);

        }

     

    }

     

     

     

     

    Service代碼:

    接口:

     

        /**

         * 用戶登錄的方法

         * @param username

         * @param pwd

         * @return

         */

        User login(String username, String pwd);

     

     

     

    實現類:

    public User login(String username, String pwd) {

            //加密密碼

            String password = MD5Utils.getPwd(pwd);

            //登陸用戶

            return userDao.login(username,password);

        }

     

     

    DAO代碼

     

     

    接口:

    /**

         * 用戶登錄的方法

         * @param username

         * @param password

         * @return

         */

        User login(String username, String password);

    實現類:

    public User login(String username, String password) {

            // 第一步:創建queryRunner對象,用來操作sql語句

            QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

            // ctrl+shift+f 格式化代碼

            // 第二步:創建sql語句

            String sql = "select * from user where name = ? and password = ?";

            try {

                return qr.query(sql, new BeanHandler<User>(User.class), username,password);

            } catch (SQLException e) {

                e.printStackTrace();

                throw new RuntimeException("登陸用戶失敗");

            }

        }

     

    補充(記住用戶名)——希望大家可以課余時間完成:

     

     

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved