登陆模块的进化史,带大家回顾java学习历程(一)

一直在想着写点特别点的东西,让有兴趣学编程的人确实能学到点干货,今天就来随意写写。

大家在网上查找资料看到最多的demo估计就是登陆功能的演示了,为何大家偏爱拿登陆来做demo呢?因为行业应用类程序的核心就是为了让用户能与数据进行交互,对于一个高级DBA来说的话,他与数据的交互可以直接与数据库进行打交道,而对于小白用户来说的话就需要非常友好的UI与数据进行交互,那么就需要各种编程语言工具来实现这个过程了。而我们开发一个应用类软件,主要要对需求业务充分了解之后才能进行开发,比如开发一个财务类软件,如果你不懂财务,谈何开发。而登陆功能是大家接触最多,也不用解释业务的功能,因此作为demo讲解自然是最合适的。下面就以Java的学习进行讲解登陆demo,从最开始的helloword模式一直演化到SSM框架模式,演示过程中穿插讲解各个学习阶段涉及到的基础知识点。

这里编程工具采用eclipse,首先建立一个普通的java工程,写我们的第一个程序

package com.xdw;

/**
 * @author xiadewang
 *2018年1月14日
 */
public class LoginTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("欢迎您登陆");
    }
}

很简单,是不是就是helloword?  main方法是程序的入口方法。

好下面对上面的程序一步步扩展,想到登陆就是对用户名和密码进行判断,那么修改代码如下:

    public static void main(String[] args) {
        // TODO Auto-generated method stub
//        System.out.println("欢迎您登陆");
        String username = "xdw",password="123456";
        if(username=="xdw" && password=="123456") {
            System.out.println("xdw用户登录成功");
        }else {
            System.out.println("登录失败");
        }
    }

这里就引入到了java基础知识的变量的声明、定义与赋值,变量类型,注释,比较运算符,if..else逻辑语句。这些基础就不再啰嗦了

这样改写之后,发现只对用户xdw进行了登陆的判断,如果每次更换一个用户名或者密码,就都要改动上面整个的代码,那么这个时候就该函数(Java里面又叫方法)出场了。

将用户名和密码作为方法的形参,将判断结果作为返回值。代码如下

package com.xdw;

/**
 * @author xiadewang
 *2018年1月13日
 */
public class LoginTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
//        System.out.println("欢迎您登陆");
/*        String username = "xdw",password="123456";
        if(username=="xdw" && password=="123456") {
            System.out.println("xdw用户登录成功");
        }else {
            System.out.println("登录失败");
        }*/

        LoginTest login=new LoginTest();
        if(login.checkLogin("xdw","123")) {
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }
        if(login.checkLogin("xxx","1234")) {
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }
    }

    public  boolean checkLogin(String username,String password) {
        if(username=="xdw" && password=="123") {
            return true;
        } else {
            return false;
        }

    }

}

上面把最开始main函数里面的逻辑判断封装到了checkLogin函数之中,由于这里没有UI界面,我们就把print打印看做是实际业务处理,那面checkLogin方法就是做的纯粹逻辑处理,

具体的业务我们还是放在main方法中做,那么就将checkLogin方法的返回值设置为boolean,而不是void。此时有点逻辑与业务分离的味道了。。

顺便啰嗦下方法如何定义,首先是修饰符(public或者private和protected,这个知识点主要就是了解它们的作用域,还不清楚的同学赶紧去复习下),然后是返回类型(如果是void,则在函数体中不需要return,其他则需要retrun。),接下来是函数名称(命名规范一般是首字母小写,驼峰命名),下面就是形参(命名规范也是首字母小写,驼峰命名)。

那么此时方法定义好了,我们该如何在main中调用它呢?首先main方法是static的,而我们现在定义的方法是非static的,在同一个类中,static的方法里面是不能直接调用该类中的其他非static的方法的,需要先new一个该类的对象出来,然后通过该对象进行方法的调用,如代码中所示。还有一个办法就是将checkLogin方法改成staic的方法,则在main中就不用new了,直接调用该方法。看下面的代码

package com.xdw;

/**
 * @author xiadewang
 *2018年1月13日
 */
public class LoginTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
//        System.out.println("欢迎您登陆");
/*        String username = "xdw",password="123456";
        if(username=="xdw" && password=="123456") {
            System.out.println("xdw用户登录成功");
        }else {
            System.out.println("登录失败");
        }*/
        if(checkLogin()) {
            System.out.println("游客登录");
        }
        LoginTest login=new LoginTest();
        if(login.checkLogin("xdw","123")) {
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }
        if(login.checkLogin("xxx","1234")) {
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }
    }

    public  boolean checkLogin(String username,String password) {
        if(username=="xdw" && password=="123") {
            return true;
        } else {
            return false;
        }

    }

    public static boolean checkLogin() {
        return true;
    }
}

大家可以看到在main中直接调用了checkLogin(),这个函数没有传递用户名和密码,就相当于游客模式登陆,同时这里又引入了一个知识点重载。什么是重载?重载的两个要素就是函数名相同,参数不同(参数不同是指的参数个数不一样,或者参数的类型不一样,不是说的参数名称不同,形参的名称是可以随意命名的)。重载的作用是什么呢?完全可以给上面的checkLogin方法重新取个别的名字啊。是滴,取别的名字一点问题也没有,重载的主要作用是增加程序的可读性,我们在阅读API文档的时候好多时候通过函数的名称就大概知道它是干什么用的。我们在调用的时候,就不需要记那么多的方法名称,而是知道了方法的功能就可以直接的给他传递不同的参数,编译器会明确的知道我们调用了哪一个方法。

写到这里,我们所有的用户数据都是自己在代码中写死的虚构出来的数据,实际业务中,用户数据肯定不可能写在代码中,那么这个时候就轮到数据库出场了。实际开发中,用户数据都是存储在数据库之中,此时判断用户登录的简单逻辑如下,我们传递用户名和密码参数给checkLogin方法,然后该方法中去查询数据库,看该用户名和密码是否匹配,如果匹配则代表登录成功,反之失败。java中如何连接数据库进行操作呢?这时就需要JDBC了,这里以mysql为例,简单讲解下jdbc的操作流程。

我们在之前的代码中加入下面的一个方法checkLoginByJdbc,此时就不能再用checkLogin这个名字了,因为形参相同。

package com.xdw;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author xiadewang
 *2018年1月13日
 */
public class LoginTest {
    private Connection connection=null;
    private ResultSet resultSet=null;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
//        System.out.println("欢迎您登陆");
/*        String username = "xdw",password="123456";
        if(username=="xdw" && password=="123456") {
            System.out.println("xdw用户登录成功");
        }else {
            System.out.println("登录失败");
        }*/
        if(checkLogin()) {
            System.out.println("游客登录");
        }
        LoginTest login=new LoginTest();
        if(login.checkLogin("xdw","123")) {
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }
        if(login.checkLogin("xxx","1234")) {
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }

        if(login.checkLoginByJdbc("xdw","123456")) {
            System.out.println("xdw通过jdbc登录成功");
        }else {
            System.out.println("登录失败");
        }
    }

    public  boolean checkLogin(String username,String password) {
        if(username=="xdw" && password=="123") {
            return true;
        } else {
            return false;
        }

    }

    public static boolean checkLogin() {
        return true;
    }

    public boolean checkLoginByJdbc(String username,String password) {
        try {
            //通过反射获取数据库连接驱动
            Class.forName("com.mysql.jdbc.Driver");
            try {
                //获取数据库连接对象
                connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1/jsplogintest","root","root");
                //构建sql语句,?代表需要绑定的参数
                String sql="select * from user where username=? and password=?";
                //获取PreparedStatement对象
                PreparedStatement preparedStatement=connection.prepareStatement(sql);
                //绑定参数
                preparedStatement.setString(1, username);
                preparedStatement.setString(2, password);
                //执行sql语句,这里是查询语句,所以调用executeQuery返回结果集
                resultSet=preparedStatement.executeQuery();
                //获取结果集之后数据库的操作就结束了,后面是要根据结果集来处理我们的业务逻辑
                if(resultSet.next()) {
                    //结果集不为空,则可以表示用户存在,即登陆成功
                    resultSet.close();
                    connection.close();
                    return true;
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return false;

    }
}

数据表结构如下

jdbc的操作流程上面注释也写的比较清楚了,以后就是照葫芦画瓢了,jdbc操作很简单,重要的技能还是要对sql玩的牛才行。

这里代码的复用性太差,没写一个方法的时候,都去写一堆的jdbc的连接与关闭操作显然不现实,于是我们需要把它们封装到一个工具类当中,如下面的DBHelper

package com.xdw;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;  

/**
 * @author xiadewang
 *2018年1月13日
 */
public class DBHelper {
    public static final String url = "jdbc:mysql://127.0.0.1/jsplogintest";
    public static final String name = "com.mysql.jdbc.Driver";
    public static final String user = "root";
    public static final String password = "root";  

    public Connection conn = null;
    public PreparedStatement pst = null;  

    public DBHelper(String sql) {
        try {
            Class.forName(name);//指定连接类型
            conn = DriverManager.getConnection(url, user, password);//获取连接
            pst = conn.prepareStatement(sql);//准备执行语句
        } catch (Exception e) {
            e.printStackTrace();
        }
    }  

    public void close() {
        try {
            this.conn.close();
            this.pst.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}  

然后改写checkLoginByJdbc方法,如下

public boolean checkLoginByJdbc(String username, String password) {
        try {
            String sql = "select * from user where username= ? and password= ?";// SQL语句
            DBHelper db1 = new DBHelper(sql);// 创建DBHelper对象
            db1.pst.setString(1, username);
            db1.pst.setString(2, password);
            ResultSet 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;

    }

第一阶段先就到这里吧,至此我们都是用面向过程的方法去实现该功能的,直接想实现登陆功能,就在处理业务的主入口main中去开始编码了,下面引入接口的概念,从设计层面上去讲下如何实现登陆功能,即面向接口编程。

原文地址:https://www.cnblogs.com/xiadewang/p/8287345.html

时间: 2024-10-09 17:02:06

登陆模块的进化史,带大家回顾java学习历程(一)的相关文章

登录模块的进化史,带大家回顾java学习历程(二)

接着前面的登录模块的进化史,带大家回顾java学习历程(一) 继续往下面讲 前面我们去实现登录功能,都是想着要完成这个功能,直接在处理实际业务的类中去开始写具体的代码一步步实现,也就是面向过程的编程. 那么现在我们站在设计的角度上去实现该如何做呢?实际上在项目开发的时候,需求规划和数据库设计好之后,我们开始写代码,往往只用写一些接口出来,接口里面只有一些各个业务对应的空方法,没有具体的实现,在架构师进行接口设计的时候,就已经想好了该功能之后通过实现与调用这个接口肯定是可以实现的,等各个功能相关的

java学习历程,一年三年五年计划

学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍.这一部分的内容,同样适用于一些希望转行到Java的同学. 在大家看之前,我要先声明两点.1.由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照搬.2.下

这是一个Java学习历程记录(无知识,有心情)

♥ Java的学习我并不打算按照任何书籍或资料的顺序进行,由于之前有过基础的学习,所以我计划根据实践编程或其他学习过程中遇到的问题进行分散式知识点的学习方法. ——周周(2020.4.6) ♥ 待续! 原文地址:https://www.cnblogs.com/ZHOUsya/p/12641454.html

java的学习历程(二)

接着前面的登录模块的进化史,带大家回顾java学习历程(一) 继续往下面讲 前面我们去实现登录功能,都是想着要完成这个功能,直接在处理实际业务的类中去开始写具体的代码一步步实现,也就是面向过程的编程. 那么现在我们站在设计的角度上去实现该如何做呢?实际上在项目开发的时候,需求规划和数据库设计好之后,我们开始写代码,往往只用写一些接口出来,接口里面只有一些各个业务对应的空方法,没有具体的实现,在架构师进行接口设计的时候,就已经想好了该功能之后通过实现与调用这个接口肯定是可以实现的,等各个功能相关的

Java 学习计划

1. 双文博客     为提高个人英语水平和学习积极性,在此学习Java的时候写下自己的个人学习博文记录自己的学习过程.采用汉语和英文两种方式进行写作. 2. 解释     英文版和中文版并不是绝对统一. 3. 后续计划     自己坚持写部分后,会积极学习一种规范的格式,开源给大家,让我们一起协作,讲述自己的Java学习历程.

我的Java学习工具使用历程

Java基础:EditPlus(现用).notepad++(现用)MySQL:MySQL5.6.MySQL5.5(现用).Navicat for MySQL(现用).SQLYog(现用)Oracle:Oracle11gJDK:1.8(现用).1.7Tomcat:7.0.8.0(都用)WEB前端:HBuilder(现用).Submit Text 3.Aptana Studio 3Eclipse:Eclipse JavaSE.Eclipse JavaEE(Mars.oxygen-->现用)MyEcl

【小菜鸟必备】LR11自带程序-登陆模块-脚本录制

attention1:此文章适合像我这样的0基础菜鸟看哦,当然也非常欢迎高手提出错误或不足的地方!互相学习,多多指教!那么,我就进入正题了 attention2:[学会思考]要录制登陆模块的脚本,我们需要做什么准备工作呢?这个问题留给读者哦,因为超简单的! step1:启动web服务,打开Vuser,创建新的脚本进入下面的界面: LR11录制网站默认为此协议. step2:输入要录制的网站的URL地址,选择恰当的action. 这里的脚本我们放在“Action”中,便于后续进行脚本的参数化. 输

JAAS 自定义登陆模块

JAAS 登陆认证涉及的接口\类: LoginContext:应用程序通过调用该类的login方法来登陆认证. LoginModule:抽象的登陆接口.用户需要实现接口,来定义自己的登陆模块. Subject:一个需要认证的实体,如一个人,一段程序. Principal:认证实体标志,如编号,角色等. 自定义登录认证类: package root.tgview; import java.io.IOException; import java.util.Map; import javax.secu

android 通过post发送数据 完成客户端登陆模块

1.get是从服务器上获取数据,post是向服务器传送数据.2.get是把参数数据队列加到提交表单的 ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址.用户看不到这个过程.3.对于get方式,服务器端用 Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据.4.get