Javaweb-xml编程-考生成绩管理系统(1)

来源:互联网 发布:nat123访问数据库很慢 编辑:程序博客网 时间:2024/05/20 15:40

实例内容:考生成绩管理系统

系统需要具备的功能:

①添加学生信息,删除学生信息,查询学生成绩;

②当我们选择以上三个选项时,系统应该对用户进行提示。以添加信息为例,需要提示:请输入学生姓名,准考证号,所在地,成绩;

③当用户信息输入不正确时,系统应该予以错误提示

(1)xml文档编写

<?xml version="1.0" encoding="UTF-8"?><exam><student idcard="1" examid="111"><name>春柳</name><address>吉林</address><grade>99</grade></student></exam>

说明:

①新建Java项目,项目中新建xml文件,视图默认design,我们选择source;

②编写如上内容,CTRL+shift+F自动排版为如上格式;

③xml文件内容表示数据库中包含一个学生信息,学号为1,准考证号为111,住址为吉林,成绩为99。

(2)student类编写

package domain;/** * @author lenovo * */public class Student {private String examid;private double grade;private String idcard;private String address;private String name;public String getExamid() {return examid;}public void setExamid(String examid) {this.examid = examid;}public double getGrade() {return grade;}public void setGrade(double d) {this.grade = d;}public String getIdcard() {return idcard;}public void setIdcard(String idcard) {this.idcard = idcard;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

说明:

①创建封装学生信息的实体bean,包名为domain,类名为student;

②student类中封装了考生的信息,并对外提getset方法;

③添加完属性后鼠标右键选择source-->generate getters and setters,自动生成getset方法。

(3)Student类编写

package dao;import domain.Student;public class StudentDao {public void add(Student s){}public Student find(String examid){//根据准考证号进行查找,返回值是一个学生信息return null;//避免报错先返回null}public void delete(String name){//根据学生姓名进行删除}}

说明:上面的student类是编写不完整的,它一共包含三种方法,添加、查找和删除。

(4)XmlUtils类编写

package utlis;import java.io.FileOutputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;public class XmlUtils {private static String filename = "src/exam.xml";public static Document getDocument() throws Exception{//工具类的方法通常为静态的DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();return builder.parse(filename);}public static void write2Xml(Document document) throws Exception{TransformerFactory factory = TransformerFactory.newInstance();Transformer tf = factory.newTransformer();tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream(filename)));}}

说明:

①工具类放在工具包里面;

②工具类中的方法需要是静态的;

③包的导入方法是在报错的一行ctrl+1。

(5)Student类补全

package dao;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import domain.Student;import expection.StudentNotExistException;import utlis.XmlUtils;public class StudentDao {public void add(Student s)throws Exception{try {Document document = XmlUtils.getDocument();//首先要创建出封装学生信息的标签Element student_tag = document.createElement("student");student_tag.setAttribute("idcard",s.getIdcard());student_tag.setAttribute("examid",s.getExamid());//内容助理:alt+///然后创建封装学生姓名、所在地和成绩的标签Element name = document.createElement("name");Element address = document.createElement("address");Element grade = document.createElement("grade");//grade是double类型的//往便签上挂信息name.setTextContent(s.getName());//学生姓名封装上去address.setTextContent(s.getAddress());grade.setTextContent(s.getGrade()+"");//括号里面需要的是string类型,任意东西和字符串相加都会变成字符串//建立标签关系student_tag.appendChild(name);student_tag.appendChild(address);student_tag.appendChild(grade);//把封装了学生信息的标签挂到文档上document.getElementsByTagName("exam").item(0).appendChild(student_tag);//挂到exam根节点上;根节点只有一个item(0);使用appendChild()方法//更新内存XmlUtils.write2Xml(document);} catch (Exception e) {//异常需要反应给上一层,也不可以抛出,所以需要对异常进行转型throw new RuntimeException(e);//编译时异常转为运行时异常,问题报告给上一层,也不会给上一层带来麻烦}}


说明:

①注意运行时异常和编译时异常的使用场景;

②给一段代码增加try/catch语句的方法:选定一段代码,鼠标右键->surrounded with->try/catch block

public Student find(String examid) throws Exception{//根据准考证号进行查找try {Document document = XmlUtils.getDocument();//取出所有学生标签,获取标签中的examid属性,看是否匹配NodeList list = document.getElementsByTagName("student");//得到所有学生for(int i = 0;i<list.getLength();i++){//for循环取出每一个,不可以使用增强for循环,NodeList没有继承iterable接口Element student_tag = (Element) list.item(i);if(student_tag.getAttribute("examid").equals(examid)){//找到与examid相匹配的学生,new处一个student对象封装这个学生信息并返回Student s = new Student();s.setExamid(examid);//将准考证号存进去s.setIdcard(student_tag.getAttribute("idcard"));//将标签中的id号存进去//获取姓名和地址相对麻烦,需要获取当前标签下的孩子s.setName(student_tag.getElementsByTagName("name").item(0).getTextContent());s.setAddress(student_tag.getElementsByTagName("address").item(0).getTextContent());//setGrade方法需要的是一个double,所以需要将字符串转换为doubles.setGrade(Double.parseDouble(student_tag.getElementsByTagName("grade").item(0).getTextContent()));//Double.parseDouble()方法把对象转换为doublereturn s;}}return null;//没找到就返回null} catch (Exception e) {throw new RuntimeException(e);}}

说明:上面的代码是相连的,在一个类中,分开说明类中的三个方法,注意几个方法编写的不同之处。

public void delete(String name) throws StudentNotExistException{//根据学生姓名进行删除try{Document document = XmlUtils.getDocument();NodeList list = document.getElementsByTagName("name");//得到每一个name标签for(int i = 0;i<list.getLength();i++){if(list.item(i).getTextContent().equals(name)){//得到标签内容看是否与要删除的内容相同list.item(i).getParentNode().getParentNode().removeChild(list.item(i).getParentNode());return;//删除了就return}}        //如果删除不成功,自定义一个异常并抛出throw new StudentNotExistException(name+"不存在!");//说明该学生不存在}catch(StudentNotExistException e){//这里一定要包含该语句,表示要抓取上面的异常,否则又会是运行时异常throw e;} catch (Exception e) {throw new RuntimeException(e);}}}

说明:

①删除的学生信息不存在时应该予以用户一个响应,提示信息不存在;

②自定义的异常也要放在一个包中,如果系统比较大,自定义的异常也会比较多。

思考:如果删除不成功则抛出编译时异常,为什么不抛出运行时异常?

思考:为什么不直接抛出异常,而是自定义异常抛出?

(6)StudentNotExsitException异常类

package expection;public class StudentNotExistException extends Exception {public StudentNotExistException() {// TODO Auto-generated constructor stub}public StudentNotExistException(String message) {super(message);// TODO Auto-generated constructor stub}public StudentNotExistException(Throwable cause) {super(cause);// TODO Auto-generated constructor stub}public StudentNotExistException(String message, Throwable cause) {super(message, cause);// TODO Auto-generated constructor stub}public StudentNotExistException(String message, Throwable cause, boolean enableSuppression,boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);// TODO Auto-generated constructor stub}}

说明:

①异常的包名为exception,类名为StudentNotExistException,创建类时Superclass选择Exception,

②建立的类如果是异常,爸爸也需要是异常,所以需要继承异常,因为需要有返回值,所以使用编译时异常而不是运行时异常

③如果Surperclass选择的是RunTimeException,则创建的类是运行时异常;

④错误信息通过构造函数进行封装,我们只要把爸爸的构造函数继承过来即可:

接下一篇:考生成绩管理系统(2)

备注:传智播客视频学习笔记


原创粉丝点击