作为学习Java的新手,之前学过点Java的基础,后来又看了看网易云课堂的java,总共差不多两个月的时间吧,陆陆续续跟着书和视频编了一些程序。马上也要毕业,现在开始,希望能够写一些新手,进阶,高级项目经历。一方面,是对自己实践的一个总结反思学习的过程,另一方面,也是对自己职业的一个管理。
经验现在明显不足。有很多没有考虑到的地方,嘛嘛,总是要从入门到放弃的嘛,留在这,供高手娱乐消遣,供自己回忆吐槽:-D
无论如何,程序员这一行算是准备开始了/(ㄒoㄒ)/~~少年,迈上不归之路吧!Let’s go! All in!
因为赶上毕业,所以希望能马上完事,照着实现最简单的功能来,争取一周完事。说易行难,一看网上的各种分析,立马畏难情绪上来了,这各种各样的类,界面,功能,我完全无从下手啊。啊啊啊啊,这怎么办啊,虽然之前也做过小的项目,也知道甭管难不难,先去下手做就行,碰到问题,就解决问题呗。可这次问题是,我不知道从哪入手。这不就无语凝噎了吗?刷了刷新闻,哎,又被Unix的发明者的故事给虐了,你说人家20出头的时候已经能干出这么前无古人,很有可能后无来者的牛逼的事来,而逗逼如我,以临近毕业之势,刚刚开始学习java,这还有啥好奋斗的?大晚上的从实验室出来,简直是生无可恋有木有~。
伟大的某个伟人说过,想不通的时候要么吃饭,要么睡觉。一觉醒来,挫败感少了,头脑也清醒许多了,想了想,管他呢,就从如果我是用户,我要选课的流程是啥,首先干啥,接着怎么了(有没有产品设计的赶脚。。。),那我就从这个入手,按照用户操作来,需要啥写啥。需要啥,就打包到类里,提供统一面向外部的接口,然后打包到包里。。。不知道这样想对不对,反正这么一顿遇到问题解决问题下来,也整了个系统出来。好坏不说,自己设计的第一个独立的小系统,还是有成就感的。所以还是记录下来,若干年后,再来自打脸。。。
第一个项目为了打基础,会写的详细一些,以后会简写。(ps. 第一次用markdown写,文字都在一行了,后来发现,是不要随便敲空格啊,实在不行,复制一下最开始使用时跳出来的那个介绍markdown的界面作为模板,然后就知道咋回事了。。。原谅我这笨拙的人生吧。。)
好,扯淡够了,言归正传。平台采用从Eclipse官网里下载的eclipse for java软件平台,然后配置了一下jre 用的是jre 1.7。说到这里,也是之前很困惑,然后上网查阅。
写java程序,不用专门的eclipse,而是下载jdk软件包,然后配置classpath,再调用javac编译,java来运行。这种情况下,jdk软件包包含jre和一些开发工具,主要是javac和java(调用虚拟机)。jre是java运行引擎,是用户安装使用,它包含库lib以及java,用来调用用户的java虚拟机,运行java程序。而jdk是开发人员使用,它包含javac等用来开发的工具。而java虚拟机在jre中,因为java是跨平台运行在各系统中,它需要一个虚拟机帮助实现这个。至于配置classpath,则是可以实现在计算机任何位置都能调用javac和java的作用。而eclipse for java 有自己的编译器,直接下载安装,然后在build path 里选择jre 1.7(或者其他)即可使用。另外有些方法是不适合较早版本的编译器的,因此,我经常直接把编译器改成1.7版本的。接下来继续说项目吧。
首先学生选课系统主界面,应该是一个登录系统,和大部分你见过的一样,直接上图(丑陋style,用的是swing)
好了,可以看到,首先我们要设计一个MyFrame继承JFrame类,把图中相应的Component对象设计好(刚开始把密码框弄成了JTextFiled类了,应该是JPasswordFiled类,专门为密码输入提供的,还有用户名框不要用JTextArea类,这是一大块文本输入域,用JTextFiled类,一行即可)。
接着就是放置这些组件到MyFrame里了,在放置的时候,需要注意布局,通常我会采用在主JPanel类对象里,采用GridLayout布局,然后在每一行的JPanel类对象里,默认使用FlowLayout布局(可以设置放在左右位置),把主JPanel放置在MyFrame(默认BorderLayout的CENTER位置上)
可以在函数ini()里实现,然后是注册组件的事件监听器,我用到的一般是按钮(JButton)的addActionlistener(new Acitonlistener(){//在这里面实现处理事件};)在register()函数里实现,接着将这两个函数放到MyFrame构造函数里,最后在构造函数里将窗口的visible(),置为true;
接着,我们分析用户登录流程,当用户还没点击登录的时候,要在界面显示如上图,那首先得实现产生验证码的功能,Java是面向对象的嘛,在我理解就是能打包成一个类的弄成一个类,提供类面向外部的接口,因此可以把这个产生验证码的功能放在Tools类中实现;
当用户点击登录的时候,也就是要实现登录按钮的注册事件,首先获取用户输入的信息,然后接下来就是连接数据库,查询用户名和密码的正确性。所以需要一个数据库,库里有user表,含有用户名,密码,用户权限(设定1对应管理员,2对应教师,3对应学生,这是为了登陆后弹出相应的界面),也应该有student,teacher这些用户,以及course表。相应的在Java里要设计类,有User类,然后是继承User类的Student类和Teacher类,和数据库中的表相对应。同时有一个Course类,用来记录课程,选课的老师,以及选课的学生。
接着登录功能来说,在登录注册事件里,需要接收用户输入,验证登录正确性。验证正确性,可以在UserManage这个操作User类中实现,即实现login方法,提供用户输入的信息,在login里应该实现连接数据库,获取Connection对象,使用PreparedStatement,发送sql语句,获取ResultSet,然后验证输入的正确性。
选数据库的时候,最开始选了SQLite数据库,适合嵌入,后面对多用户并发读写支持不好,可能是我没弄好,所以弃了,选择了SQL Server数据库,这个数据库使用,首先要在配置管理器里启动sql server服务,切记切记。
Java的jdbc可以通过下载的数据库驱动包,实现对各类数据库的统一调用方法,包括Class.forName(“驱动”),Connection DriverManager.getConnection(“协议+路径”)。因此选择好数据库,然后下载相应的驱动文件包(.jar),然后将其build path进Libarary中,就可以直接调用以上方法了。而这两个函数里所需的字符串,可以通过解析xml文件实现,将解析过程设为MyFrame的静态代码块,只执行一次。xml解析也有两种,考虑到解析较小文件和提高效率,选用了DOM解析,先读进内存,再遍历树。在login里实现连接。然后就是发送sql语句了。Statement类不能使用参数,因此使用PreparedStatement,用?代替参数,如
String str="select * from user where uname=?"
PreparedStatement ps=conn.getPreparedStatement(str);
ps.setString(1,name)
将这个发送过程,放进Tools里去实现PreparedStatement sqlBuilder(String str,Object obj[])。接着利用返回的ps,得到ResultSet rs,然后就是利用rs的next()函数,获取从数据库中得到的查询的值,然后判断用户名与密码的正确性。若正确,就要考虑写登录日志了,记录登录时间和用户,放在Record类里,登出时间,在某个用户登出后记录,然后是通过I/O将Record对象写入/读出文件中。写对象,用ObjectOutputStream。
这个MyFrame作为gui,可以将放在com.my.gui包里。具体public class MyFrame{},Tools类,User类,Student类,Teacher类,Course类,UserManage类,实现在文末统一给出。其实,很多类都是基本定了,然后缺啥补啥。。
最后,注意一些使用的友好性,在登录时,对某些用户的一些操作,如输入为空,点击叉号等,要及时弹出对话框,因此要设计一个MyDialog类继承JDialog类,实现对话功能。然后就是验证码输入不对,重输之前,要清零等一些友好设计,想象一下,作为用户的你,面对一些不友好设计时的各种吐槽吧~
接下来,就是分别设计管理员系统界面,学生系统界面,教师系统界面,以及数据库的设计了。
程序附录
主界面MyFrame;
有些编写,本文未提到的,后面会介绍
package com.my.gui;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import com.my.beans.Record;
import com.my.beans.Student;
import com.my.beans.Teacher;
import com.my.beans.User;
import com.my.manage.UserManage;
import com.my.util.Tools;
public class MyFrame extends JFrame{
private Container pn;
private JPanel pn_name,pn_pwd,pn_code,pn_login;
private JLabel label,label_name,label_pwd,label_code;
private JTextField filed_name,filed_code,field_code_play;
private JPasswordField pwd;
private JButton login;
private String uname;
private String upwd;
private String code;
private String codePlay;
private UserManage um=null;
private Record record=null;
private Date inTime;
private Date outTime;
private User user=null;
private AdmisterGUI agui=null;
private TeacherGUI tgui=null;
private StudentGUI sgui=null;
public UserManage getUm() {
return um;
}
public MyFrame()
{
ini();
register();
this.setVisible(true);
}
public void ini()
{
this.setSize(400,300);
this.setTitle("学生选课教务系统");
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
pn=new Container();
pn_name=new JPanel();
pn_pwd=new JPanel();
pn_code=new JPanel();
pn_login=new JPanel(new FlowLayout(FlowLayout.RIGHT));
label=new JLabel("登录");
label_name=new JLabel("账户", JLabel.CENTER);
label_pwd=new JLabel("密码", JLabel.CENTER);
label_code=new JLabel("验证码", JLabel.CENTER);
filed_name=new JTextField(20);
field_code_play = new JTextField(9);
filed_code=new JTextField(9);
pwd=new JPasswordField(20);
login=new JButton("登录");
//窗体居中
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension dm=kit.getScreenSize();
this.setLocation((dm.width-this.getWidth())/2, (dm.height-this.getHeight())/2);
//放置
pn_name.add(label_name);
pn_name.add(filed_name);
pn_pwd.add(label_pwd);
pn_pwd.add(pwd);
pn_code.add(label_code);
pn_code.add(filed_code);
//调用tools类产生验证码,并显示在界面上
codePlay=Tools.codeGen();
field_code_play.setText(codePlay);
field_code_play.setHorizontalAlignment(JTextField.CENTER);
pn_code.add(field_code_play);
pn_login.add(login);
pn.setLayout(new GridLayout(4, 1));
this.add(label,BorderLayout.NORTH);
pn.add(pn_name);
pn.add(pn_pwd);
pn.add(pn_code);
pn.add(pn_login);
this.add(pn,BorderLayout.CENTER);
}
public void register()
{
login.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
um=new UserManage();
uname=filed_name.getText();
upwd=pwd.getText();
code=filed_code.getText();
if("".equals(uname)||"".equals(upwd))
{
//自定义对话框 MyDialog 弹出提示
new MyDialog("账户和密码不能为空!");
}
else
{
if("".equals(code)){
new MyDialog("验证码不能为空!");
}
else if(code.equalsIgnoreCase(codePlay))
{
//调用UserManage类 login方法
user=um.login( uname,upwd);
if(user==null){
new MyDialog("账户和密码不正确!");}
else
{
//重复登录 验证码清零
codePlay=Tools.codeGen();
field_code_play.setText(codePlay);
field_code_play.setHorizontalAlignment(JTextField.CENTER);
//清空输入
filed_code.setText("");
record=new Record();
record.setUser(user);
inTime= new Date(Calendar.getInstance().getTimeInMillis());
record.setInTime(inTime);
//判断uright,调用管理员、教师、学生窗口
int uright=user.getUright();
if(uright==1)//管理员
{
agui=new AdmisterGUI(record,MyFrame.this);////在里面实现 窗口退出 写登录日志
}
else
if(uright==2)//教师
{
Teacher teacher=(Teacher)user;
tgui=new TeacherGUI(record,MyFrame.this,teacher);////在里面实现 窗口退出 写登录日志
}
else
{
Student student=(Student)user;
sgui=new StudentGUI(record,MyFrame.this,student);////在里面实现 窗口退出 写登录日志
}
}
}
else
{
new MyDialog("验证码不正确!");
//调用tools类产生验证码,并显示在界面上
codePlay=Tools.codeGen();
field_code_play.setText(codePlay);
field_code_play.setHorizontalAlignment(JTextField.CENTER);
//清空输入
filed_code.setText("");
}
}
}
});
//主窗口正在关闭 释放资源
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
if(um!=null){
um.closeConnection();}
((MyFrame)e.getSource()).dispose();
System.exit(0);
}
});
}
//自定义对话框
class MyDialog extends JDialog{
private JLabel msg;
private JButton ok;
private JPanel pne;
public MyDialog(String msg)
{
ini( msg);
register();
MyDialog.this.setVisible(true);
}
public void ini(String msg)
{
MyDialog.this.setSize(300,100);
//窗体居中
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension dm=kit.getScreenSize();
MyDialog.this.setLocation((dm.width-MyDialog.this.getWidth())/2, (dm.height-MyDialog.this.getHeight())/2);
pne=new JPanel();
pne.setLayout(new GridLayout(2, 1));
MyDialog.this.msg=new JLabel(msg, JLabel.CENTER);
MyDialog.this.ok=new JButton("确定");
pne.add(MyDialog.this.msg);
pne.add(MyDialog.this.ok);
MyDialog.this.add(pne,BorderLayout.CENTER);
}
public void register()
{
MyDialog.this.ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MyDialog.this.dispose();
}
});
}
}
}
诸多琐事,没有时间细细讲解。直接上代码吧。
学生教务系统Java实现