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

大家在网上查找资料看到最多的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中去开始编码了,下面引入接口的概念,从设计层面上去讲下如何实现登录功能,即面向接口编程。

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

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

    接着前面的登录模块的进化史,带大家回顾java学习历程(一) 继续往下面讲 前面我们去实现登录功能,都是想着要完成这个功能,直接在处理实际业务的类中去开始写具体的代码一步步实现,也就是面向过程的编程. ...

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

    学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要 ...

  3. Java学习历程记录(一)

    一.类与对象 1.创建类 创建一个学生类.并且创造成员变量和方法 public class student{ String name: int age: public void study(参数列表) ...

  4. JAVA学习,是一条漫长的道路

    我在Java 1.0正式问世前就开始学习Java,这么多年过去了,到现在我的Java学习历程还没有停过.我阅读原文书,研究原始码,撰写程序,自认为走得扎实,不奢望一步登天.像我这样老式的学习方式,显然 ...

  5. Spring py登陆模块(包含 记录登陆时间,记录ip,增加积分)

    嘛基于最近的复习准备写个关于spring登陆模块的小程序 虽然小但是五脏俱全呐 话不多说让我来介绍一下今天的登陆程序. 这些是 基于Spring JDBC 的持久层实现 基于Spring 声明事物的业 ...

  6. ASP.NET -- WebForm -- Cookie的使用 应用程序权限设计 权限设计文章汇总 asp.net后台管理系统-登陆模块-是否自动登陆 C# 读写文件摘要

    ASP.NET -- WebForm -- Cookie的使用 ASP.NET -- WebForm --  Cookie的使用 Cookie是存在浏览器内存或磁盘上. 1. Test3.aspx文件 ...

  7. Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录)

    Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录) 作者:王可利(Star·星星) 效果图: 代码如下: class Star8 { public static void m ...

  8. Django之第三方登陆模块

    Django之第三方登陆模块 前期准备 安装 django-allauth pip install django-allauth 注意,django-allauth 需要在 Django1.10以上版 ...

  9. 两道面试题,带你解析Java类加载机制

    文章首发于[博客园-陈树义],点击跳转到原文<两道面试题,带你解析Java类加载机制> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Gr ...

随机推荐

  1. Java中进制的转换函数

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  2. MongoDB 数据库备份与恢复

    1.MongoDB数据库备份     1.语法:         mongodump -h dbhost -d dbname -o dbdirectory         参数说明:         ...

  3. Python的类(class)

    python 3.6 官方文档  https://docs.python.org/3.6/index.html python 3.6 的类 https://docs.python.org/3.6/tu ...

  4. 数据库、ArcCatalog空间数据源正常访问,数据库设置没问题时,ArcEngine连接SDE时报"ORA-12560: TNS: 协议适配器错误"的解决办法;ArcEngine连接SDE总结

    碰到的问题描述: 通过C# 基于ArcEngine写SDE直连的时候测试项目连接属性设置为如下: tPropSet.SetProperty("User", "GISDAT ...

  5. spring boot项目如何测试,如何部署

    有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...

  6. CRL快速开发框架升级到4.52,谈谈开发过程中的优化

    CRL4.5版本已经稳定使用于目前的几个中型项目中,在实际使用中,也发现了不少问题,这些问题都在4.52中提交 CRL具体功能和使用请浏览 CRL快速开发框架系列教程 由于现在项目是一套业务系统,查询 ...

  7. MVC+EF 入门教程(二)

    一.前沿 为了使以后项目分开,所以我会添加3个类库.用于存储 实体.数据库迁移.服务.这种思路是源于我使用的一个框架 ABP.有兴趣的您,可以去研究和使用这个框架. 二.修改本地连接 在项目中,找到  ...

  8. docker学习笔记(一)

    docker是一种容器技术,现在火的一塌糊涂,最近公司打算用docker统一开发.测试.预上线.上线环境,所以花了时间研究一下. docker是一种容器技术,之前是基于LXC容器,现在已经改成基于li ...

  9. ABP-Module

    [TOC] 什么是Module? Module就是模块化的设计思想.开发人员可以将自定义的功能以模块的形式集成到项目中.具体的功能也可以设计成一个单独的模块 AbpModule AbpModule是所 ...

  10. Spring MVC框架下的第一个Hello World程序

    本程序是一个maven程序,使用maven方便管理jar包和程序,简化了操作步骤.本程序的目的是通过一个简单的程序,了解Spring MVC框架的基本工作流程,由简入繁的学习Spring MVC框架, ...