关于struts和 hibernate的框架设计,servlet技术和jsp技术,数据库访问等技术。
通过struts 和hibernate 框架技术来实现一个小型学生信息管理系统的JavaEE项目,掌握小型系统程序设计的基本方法,掌握程序设计基本框架的搭建和模块化程序设计的基本思想,能够使用工具进行程序系统的调试,培养利用java语言进行程序设计的能力。
界面前端:Visual Studio Code
代码编写:MyEclipse
服务器:Tomcat
数据库设计与部署:SQLServer2008R2
服务器框架搭建:Hinernate,Struts
本系统主要包括用户登录,学生信息管理,课程信息管理,选课等功能。每个功能都要通过表单和报表来操作数据表中的数据。每个数据表存储了系统所需要的数据信息。在进行数据库设计前,要分析出系统所需要的数据表。
用户登录信息表(Users)
字段名称 |
数据类型 |
说明 |
uid |
自动编号 |
主键 |
username |
文本 |
用户名 |
password |
文本 |
密码 |
学生信息表(Student)
字段名称 |
数据类型 |
说明 |
sid |
自动编号 |
主键,学号 |
sname |
文本 |
学生姓名 |
gender |
文本 |
性别 |
dept_name |
文本 |
系名 |
tot_cred |
小数 |
总绩点 |
birthday |
日期/时间 |
生日 |
课程信息表(Course)
字段名称 |
数据类型 |
说明 |
cid |
整数 |
主键,课程号 |
title |
文本 |
课程名 |
credits |
小数 |
学分 |
start_time |
日期/时间 |
开始时间 |
end_time |
日期/时间 |
结束时间 |
模块功能:登录表单提供登录接口,管理员只要输入正确用户名和密码即可登录,学生首次登录需要先在用户名框输入学号点击激活按钮实现账户激活,如何输入默认密码即可登录。
界面设计:
业务逻辑处理:
通过输入的用户名和密码判断是否符合Users表中的记录,假如输入条件符合则跳转到Users_login_success.jsp界面,不符合则不跳转,输入用户名和密码为空时会有报错提醒,学生首次登录时需先在用户名输入学号,点击激活,通过输入的学号判断是否符合Student表中的记录,假如输入条件符合则在User表中添加该用户并在登录界面出现提示信息,提示你用户已激活,默认密码为xxx。输入密码后即可登录。
关键代码(action):
private Users user = new Users();
//用户登录动作
public String login(){
UsersDAO uDao = new UsersDAOImpl();
if(uDao.usersLogin(user)){
//在session中保存登录成功的用户名
session.setAttribute("loginUserName", user.getUsername());
return "login_success";
}else{
return "login_failure";
}
}
@Override
public void validate() {
if ("".equals(user.getUsername().trim())) {
this.addFieldError("userNameError", "用户名不为空");
}
if (user.getPassword().length()<=0) {
this.addFieldError("passwordError", "密码不为空");
}
}
//激活
@SkipValidation
public String activate(){
Users u = new Users();
u.setUsername(request.getParameter("username"));
u.setPassword(request.getParameter("username"));
UsersDAO uDao = new UsersDAOImpl();
if(uDao.activateUsers(u)){
session.setAttribute("activate_username", u.getUsername()+"已激活,默认密码为"+u.getUsername());
return "activate_success";
}else{
session.setAttribute("activate_username", "未激活");
return "activate_failure";
}
}
模块功能:显示是哪个用户登录界面,可通过左边列表进行不同功能界面的跳转,点击右上角的安全退出可退出系统。
界面设计:
业务逻辑处理
登录后获取登录时保存在session中的”username”,显示在界面右上角,点击安全退出按钮后,删除保存在session中的”username”,跳转到登录界面。左边列表提供各种链接通过页面跳转转到需要的界面。
关键代码:
${sessionScope.loginUserName}为Expression Language
欢迎 ${sessionScope.loginUserName} 使用本系统
@SkipValidation
//用户注销动作
public String logout(){
if(session.getAttribute("loginUserName")!=null){
session.removeAttribute("loginUserName");
}
if(session.getAttribute("activate_username")!=null){
session.removeAttribute("activate_username");
}
return "logout_success";
}
模块功能:通过访问数据层获取数据存入session中,在jsp页面中显示出来。显示的列表数据还提供修改和删除的跳转链接,点击对应列表的操作可跳转页面对数据进行更新和删除。在查询旁边的输入框输入要查询的学生id或课程编号,点击查询可显示你要查询的数据。
界面设计
业务逻辑处理:判断用户是否为管理员,是则正常显示查询列表,不是则显示你无权限,点击相应学生名或课程名,获取相应id,跳转到修改界面,点击删除操作,获取相应id,在数据库找到对应数据记录,对该数据记录进行删除。精确查询,在按下查询按钮后,获取输入框内的值,根据对于的sid/cid在其对应的数据库找到相应记录,并且显示在列表上。
关键代码:
//学生Action类
public class StudentAction extends SuperAction{
/**
*
*/
private static final long serialVersionUID = 1L;
//查询所有学生的动作
public String query(){
StudentDAO sDao = new StudentDAOImpl();
List list = sDao.queryAllStudents();
//放进session中
if (list!=null&&list.size()>0) {
session.setAttribute("students_list", list);
//return "Students_query_success";
}
if(session.getAttribute("loginUserName")!=null){
if(!session.getAttribute("loginUserName").equals("Manager")){
return "no_permission";
}else{
return "query_success";
}
}else{
return "no_permission";
}
}
//按学号查询学生
public String queryById(){
StudentDAO sDao = new StudentDAOImpl();
String sid = request.getParameter("sid");
Student student = sDao.queryStudentsBySid(sid);
//放进session中
if(student!=null){
session.setAttribute("student_ById", student);
}
return "queryById_success";
}
//删除学生动作
public String delete(){
StudentDAO sDao = new StudentDAOImpl();
String sid = request.getParameter("sid");
sDao.deleteStudents(sid);//调用删除
return "delete_success";
}
模块功能:点击添加学生/课程,跳转至添加界面,在表单内输入信息,点击添加按钮,添加成功会自动跳转至添加成功界面。
界面设计
业务逻辑处理:获取需要添加的学生/课程信息(学生id选取目前存在的最大数值+1),点击添加,相应信息将保存在新建的对象里,然后提过数据访问层添加至数据库。
关键代码:
//添加学生
public String add() throws Exception {
if(session.getAttribute("loginUserName")!=null){
if(!session.getAttribute("loginUserName").equals("Manager")){
return "no_permission";
}else{
Student s = new Student();
s.setSname(request.getParameter("sname"));
s.setGender(request.getParameter("gender"));
s.setDept_name(request.getParameter("dept_name"));
s.setTot_cred(3.8);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
s.setBirthday(sdf.parse(request.getParameter("birthday")));
StudentDAO sdao = new StudentDAOImpl();
sdao.addStudents(s);
return "add_success";
}
}else{
return "no_permission";
}
}
模块功能:跳转到相应更新界面后,表单中已显示你要修改的数据的当前信息,在表单内进行修改后保存即可跳转到修改成功界面,对用户密码的修改需要同时输入旧密码和新密码。
界面设计
业务逻辑处理:获取需要修改的学生/课程/用户的sid/cid/username,对其数据库获取对应信息显示在表单内,在表单内对数据进行修改,点击保存,重新从表单内获取修改好的数据后保存。通过数据访问层更新好数据记录。对于用户密码的更改,在更新前要判断旧密码是否与之前的密码一致,不一样就继续跳转到修改界面,不显示修改成功界面。
关键代码:
//修改密码
@SkipValidation
public String modify(){
//获得用户名
String username =(String)session.getAttribute("loginUserName");
UsersDAO udao = new UsersDAOImpl();
Users users = udao.queryUsersByUsername(username);
//保存在会话中
session.setAttribute("modify_users", users);
return "modify_success";
}
//保存修改的密码
@SkipValidation
public String save() throws Exception{
Users u = new Users();
String oldPassword = request.getParameter("oldPassword");
String newPassword = request.getParameter("newPassword");
String username = (String) session.getAttribute("loginUserName");
u.setPassword(newPassword);
UsersDAO udao = new UsersDAOImpl();
Users user = udao.queryUsersByUsername(username);
if(user.getPassword().equals(oldPassword)){
udao.updatePassword(newPassword,username);
return "save_success";
}else{
return "save_failure";
}
}
模块功能:显示课程列表,可在对应课程行右边点击选课,选课成功后会跳转到成功界面显示编号xxxx课程选课成功,点击课程表查询会显示你的选课记录,可在右边选择取消选课,清除该条记录。课程列表下可显示选课的总学分。
界面设计
业务逻辑处理:在选课列表中显示所有课程,在列表提供选课按钮,点击选课按钮servlet会获取相应id,在数据库中对比出对应记录,添加到session中,在课表查询中显示出来,同时获取每个课程的学分统计出总学分。在课表查询中提供取消选课来删除对应记录。
关键代码:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
if(request.getParameter("action")!=null){
this.action = request.getParameter("action");
if(action.equals("add")){//如果是添加课程进选课表
if(addToSelect(request,response)){
request.getRequestDispatcher("/courses/success.jsp").forward(request, response);
}else{
request.getRequestDispatcher("/courses/failure.jsp").forward(request, response);
};
}
if(action.equals("show")){//如果是展示选课表
request.getRequestDispatcher("/courses/Courses_table.jsp").forward(request, response);
}
if(action.equals("delete")){//如果是取消选课
if(deleteFromSelect(request,response)){
request.getRequestDispatcher("/courses/Courses_table.jsp").forward(request, response);
}else{
request.getRequestDispatcher("/courses/Courses_table.jsp").forward(request, response);
}
}
}
}
//添加课程进选课表的方法
private boolean addToSelect(HttpServletRequest request, HttpServletResponse response){
if(request.getParameter("cid")!=null){
int cid =Integer.parseInt(request.getParameter("cid"));
Course course = cDao.queryCoursesByCid(cid);
//第一次添加,给session添加新对象
if(request.getSession().getAttribute("select")==null){
Select select = new Select();
request.getSession().setAttribute("select", select);
}
Select select =(Select) request.getSession().getAttribute("select");
if(select.addCoursesInSelect(course)){
return true;
}
else{
return false;
}
}else{
return false;
}
}
//从选课表中删除课程
private boolean deleteFromSelect(HttpServletRequest request, HttpServletResponse response){
if(request.getParameter("cid")!=null){
int cid =Integer.parseInt(request.getParameter("cid"));
Course course = cDao.queryCoursesByCid(cid);
Select select =(Select) request.getSession().getAttribute("select");
if(select.removeCoursesFromSelect(course)){
return true;
}else{
return false;
}
}else{
return false;
}
}
源码包括数据库
https://download.csdn.net/download/qq_35941776/12061426
学习课程
https://www.imooc.com/learn/466