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

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

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

packagecom.xdw;/***@authorxiadewang

*2018年1月14日*/

public classLoginTest {/***@paramargs*/

public static voidmain(String[] args) {//TODO Auto-generated method stub

System.out.println("欢迎您登录");

}

}

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

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

public static voidmain(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里面又叫方法)出场了。

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

packagecom.xdw;/***@authorxiadewang

*2018年1月13日*/

public classLoginTest {public static voidmain(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=newLoginTest();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 booleancheckLogin(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了,直接调用该方法。看下面的代码

packagecom.xdw;/***@authorxiadewang

*2018年1月13日*/

public classLoginTest {public static voidmain(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=newLoginTest();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 booleancheckLogin(String username,String password) {if(username=="xdw" && password=="123") {return true;

}else{return false;

}

}public static booleancheckLogin() {return true;

}

}

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

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

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

packagecom.xdw;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;/***@authorxiadewang

*2018年1月13日*/

public classLoginTest {private Connection connection=null;private ResultSet resultSet=null;public static voidmain(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=newLoginTest();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 booleancheckLogin(String username,String password) {if(username=="xdw" && password=="123") {return true;

}else{return false;

}

}public static booleancheckLogin() {return true;

}public booleancheckLoginByJdbc(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

packagecom.xdw;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;/***@authorxiadewang

*2018年1月13日*/

public classDBHelper {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;publicDBHelper(String sql) {try{

Class.forName(name);//指定连接类型

conn = DriverManager.getConnection(url, user, password);//获取连接

pst = conn.prepareStatement(sql);//准备执行语句

} catch(Exception e) {

e.printStackTrace();

}

}public voidclose() {try{this.conn.close();this.pst.close();

}catch(SQLException e) {

e.printStackTrace();

}

}

}

然后改写checkLoginByJdbc方法,如下

public booleancheckLoginByJdbc(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中去开始编码了,下面引入接口的概念,从设计层面上去讲下如何实现登录功能,即面向接口编程。

java package com.xq.algorithm,登录模块的进化史,带大家回顾java学习历程(一)相关推荐

  1. Java学生信息管理系统——管理员登录模块(简单易上手)

    前言 这一篇是用来记录我编写学生信息管理系统时实现登录操作的过程,这是学生信息管理系统的第一个模块,之后我还会陆续将其它模块分享出来. 其它章节 ------------------------> ...

  2. Java工程师修炼之路(从小白到BAT的两年学习历程)...

    ​ 微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里研发工程师,于2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer 个人擅长领域 :自学编程.技术校园招聘.软 ...

  3. Java工程师修炼之路(从小白到BAT的两年学习历程)

    前言 在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾讯,今日头条,网易,华为等. 一路走来也遇到很多困难,也 ...

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

    前面我们去实现登录功能,都是想着要完成这个功能,直接在处理实际业务的类中去开始写具体的代码一步步实现,也就是面向过程的编程. 那么现在我们站在设计的角度上去实现该如何做呢?实际上在项目开发的时候,需求 ...

  5. 【转载保存】Java丨jsoup网络爬虫登录得到cookie并带上cookie访问

    优秀文章:https://blog.csdn.net/wisdom_maxl/article/details/65631825 jsoup使用cookie: Set<Cookie> coo ...

  6. java while语句打印三角形_java基础之五小节带你走进java流程控制—多重循环

    四.多重循环 在一个循环语句内部再嵌套一个或多个循环,称为多重循环/嵌套循环.while.do-while与for循环可以任意嵌套,可以嵌套任意多层.一般工作中多见的就是两层. 4.1 多重循环 打印 ...

  7. 银行家算法回顾[JAVA实现]

    为什么80%的码农都做不了架构师?>>>    分析了一下银行家算法,基于银行家算法做了一个小程序. 银行家算法主要用于操作系统进程管理程序中,用于防止死锁. 接下来这段代码将模拟这 ...

  8. Java课程设计大作业学生管理系统的设计与开发(Java+Mysql)

    文章目录 项目目标 项目截图展示 项目Java源程序 项目数据库文件信息 项目结构图设计 系统功能结构图: 软件架构设计 项目目标     这篇文章是Java语言得课程设计大作业记录.     项目由 ...

  9. 咸鱼带你学Java—类的结构之一:属性(field)

    目录 一.概念 二.语法格式 三.属性的初始值 四.成员变量(属性)与局部变量的异同 1.对变量按照声明位置分类 2.两者异同 一.概念 对应类中的成员变量 二.语法格式 修饰符 数据类型 属性名 = ...

最新文章

  1. Silverlight+WCF 新手实例 象棋 该谁下棋-B下A停(三十)
  2. vue 多层双层全选_vue多级复杂列表展开/折叠及全选/分组全选实现
  3. awk print 的用法
  4. 寻找不合群的数据(异常值)
  5. 基于SVD矩阵分解的用户商品推荐(python实现)
  6. 1024 科学计数法 (20 分)(c语言)
  7. 诺依曼体系结构、哈佛体系结构与改进型哈佛结构之间的区别
  8. “3D几何与视觉技术”全球在线研讨会第五期~隐式3D形状表示学习
  9. RecyclerView 小记
  10. 线性表9 - 数据结构和算法14
  11. 【java笔记】大数操作(BigIntegerBigDecimal)
  12. php goto 代码还原_【表哥有话说 第58期】代码审计思路小结
  13. 运动目标跟踪(十三)--SRDCF/DeepSRDCF
  14. 防火墙 虚拟服务器,防火墙应用指南(二)——虚拟服务器的搭建-20210526012702.pdf-原创力文档...
  15. 什么是Ajax? (转载于疯狂客的BLOG)
  16. spring boot 2使用Mybatis多表关联查询
  17. 开源截图录屏软件Captura
  18. 解决GLIDE4.0和圆角裁剪CENTERCROP冲突
  19. Iframe的allow属性生效时机
  20. C# WinForm 使用SMS接口发送手机验证码+图形验证码+IP限制

热门文章

  1. matlab中function dy,了解matlabFunction
  2. 非接触式IC卡(M1卡)性能简介
  3. 【工具TIPS】如何设置Excel表格的页码
  4. StramApi常用操作
  5. 【LeetCode-SQL】615. 平均工资:部门与公司比较
  6. 分享从零开始学习网络设备配置--2.4 利用三层交换机实现部门间网络互访
  7. KM算法的一些其他用处
  8. 今日推荐:【包你说】红包怎么玩,由你说了算!
  9. 企业邮箱如何申请注册,邮箱申请如何免费注册?
  10. makefile出现错误却不停止,却继续运行