说明:文章内容全部截选自实验楼教程:【SSH框架实现简单的在线考试系统】~
一、实验内容
1.1 实验介绍
该项目使用 spring4+struts2+hibernate5 的SSH框架来实现一个简单的在线考试系统。其实在实际的企业开发中,较早版本的SSH框架由于代码维护性等各方面的原因,大多都已经被淘汰了,特别是 hibernate 框架的使用。自从 hibernate3.2 版本可以使用注解来做对象关系映射之后,以前使用 xml 文件来进行映射的方式就逐渐被淘汰了,SSH框架整合的配置文件也有了很大的不同。在接下来的实验中,我们将学习如何使用注解和配置文件的方式在数据库中自动建表以及以及框架整合的配置文件的注意事项。
1.2 实验知识点
- SSH框架
- Annotation注解
- JSP
- 框架整合XML配置文件
1.3 实验环境
本次实验所用的实验环境要求如下;
- JDK 1.8
- hibernate5
- spring4
- struts2
- eclipse
- Tomcat7.0
二、项目文件结构
三、实验步骤
3.1 开发环境准备
3.2 配置文件
关于开发环境以及配置文件的相关教程说明,这里就不作叙述了,想查看的,点击【SSH框架实现简单的在线考试系统】即可~
3.3 实体类
本次课程中涉及到的实体类有Student学生类、Course课程类、Test试题类三个,其中Course和Test是一对多的关系。这些实体类全部放在src目录下的com.testonline.hibernate包。
3.3.1 Student实体类
Student实体类对应了student这个表,他有三个字段,用来存放学生信息。Student实体类的具体代码和注释请看下面:
package com.testonline.hibernate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/*
* @Entiy标识这是一个实体类
* @Table表示在数据库中创建的表的名字
*
*/
@Entity
@Table(name="student")
public class Student {
private int Id;
private String name;
private String password;
//@Id表示该列是主键
//@GeneratedValue表示主键生成策略
//@Column是为列取别名,可以没有
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
3.3.2 Course实体类
Course实体类用于存放课程信息,只有两个字段,Course实体类与后面的Test实体类有一对多的映射关系。在Course实体类中我们用@OneToMany来注解。具体如下:
package com.testonline.hibernate;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="course")
public class Course {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
private int courseID;
private String course;
//@OneToMany映射关系
//CascadeType为级联属性
//@JoinColum为对应的多的一方的列
@OneToMany(cascade={CascadeType.ALL})
@JoinColumn(name="course_ID")
private Set t = new HashSet<>();
public Set getT() {
return t;
}
public void setT(Set t) {
this.t = t;
}
public int getCourseID() {
return courseID;
}
public void setCourseID(int courseID) {
this.courseID = courseID;
}
public String getCourse() {
return course;
}
public void setC(String course) {
this.course = course;
}
}
在这里要注意,如果在多个字段上都有注解,那么他们注解的位置应该一致,都是在属性定义前或者都在get、set方法前,否则会报错。
3.3.3 Test实体类
Test实体类映射test试题表,用于存放试题的信息,在与Course的关系中是多的一方,其具体的信息如下:
package com.testonline.hibernate;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="test")
public class Test {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "testID")
private int testID;
private String title;
private String answer;
private String A;
private String B;
private String C;
private String D;
//@Basic是抓取策略
//JoinColum要与Course中对应
@ManyToOne
@JoinColumn(name="course_ID")
@Basic(fetch=FetchType.LAZY)
private Course course;
public Course getCourse() {
return course;
}
public void setCourseID(Course course) {
this.course= course;
}
public int getTestID() {
return testID;
}
public void setTestID(int testID) {
this.testID = testID;
}
public String getA() {
return A;
}
public void setA(String a) {
A = a;
}
public String getB() {
return B;
}
public void setB(String b) {
B = b;
}
public String getC() {
return C;
}
public void setC(String c) {
C = c;
}
public String getD() {
return D;
}
public void setD(String d) {
D = d;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public void setCourse(Course course) {
this.course = course;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
}
3.4 JSP页面
本次课程总共有五个主要的JSP页面,他们都放在WebContent目录下,除去错误页面error.jsp和结束页面over.jsp以外(这两个页面都只是提示用,页面只输出一句话,在这里代码就省略了),还有用于学生登录的页面login.jsp、用于选择课程的页面choose_course.jsp以及用于显示试题的页面test.jsp。
3.5 Action的编写
所有的Action都位于com.testonline.action包中。包含LoginAction和ChooseCourseAction,一个用于登录验证,一个用于选择课程和试题。
3.6 service服务层
在service层中,主要包含了service接口和他的实现类。service接口定义了我们需要让service层完成的事,供外部访问,而它的实现类重写了这些方法。
3.7 DAO层
在dao层中包含了提供给外部访问的接口dao和接口实现类daoImpl。在daoImpl中是两个action的底层的数据处理。接口dao定义了两个action需要调用的方法;
程序运行结果
在启动了服务器的前提下,我们直接打开环境自带的Firfox浏览器,在地址栏输入
http://localhost:8080/TestOnlienew
就可以进入登录页面:
输入对应的学生姓名和密码(刚才在数据中插入的记录),如果正确就会跳转的课程选择页面,错误会跳转到错误页面。课程选择页面:
课程选择完成后,点击sure按钮,会根据不同的课程显示不同的题目:
答案正确页面:
错答页面:
最后
文章主要截选的是实体类的实现,关于开发环境的准备、配置文件、JSP文件、Action的编写、service服务层、DAO层、运行测试等详细的步骤说明以及代码,点击【SSH框架实现简单的在线考试系统】即可进行查看了~