目录
引言
题目要求
设计阶段
数据库设计
Controller层设计
运行效果图:
SSM框架搭建:
基础配置
配置Maven
测试:
学生管理系统的编码阶段:
dao层与*Mapper.xml映射关系
Service层和dao层的关系:
controller层与Service层的关系:
jsp和Controller前后端进行数据交互
分页技术的实现:
Student相关的代码:
messageController.jsp
basePageStudent.jsp
listStudent.jsp
studentInfo.jsp
addStudent.jsp
studentController.java
参考书籍及博客:
工程的github:
对java本身不是很熟悉,想着到期末了,也要学点有用的东西,就选择了SSM框架。如果有错,还请指教。
(功能进一步完善,主要是数据处理的异常。代码也上传到github。-----2019/6/19)
教师登录后可以录入自己任课课程的学生的成绩,可以修改、查看、成绩.查看学生成绩时,要求用到分页技术
学生登录后可以选课,选课后不可更改。可以查看自己所上课程的成绩
教务人员登录后可以录入教师任课信息,可以修改学生选课信息。
选择创建project,然后就跳到这个页面,选择Maven,然后打勾,然后选择下面蓝色的选项,然后next
groupId一般是域名的反写,也作为项目中类的包名(在java目录下下面会提到),artifactId是工程名
记得添加蓝色的这一行,不然后面可能会报错
然后的等创建结束后,生成的目录如下:(创建的过程很慢的,一定要等创建完,中间可能会出现没有main文件夹(遇到这个问题百度),这个目录一定是自动生成的)
然后创建其他文件夹,如下图,然后对照着下面有颜色的文件夹,分别右击,选择Mark Directory As,分别标记(test目录的两个文件夹分别标记为test source root和test resource root; main目录下的java和resource分别标记为source root和resource root),不标记的话后面的会在配置文件中报错的:
配置pox.xml, 这个文件夹就5和6行(groupId和artifactId)是不同的,就是上面说的创建项目要填的,直接把整个复制过去,然后在IDEA的右下角会出现一个“import....”,点击然后就会自己下载相关配置文件了。我出现过的问题都有记录在配置文件中说明情况和解决方法,可以仔细看下。(这个文件有一处,在最后面)
4.0.0
com.springmvc
STUDENT
1.0-SNAPSHOT
war
STUDENT Maven Webapp
http://www.example.com
UTF-8
1.7
1.7
4.2.5.RELEASE
3.2.4
1.6.6
1.2.12
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-oxm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-test
${spring.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
1.2.2
mysql
mysql-connector-java
5.1.29
junit
junit
4.11
test
javax.servlet
jstl
1.2
javax.servlet.jsp
jsp-api
2.2.1-b03
provided
javax.servlet
servlet-api
2.5
provided
com.fasterxml.jackson.core
jackson-core
2.7.1
com.fasterxml.jackson.core
jackson-annotations
2.7.1
com.fasterxml.jackson.core
jackson-databind
2.7.1
net.sf.json-lib
json-lib
2.4
jdk15
commons-lang
commons-lang
2.4
commons-logging
commons-logging
1.1
commons-pool
commons-pool
1.5.6
commons-dbcp
commons-dbcp
1.4
commons-beanutils
commons-beanutils
1.8.3
commons-httpclient
commons-httpclient
3.1
commons-collections
commons-collections
3.1
commons-codec
commons-codec
1.9
javax.annotation
jsr250-api
1.0
net.sf.ezmorph
ezmorph
1.0.6
javax.activation
activation
1.1
taglibs
standard
1.1.2
log4j
log4j
${log4j.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
commons-fileupload
commons-fileupload
1.3.1
commons-io
commons-io
2.4
STUDENT
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-war-plugin
3.2.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
true
true
generator.properties配置数据库(不用这个也是可以的,只是要改generatorConfig.xml里面的配置内容),只需要修改引号标注的内容(引号千万别留着,下面也是一样)
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/"数据库名"?useUnicode=true&characterEncoding=utf-8
username="mysql登录名"
password=“密码”
#entity 包名和 java目录
modelPackage=com.springmvc.entity
modelProject=src/main/java
#sqlmap包名 和resources目录
sqlPackage=sqlmap
sqlProject=src/main/resources
#mapper包名和 java目录
mapperPackage=com.springmvc.dao
mapperProject=src/main/java
#table=“表名”
generatorConfig.xml配置文件:(classPathEntry需要改成你相应的jar,在External Libraries下找到mysql的包,然后右击copy path,这个包也是会自己下载的,所以在External Libraries下可以找到)
jdbc.properties配置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/“数据库名”?useUnicode=true&characterEncoding=utf-8
username=“登录名”
#下面输入自己数据库的密码
password=“密码”
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000
log4j.properties配置(log4j.appender.D.File =/JAVA/Code/STUDENT/error.log,这个是日志输出的路径)
### set log levels ###
log4j.rootLogger = INFO,D
###输出到控制台###
log4j.logger.toConsole=debug,stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =%d{yyyy-MM-dd HH\:mm\:ss} [%5p] - %c -%F(%L) -%m%n
### 输出到日志文件 ###
## 其中File 可以采用绝对路径 亦可以采用相对路径 catalina.home 是tomcat目录 如果没有logs文件夹 将会报错 ##
## 更加倾向于将日志文件放在 tomcat的日志目录下${catalina.home}/logs/salesmanb2bError.log ##
## 绝对路径如:e:/salesmanb2bError.log ##
log4j.logger.daily=INFO,D
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
#log4j.appender.D.File = ${catalina.home}/
log4j.appender.D.File =/JAVA/Code/STUDENT/error.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern =%d{yyyy-MM-dd HH\:mm\:ss} [%5p] - %c -%F(%L) -%m%n
##log4j.logger.org.apache.ibatis=debug,stdout
##log4j.logger.java.sql=debug,stdout
上面的文件配置完成后,就双击下图蓝色部分(双击一次就好了,多了可能会在*Mapper.xml文件中生成相同的代码,这时候就需要到*Mapper.xml文件中删除重复的部分) (这个会在sqlmap文件加生成xml文件)
配置tomcat
配置的话到这边就结束了,启动tomcat可以显示hello word。
在StudentMapper中添加@Repository,然后点击StudentMapper这个接口名,然后按alt+enter,选择create test,就会出现如下第二图,然后选择要测试的接口,按next就可以。
接着在test文件夹下就会多出一个java文件然后修改如成如下代码,接着按34行的那个绿色按钮就会进行测试,看是否链接数据库(我这是之前做测试的,测试的是别的函数,根据自己创建好的@Test那个函数测试自己想测试的)其他部分基本一样。
package com.springmvc.dao;
import com.springmvc.entity.Student;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
import static org.junit.Assert.*;
public class StudentMapperTest {
private ApplicationContext applicationContext;
@Autowired
private StudentMapper studentMapper;
@Before
public void setUp() throws Exception{
//加载spring配置文件
applicationContext=new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
//导入需要测试的
studentMapper = applicationContext.getBean(StudentMapper.class);
}
@After
public void tearDown() throws Exception{
}
@Test
public void s_getTotal(){
Student student=studentMapper.selectByPrimaryKey(1);
System.out.println(student.getName());
System.out.println(studentMapper.getTotal());
List list;
list=studentMapper.list(1,1);
System.out.println(list.get(0).getName());
}
}
这是我点击绿色按钮执行的结果:
(我这边只说student的部分内容,只提重要的部分,代码就到下面的github上看,然后关于student相关的代码我会整理出来,在最后面会附带上去,就是那种可以运行的)
如下图,这几个文件是自动生成的。DAO层是与数据库相应的mapper.xml相对应的。
如下面两图,dao层和xml相映射的,在xml文件中添加select,里面的id和Mapper里面的函数名称要是一模一样的。然后xml中的#{param1}是就是Mapper中函数的参数。然后在entity中的Student也要添加相应的函数和变量(在entity中添加的目的是为了到时候从数据库中取出来的数据能够有地方存放,建议是把这两个设置为static,因为都是共同的东西,或者干脆就不要在Student类中添加,等需要的时候再new个对象或着List来存放,其实我把这两个添加进去也没有用到过这两个函数)
service层是把dao层(即数据库那一层)给封装好,用于controller层的调用,那么contorller就不用接触到数据库层的相关代码,相当与,就是体现了模块的独立性吧
service层的接口设计:接口名称自己定义,接口的实现在Impl目录下的StudentServiceImpl
请看下面蓝色部分。@Autowired StudentMapper studentMapper;这个是用于调用Mapper接口,因为StudentMapper不是类,而是接口,所以一定要有@Autowired,不然会报错。接着就像下面的是——deleteByPrimaryKey函数一样,调用接口函数。
Service封装好了数据库部分,controller就可以正常调用Service层的接口了,记住,是调用接口而不是调用Impl里的那个类。@RequestMapping("")是用于和jsp页面进行数据交互用的,后面会说。
这边举例一个函数(listStudent)这个是使用ModelAndView(上面的addStudent使用另一种方法,jsp和后台传值的方法有很多,可以自己百度看看):
RequestMapping中的value的值和listStudent.jsp文件中的(就是第二张图的蓝色部分的值)对应,意思就是说,在jsp页面这个按钮按下后,后台要处理的函数在那个java函数中(就是第一张图的listStudent函数),然后new ModelAndView("listStudent")这个意思是加载视图页面是哪个(就是MVC的概念),这边是函数处理后要跳转的页面(listStudent.jsp)。然后request.getParameter("page.count")是获取jsp文件中参数名为page.count的参数,mav.addObject("page", page);就是将处理好的参数传递给jsp页面,如下第三图的蓝色部分,这个就是和mav.addObject("page", page)中的"page"一样的参数。(意思就是说在jsp页面可以直接使用java中的变量)
在util(一般是用来存放工具的)
中创建Page.java,然后在listStudent函数中使用。
这边的代码是用来分页的,就是分页中显示下面的那个数字,这个和上图相对应,这个只要理解varStatus标签就很好理解下面的代码了。
page.java代码:
package com.springmvc.util;
public class Page {
int start; // 开始数据
int count; // 每一页的数量
int total; // 总共的数据量
public Page(int start, int count) {
super();
this.start = start;
this.count = count;
}
public boolean isHasPreviouse(){
if(start==0)
return false;
return true;
}
public boolean isHasNext(){
if(start==getLast())
return false;
return true;
}
public int getTotalPage(){
int totalPage;
// 假设总数是50,是能够被5整除的,那么就有10页
if (0 == total % count)
totalPage = total /count;
// 假设总数是51,不能够被5整除的,那么就有11页
else
totalPage = total / count + 1;
if(0==totalPage)
totalPage = 1;
return totalPage;
}
public int getLast(){
int last;
// 假设总数是50,是能够被5整除的,那么最后一页的开始就是40
if (0 == total % count)
last = total - count;
// 假设总数是51,不能够被5整除的,那么最后一页的开始就是50
else
last = total - total % count;
last = last<0?0:last;
return last;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
}
这个是登录页面
package com.springmvc.controller;
import com.springmvc.entity.Student;
import com.springmvc.entity.Teacher;
import com.springmvc.service.Impl.StudentServiceImlp;
import com.springmvc.service.Impl.TeacherServiceImpl;
import com.springmvc.service.StudentService;
import com.springmvc.service.TeacherService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
@RequestMapping("")
public class messageController {
@Autowired
private StudentService studentService;
@Autowired
private TeacherService teacherService;
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ModelAndView login1(String uname, String pwd, HttpServletRequest request){
ModelAndView mav = new ModelAndView();
String type;
uname = request.getParameter("loginName");
pwd = request.getParameter("passWord");
type = request.getParameter("loginType");
if(type.equals("管理员")){
if(uname != null && pwd != null && uname.equals("zeng") && pwd.equals("123")){
mav.setViewName("basePage");
return mav;
}
}else if(type.equals("教师")){
int ind=Integer.parseInt(uname);
Teacher teacher = teacherService.t_selectByPrimaryKey(ind);
if(teacher.getPassword().equals(pwd)){
mav.setViewName("basePageTeacher");
mav.addObject("teacher_id",uname);
return mav;
}
}else if(type.equals("学生")){
int ind=Integer.parseInt(uname);
Student student = studentService.s_selectByPrimaryKey(ind);
if(student.getPassword().equals(Integer.parseInt(pwd))){
mav.setViewName("basePageStudent");
mav.addObject("stu_id",uname);
return mav;
}
}else{
mav.setViewName("test");
return mav;
}
return null;
}
@RequestMapping(value = "/login/page")
public String loginPage(String uname, String pwd, HttpServletRequest request){
return "login";
}
@RequestMapping(value = "/register/page")
public String registerPage(){
return "register";
}
@RequestMapping(value = "/test")
public String test(){
return "basePage";
}
}
(这个是学生登录后的主页面)
<%--
Created by IntelliJ IDEA.
User: zeng
Date: 19-6-2
Time: 上午10:06
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
学生管理系统--学生
<%--
Created by IntelliJ IDEA.
User: zeng
Date: 19-5-30
Time: 下午2:28
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%-- 引入JQ和Bootstrap --%>
学生管理页面
<%--
Created by IntelliJ IDEA.
User: zeng
Date: 19-6-2
Time: 上午10:11
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
个人信息
<%-- 引入JQ和Bootstrap --%>
个人信息
<%--
Created by IntelliJ IDEA.
User: zeng
Date: 19-5-31
Time: 上午8:58
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
添加学生
<%-- 引入JQ和Bootstrap --%>
增加学生
package com.springmvc.controller;
import com.springmvc.entity.Course;
import com.springmvc.entity.Score;
import com.springmvc.entity.Student;
import com.springmvc.service.CourseService;
import com.springmvc.service.ScoreService;
import com.springmvc.service.StudentService;
import com.springmvc.util.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
@Controller
@RequestMapping("")
public class StudentController {
@Autowired
private StudentService studentService;
@Autowired
private ScoreService scoreService;
@Autowired
private CourseService courseService;
// 获取分页参数
int start = 0;
int count = 10;
Page page = new Page(start, count);
Integer student_current_id=-1;
@RequestMapping("BaseStudentPage")
public String rtnStuIndexPage(){
return "listStudent";
}
@RequestMapping("StudentInfoPage")
public ModelAndView stuInfo(@RequestParam("student_id")int id){
ModelAndView mav = new ModelAndView("StudentInfo");
if(student_current_id.equals(-1)){
student_current_id=id;
}
Student student = new Student();
student = studentService.s_selectByPrimaryKey(id);
mav.addObject("stu_info",student);
return mav;
}
@RequestMapping("StudentScorePage")
public ModelAndView stuScore(@RequestParam("pagestart")int pagestart,HttpServletRequest request){
ModelAndView mav = new ModelAndView("StudentScore");
try {
start = pagestart;
count = Integer.parseInt(request.getParameter("page.count"));
} catch (Exception e) {
}
page.setStart(start);
List scores = new LinkedList();
scores = scoreService.sc_selectByStudent(student_current_id);
int total = studentService.s_getTotal();
page.setTotal(total-1);
mav.addObject("page", page);
mav.addObject("stu_scores",scores);
return mav;
}
@RequestMapping("StudentCoursePage")
public ModelAndView stuCourse(@RequestParam("student_id")int id){
ModelAndView mav = new ModelAndView("StudentCourse");
if(student_current_id.equals(-1)){
student_current_id=id;
}
Course course = new Course();
course = courseService.c_selectByPrimaryKey(id);
mav.addObject("stu_course",course);
return mav;
}
@RequestMapping("StudentAddCoursePage")
public ModelAndView stuAddCourse(@RequestParam("student_id")int id){
ModelAndView mav = new ModelAndView("addCourse");
if(student_current_id.equals(-1)){
student_current_id=id;
}
Course course = new Course();
course = courseService.c_selectByPrimaryKey(id);
mav.addObject("stu_course",course);
return mav;
}
@RequestMapping(value = "/addStudent", method = {RequestMethod.POST, RequestMethod.GET})
public String addStudent(HttpServletRequest request, HttpServletResponse response) {
Student student = new Student();
int studentID = Integer.parseInt(request.getParameter("student_id"));
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
String sex = request.getParameter("sex");
String address=request.getParameter("address");
int password=Integer.parseInt(request.getParameter("password"));
int idcard = Integer.parseInt(request.getParameter("IDCard"));
int tel = Integer.parseInt(request.getParameter("tel"));
Date birthday = null;
// String 类型按照 yyyy-MM-dd 的格式转换为 java.util.Date 类
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
birthday = simpleDateFormat.parse(request.getParameter("birthday"));
} catch (ParseException e) {
e.printStackTrace();
}
student.setNum(studentID);
student.setName(name);
student.setAge(age);
student.setSex(sex);
student.setBirthday(birthday);
student.setPassword(password);
student.setAddress(address);
student.setIdcard(idcard);
student.setTel(tel);
studentService.s_insert(student);
//为啥不能使用redirect:
return "listStudent";
}
@RequestMapping(value = "/listStudent", method = {RequestMethod.POST, RequestMethod.GET})
public ModelAndView listStudent(@RequestParam("pagestart")int pagestart,HttpServletRequest request) {
ModelAndView mav = new ModelAndView("listStudent");
try {
start = pagestart;
count = Integer.parseInt(request.getParameter("page.count"));
} catch (Exception e) {
}
page.setStart(start);
List students = studentService.s_list(page.getStart(), page.getCount());
int total = studentService.s_getTotal();
page.setTotal(total-1);
mav.addObject("page", page);
mav.addObject("students", students);
return mav;
}
@RequestMapping("/deleteStudent")
public String deleteStudent(@RequestParam("del_id")int id) {
studentService.s_deleteByPrimaryKey(id);
return "listStudent";
}
@RequestMapping("/editStudent")
public ModelAndView editStudent(@RequestParam("edit_id")int id) {
ModelAndView mav = new ModelAndView("editStudent");
Student student = studentService.s_selectByPrimaryKey(id);
mav.addObject("update_student", student);
return mav;
}
@RequestMapping(value = "/updateStudent", method = {RequestMethod.POST, RequestMethod.GET})
public String updateStudent(HttpServletRequest request) {
Student student=new Student();
String tel = request.getParameter("tel");
String name = request.getParameter("name");
String studentID = request.getParameter("student_id");
String age = request.getParameter("age");
String sex = request.getParameter("sex");
String pass = request.getParameter("password");
String idcard =request.getParameter("IDCard");
String address =request.getParameter("address");
Date birthday = null;
// String 类型按照 yyyy-MM-dd 的格式转换为 java.util.Date 类
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
birthday = simpleDateFormat.parse(request.getParameter("birthday"));
} catch (ParseException e) {
e.printStackTrace();
}
Integer i_age=Integer.parseInt(age);
student.setName(name);
student.setAge(i_age);
student.setNum(Integer.parseInt(studentID));
student.setSex(sex);
student.setBirthday(birthday);
student.setPassword(Integer.parseInt(pass));
student.setTel(Integer.parseInt(tel));
student.setIdcard(Integer.parseInt(idcard));
student.setAddress(address);
studentService.s_updateByPrimaryKeySelective(student);
return "listStudent";
}
@RequestMapping(value = "/addStudentPage", method = {RequestMethod.POST, RequestMethod.GET})
public String addStudentPage(){
return "addStudent";
}
@RequestMapping(value = "/searchStudent", method = {RequestMethod.POST, RequestMethod.GET})
public ModelAndView searchStudent(HttpServletRequest request) {
ModelAndView mav = new ModelAndView("listStudent");
int ind=Integer.parseInt(request.getParameter("searchStudent"));
List students = new LinkedList();
Student student=studentService.s_selectByPrimaryKey(ind);
students.add(student);
mav.addObject("students", students);
return mav;
}
}
https://www.cnblogs.com/toutou/p/ssm_spring.html https://www.jianshu.com/p/6a594fbea51d h
ttps://www.cnblogs.com/mumudechengzhang/p/7682361.html
https://www.cnblogs.com/Samuel-Leung/p/10691158.html
https://blog.csdn.net/jianghao233/article/details/81879370
https://github.com/Iconzjy/SSM_JavaEE_FinalReport_Student