[学生信息管理系统第三篇]具体业务功能实现--登录及代码解说
大家好!在第一篇里已经提到该迷你系统的四个业务功能:A.登录;B.查询;C.更新;D.删除,这里先讲第一个业务功能--登录.
首先对登录业务进行分析.教员可通过用户名跟密码登陆系统,具体业务流程:教员在登录界面输入用户名跟密码->调用客户业务类的登录方法,向服务发送请求->服务器接收用户发送的登录请求,调用服务器的登录服务,返回结果->服务器向客户端发送响应->客户端接收服务器的响应并进行处理.
我们已经明确地知道要实现登录要做些什么:
A.创建服务器端ServerSocket,处理客户端登录请求,返回处理结果.
A.1 在第二篇中,介绍过ServerContextListener类主要用于创建服务端的ServerSocket,接收客户端的请求,加载服务器提供的服务.所以,在接下来的ServerContextListener.java文件中,我们首先要完成服务器端的初始化工作,代码如下
package com.yping.server;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.List;import com.yping.entity.Student;import com.yping.entity.Teacher;import com.yping.util.Datas;import com.yping.util.SysConstants;import com.yping.util.Tools;public class ServerContextListener extends Thread {public static void main(String[] args) {//启动服务线程new ServerContextListener().start();}public void run(){//创建服务器Socket对象ServerSocket serverSocket=null;//要接收的客户端Socket对象 Socket clientIncoming=null; //创建服务端和客户端两个socket间用于数据通信的输入输出流,因为采用对象序列化,所以用ObjectInputStream //和ObjectOutputStreamObjectInputStream objInputStream=null;ObjectOutputStream objOutputStream=null;//实例化try{ serverSocket=new ServerSocket(Integer.parseInt(Tools.getValue(SysConstants.SYS_LISTENERPORT)));//处理客户端发送的请求方法//while循环使服务器始终处于监听状态while(true){clientIncoming=serverSocket.accept();objInputStream=new ObjectInputStream(clientIncoming.getInputStream());objOutputStream=new ObjectOutputStream(clientIncoming.getOutputStream());} }catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try{ objOutputStream.close(); objInputStream.close(); clientIncoming.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }} //创建服务器ServerSocket对象ServerSocket serverSocket=null;//因为实例化ServerSocket对象可能会抛出异常,所以放在try块里serverSocket=new ServerSocket(Integer.parseInt(Tools.getValue(SysConstants.SYS_LISTENERPORT)));//要接收的客户端Socket对象Socket clientIncoming=null;
package com.yping.util;import java.io.IOException;import java.util.Properties;public class Tools { private static Properties p=new Properties(); static{ try{ p.load(Tools.class.getClassLoader().getResourceAsStream(SysConstants.SYS_PROPERTYNAME)); }catch(IOException e){ e.printStackTrace(); } } public static String getValue(String key) { return p.getProperty(key); }} package com.yping.util;public class SysConstants {public static final String SYS_PROPERTYNAME="sys.properties";public static final String SYS_LISTENERPORT="PORT";public static final String SYS_HOSTNAME="HOST";public static final String SYS_SUCCESS="SUCCESS";public static final String SYS_ERROR="ERROR";public static final String SYS_LOGIN="LOGIN";public static final String SYS_FIND="FIND";public static final String SYS_UPDATE="UPDATE";public static final String SYS_DELETE="DELETE";}while(true){clientIncoming=serverSocket.accept();}objInputStream=new ObjectInputStream(clientIncoming.getInputStream());objOutputStream=new ObjectOutputStream(clientIncoming.getOutputStream());
if(datas.getFlag().equals(SysConstants.SYS_LOGIN)){ System.out.println("收到客户端的Login Request");}package com.yping.util;import java.io.Serializable;import java.util.List;import com.yping.entity.Student;import com.yping.entity.Teacher;public class Datas implements Serializable {public void setFlag(String flag) {this.flag = flag;}public String getFlag() {return flag;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}public Teacher getTeacher() {return teacher;}public void setStudent(Student student) {this.student = student;}public Student getStudent() {return student;}public void setStudentList(List<Student> studentList) {this.studentList = studentList;}public List<Student> getStudentList() {return studentList;}private String flag;//传递的标识private Teacher teacher;//教员对象private Student student;//学员对象private List<Student> studentList;//学员集合}//登录服务if(datas.getFlag().equals(SysConstants.SYS_LOGIN)){System.out.println("收到客户端的Login Request");String userName=datas.getTeacher().getUserName();String passWord=datas.getTeacher().getPassWord();//调用业务方法Teacher teacher=serverService.doLogin(userName, passWord);if(teacher==null){ datas.setFlag(SysConstants.SYS_ERROR);}else{ System.out.println("客户端的登录验证成功"); datas.setFlag(SysConstants.SYS_SUCCESS); datas.setTeacher(teacher);}}else if(datas.getFlag().equals(SysConstants.SYS_FIND)){//查询学员信息System.out.println("收到客户端的Query Request");}package com.yping.server;import com.yping.entity.Teacher;import com.yping.entity.Student;import java.util.*;public class ServerService {public static void main(String[] args) {// TODO Auto-generated method stub}private static Teacher teacher=null; //教员对象private static List<Student> studentList=null; //学员集合static{//初始化教员对象和学员集合teacher=new Teacher();teacher.setId(1);teacher.setUserName("admin");teacher.setPassWord("admin");teacher.setNickName("yping061");studentList=new ArrayList<Student>();studentList.add(new Student(1,"卡斯柯",1,22,1,"麻麻地"));studentList.add(new Student(2,"北羊",1,25,0,"我勒了个去的"));studentList.add(new Student(3,"通号院",1,25,1,"不错不错,沟通到位"));studentList.add(new Student(4,"铁科",2,23,1,"稳定"));studentList.add(new Student(5,"信达环宇",2,23,1,"防火墙厂家"));}public Teacher doLogin(String userName,String passWord){ //服务器端的登录方法 if(userName.equals(teacher.getUserName())&& passWord.equals(teacher.getPassWord())) return teacher; elsereturn null;}}objOutputStream.writeObject(datas);objOutputStream.flush();clientIncoming.shutdownOutput();System.out.println("向客户端返回请求数据成功");package com.yping.client;import java.util.*;import com.yping.entity.Student;import com.yping.entity.Teacher;import com.yping.util.Datas;import com.yping.util.SysConstants;public class Client {public static void main(String[] args) { Client.createLoginView();} /** * 登录视图 */ public static void createLoginView(){ System.out.println("**********Student Information Manager System ************"); System.out.println("1.Login \n2.Exit"); System.out.println("**********Please select the operation********************"); int num=scanner.nextInt(); if(num==1){ while(true){ System.out.println("User: "); String userName=scanner.next(); System.out.println("Password: "); String passWord=scanner.next(); //调用登录业务,如登录成功显示学员管理界面 System.out.println("调用客户端业务--登录(Client.java)"); Datas data=clientBusiness.doLogin(userName,passWord); if(data.getFlag().equals(SysConstants.SYS_SUCCESS)){System.out.println("Login Successfully.");createStudentManagerView(data.getTeacher()); }else{ System.out.println("User name or password error,login failure..."); } } }else if(num==2){ System.out.println("System exit"); System.exit(0); } } //控制台输入对象 private static Scanner scanner=new Scanner(System.in); //客户端业务对象 private static ClientBusiness clientBusiness=new ClientBusiness(); private static Teacher teacher;} //调用登录业务,如登录成功显示学员管理界面 System.out.println("调用客户端业务--登录(Client.java)"); Datas data=clientBusiness.doLogin(userName,passWord);public void initSocket(){ //实例化Socket对象 String hostName=Tools.getValue(SysConstants.SYS_HOSTNAME); int port=Integer.parseInt(Tools.getValue(SysConstants.SYS_LISTENERPORT)); try { incoming=new Socket(hostName,port);//incoming.setSoTimeout(10000);System.out.println("与服务器连接成功");objOutputStream=new ObjectOutputStream(incoming.getOutputStream());System.out.println("获得服务器输出流");objInputStream=new ObjectInputStream(incoming.getInputStream());System.out.println("获得服务器输入流"); } catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace(); } catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace(); }}public void closeSocket(){ try{ objInputStream.close();objOutputStream.close();incoming.close(); }catch(IOException e){e.printStackTrace(); }}if(data.getFlag().equals(SysConstants.SYS_SUCCESS)){ System.out.println("Login Successfully."); createStudentManagerView(data.getTeacher());}else{ System.out.println("User name or password error,login failure...");}