相对规范的小项目
项目整体结构如下
主通道 Entry类
package com.lanou3g.Main;
import java.io.File;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import com.lanou3g.service.Menu;
import com.lanou3g.util.ConstantUtil;
public class Entry {
//主函数
public static void main(String args[]) {
PropertyConfigurator.configure(ConstantUtil.LOG4JCONFIGFILE);
Menu menu = new Menu();
menu.run();
}
}
Clazz班级类
package com.lanou3g.model;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import com.lanou3g.util.ConstantUtil;
public class Clazz {
private String clazzID;
private List<Student> list = new ArrayList<Student>();
Document document;
// String filePath = System.getProperty("user.dir") + File.separator + "resource" + File.separator + "student.xml";
public Clazz() {}
public Clazz(String clazzID) {
this.clazzID = clazzID;
restoreFromFile(ConstantUtil.DATAFILE);
}
//添加学生信息
public void addStudent() {
Student student = new Student(" ",null, null, null);
list.add(student);
Element root = document.getRootElement();
Element student1 = root.addElement("student");
student1.addElement("id");
student1.addElement("name");
student1.addElement("gender");
student1.addElement("age");
edit(student);
OutputFormat oft = OutputFormat.createPrettyPrint();
}
public List<Student> restoreFromFile(String fileName) {
SAXReader reader = new SAXReader();
try {
document = reader.read(new File(fileName));
Element rootElement = document.getRootElement();
for(Iterator<Element> it = rootElement.elements().iterator(); it.hasNext();) {
Element stuElm = it.next();
String ID = stuElm.element("id").getText();
String name = stuElm.element("name").getText();
String gender = stuElm.elementText("gender");
Integer age = Integer.parseInt(stuElm.elementText("age"));
Student stu = new Student(ID, name, gender, age);
list.add(stu);
// System.out.println(stu.toString());
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
public String getClazzID() {
return clazzID;
}
public void setClazzID(String clazzID) {
this.clazzID = clazzID;
}
public List<Student> getList() {
return list;
}
public void setList(List<Student> list) {
this.list = list;
}
//查询学生函数
public Student findByID(String ID) {
Student student = null;
for (Iterator<Student> it = this.list.iterator(); it.hasNext();) {
if ((student = it.next()).getID().equals(ID)) {
return student;
}
}
return null;//循环正常结束则表示没有找到
}
//删除功能函数
public void deleteStudent(Student student) {
//在学生列表删除
this.getList().remove(student);//从集合中把Student删除
//在dom 中删除
Element root = document.getRootElement();
Iterator<Element> it = root.elements().iterator();
while (it.hasNext()) {
Element e = it.next();
String ID = e.elementText("id");//取到标签文本
if (ID.equals(student.getID())) {
root.remove(e);
break;
}
}
//保存数据到磁盘
save();
}
//修改学生对象属性
public Student edit(Student student) {
Scanner input = new Scanner(System.in);
System.out.println("ID : ");
String ID = input.nextLine();
System.out.println("name : ");
String name = input.nextLine();
System.out.println("gender : ");
String gender = input.nextLine();
System.out.println("age : ");
Integer age = input.nextInt();
//修改dom 结点的值
Element root = document.getRootElement();
Iterator<Element> it = root.elements().iterator();
Element stuEle = null;
while(it.hasNext()) {
stuEle = it.next();
if (stuEle.elementText("id").equals(student.getID())) {
break;
}
}
if (null != stuEle) {
stuEle.element("id").setText(ID);
stuEle.element("name").setText(name);
stuEle.element("gender").setText(gender);
stuEle.element("age").setText(age + "");
}
student.setID(ID);
student.setName(name);
student.setGender(gender);
student.setAge(age);
//存盘
save();
return student;
}
public void save() {
saveToFile(document, ConstantUtil.DATAFILE);
}
//把修改过的dom保存到磁盘
public void saveToFile(Document document, String filename) {
try {
//一般一样的异常不能放在一起,不知道是哪个出现异常
XMLWriter writer = new XMLWriter(new FileWriter(filename));
writer.write(document);
writer.flush();
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
父类Person
package com.lanou3g.model;
public class Person {
private String ID;
private String name;
private String gender;
private Integer age;
public Person() {}
public Person(String ID, String name, String gender, Integer age) {
this.ID = ID;
this.name = name;
this.gender = gender;
this. age = age;
}
@Override //表示重写父类方法,如果父类中没有的方法写出来会
public String toString() {
String s = "ID: " + ID + "\nname: " + name + "\ngender: " + gender + "\nage: " + age;
return s;
}
public String getID() {
return ID;
}
public void setID(String iD) {
ID = iD;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
Score成绩类
扫描二维码关注公众号,回复:
2436293 查看本文章
package com.lanou3g.model;
public class Score {
private Subject subject;
private Double score;
public Score() {}
public Score(Subject subject, Double score) {
this.subject = subject;
this.score = score;
}
public Subject getSubject() {
return subject;
}
public void setSubject(Subject subject) {
this.subject = subject;
}
public Double getScore() {
return score;
}
public void setScore(Double score) {
this.score = score;
}
}
Student学生类 继承于Person类
package com.lanou3g.model;
import java.util.ArrayList;
import java.util.List;
public class Student extends Person {
private String SID;
private String grade;
private String major;
private String clazz;//班级
private List<Score> sList = new ArrayList<Score>();
public Student() {}
public Student(String ID, String name, String gender, Integer age) {
super(ID, name, gender, age);
// TODO Auto-generated constructor stub
}
//添加成绩
public void addScore(Score score) {
this.sList.add(score);
}
public String getSID() {
return SID;
}
public void setSID(String sID) {
SID = sID;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
}
Subject类
package com.lanou3g.model;
public class Subject {
private String subjectID;
private String name;
public Subject() {}
public Subject(String subjectID, String name) {
this.subjectID = subjectID;
this.name = name;
}
}
Menu类
package com.lanou3g.service;
import java.util.Iterator;
import java.util.Scanner;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.Element;
import com.lanou3g.Main.Entry;
import com.lanou3g.model.Clazz;
import com.lanou3g.model.Student;
public class Menu {
private static final Logger LOG = Logger.getLogger(Entry.class);
private Clazz clazz;
Document document;
public Menu() {}
//lazy loading
public Clazz getClazz() {
if (null == clazz) {//如果需要 ,则创建, 节省内存
clazz = new Clazz("123");
}
return clazz;
}
private void showMenuHead() {
System.out.println("*********************************");
System.out.println("* 欢迎使用学生成绩管理系统 *");
System.out.println("*********************************");
}
//功能显示函数
private void showMainMenu() {
System.out.println("1. 显示全部学生信息 ");
System.out.println("2. 添加学生信息");
System.out.println("3. 查询学生信息");
System.out.println("0. exit");
}
//功能跳转函数
public void run() {
showMenuHead();
showMainMenu();
Scanner input = new Scanner(System.in);
int selected;
while ((selected = input.nextInt()) != 0) {
switch (selected) {//跳转到子菜单
case 1:
showAll();
break;
case 2:
this.clazz.addStudent();
break;
case 3: findStudent();
break;
default:
break;
}
showMainMenu();
}
System.out.println("谢谢使用,bye");
input.close();//关闭Scanner
}
//设置输出格式函数
void showAll() {
System.out.println("+------------------+--------+------+---+");
System.out.format("|%18s|%8s|%6s|%3s|\n", "ID", "name", "gender", "age");
System.out.println("+------------------+--------+------+---+");
for (Iterator<Student> it = this.getClazz().getList().iterator(); it.hasNext();) {
Student stu = it.next();
System.out.format("|%18s|%8s|%6s|%3d|\n", stu.getID(), stu.getName(), stu.getGender(), stu.getAge());
System.out.println("+------------------+--------+------+---+");
}
}
//查找函数
void findStudent() {
Scanner input = new Scanner(System.in);
System.out.println("请输入ID:");
String ID = input.next();
Student student = this.getClazz().findByID(ID);
if (null != student) {
System.out.println(student);
} else {
LOG.info("ID not found");
}
int selected = 0;
do {
System.out.println("1. 修改");
System.out.println("2. 删除");
System.out.println("0. 返回");
selected = input.nextInt();
switch (selected) {
case 1:
this.getClazz().edit(student);
System.out.println("修改成功!!!!");
break;
case 2:
this.getClazz().deleteStudent(student);
System.out.println("删除成功!!!");
selected =0;
break;
default:
break;
}
} while (selected !=0);
}
}
ConstantUtil类
存储常量如地址之类的
package com.lanou3g.util;
import java.io.File;
//改成抽象类外界也无法创建对象
//final修饰的类不能被继承
public abstract class ConstantUtil {
public static String HOMEPATH = System.getProperty("user.dir");
public static String RESPATH = HOMEPATH + File.separator + "resource";
public static String LOGPATH = HOMEPATH + File.separator + "log";
public static String CONFIGPATH = HOMEPATH + File.separator + "config";
public static String LOG4JCONFIGFILE = CONFIGPATH + File.separator + "log4j.properties";
public static String DATAFILE = RESPATH + File.separator + "student.xml";
public static String HOSTNAME = "www.lanou3g.com";
public static String HOSTIP = "192.168.1.1";
//构造方法变成私有方法,外面就无法创建了
private ConstantUtil() {
}
}
log4j.properties
日志配置文件
## 设置日志级别和输出源
log4j.rootLogger = All,sysout
## sysout
## 设置日志输出位置
log4j.appender.sysout = org.apache.log4j.ConsoleAppender
## 设置输出布局
log4j.appender.sysout.layout = org.apache.log4j.PatternLayout
## 设置布局样式
log4j.appender.sysout.layout.ConversionPattern = [%p] [%d] [%l] %n%m%n
## 设置输出源优先级(对文件输出源有效)
log4j.appender.sysout.Threshold = ALL
## 设置是否立即写入
log4j.appender.sysout.ImmediateFlush = TRUE
student.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<Students>
<student>
<id>1001</id>
<name>Tom</name>
<gender>male</gender>
<age>15</age>
</student>
<student>
<id>1002</id>
<name>Jerry</name>
<gender>fmale</gender>
<age>12</age>
</student>
</Students>