项目的github:https://github.com/zjm-cityboy/sims-GitHub.git
可以的话点个小星星嘿嘿
1.项目介绍
1.1.项目环境配置
操作系统:Windows10
IntelliJ IDEA:2020.3
JDK:1.8.0_271
Tomcat:8.0.35
MySQL:8.0.22
mysql-connector-java(MySQL驱动):5.1.9
Maven:3.8.1
spring依赖版本:5.2.5.RELEASE
MyBatis:3.5.1
Druid(阿里巴巴数据库连接池):1.1.12
1.2.项目需求分析以及流程图
本项目是基于SSM框架开发的学生信息管理系统,本学生信息管理系统分为
用户模块,用户模块分为:用户登录模块、用户注册模块、用户注销模块。
学生模块分为:学生信息展示板块、学生信息修改板块、学生信息添加板块、学生信息删除板块、学生信息查询模块。
用户登录模块用于用户登录然后跳转到学生信息展示页面
用户注册模块用于用户注册,添加用户信息,以便后面登录。
用户注销模块用于退出系统注销用户,通过初始化session完成。
学生信息展示模块用前端页面输出展示学生信息,并在每一跳学生信息里有增删改查按钮的跳转链接入口。
学生信息修改板块运用了信息回显示的技术,通过id查找到符合条件的学生,再将数据写入修改的jsp页面中,以保存原来的学生信息,更新学生信息后展示页面。
学生信息添加板块,将学生信息添加到数据库然后在转到展示页面中展示出来。
学生信息删除板块则是将信息从数据库中抹除,然后再更新展示页面。
以上功能都是通过ssm框架实现的,基本流程都是在jsp页面中发出请求,然后DispatcherServlet(前端控制器)接收请求交给Controller(后端控制器)处理,Controller处理完毕后,有交给DispatcherServlet,最后返回处理结果给jsp页面。
项目流程图如下。
2.实现步骤
2.1.项目前期准备工作
2.1.1.建立数据库
本系统的数据库是一个名为sims(Student Information System)的数据库,然后有一个名为user的表和一个名为student的表。
user表是用户信息表主要存储登录用户的id、账号和密码,其中用户id为主键,自增。结构如下表
student表主要存储了学生的学号、姓名、性别、年级、专业信息,其中学号为主键。结构如下表所示
数据库创建过程如下:
1.创建数据库:
CREATE DATABASE sims;
2.创建user表:
3.创建student表:
4.向user表和student表中插入数据
命令如下:
插入的数据如下:
数据库的创建就完成了。
2.1.2.项目的部署
2.1.2.1.创建项目
在file中选着new然后再点击project,新建一个项目
然后根据下图的顺序依次创建一个maven webapp项目点击next
起一个名为sims的项目名称,然后点击next,这样一个web项目就创建完成了
在main目录中new一个Diertory根据提示创建java、testresource、test等源目录,创建好的目录如下:
2.1.2.2.Maven的pom.xml文件的部署
本次项目开发我使用maven来管理jar包,这样可以防止一些jar包冲突或者依赖的缺失导致的错误。更重要的是不用我们自己辛苦的去下载jar包,直接从maven的pom.xml中引入依赖即可。下面我来说一下本次项目在Maven中引入的依赖。
servlet的依赖:因为ssm中完成web项目,其底层还是基于servlet实现的,因此需要导入servlet相关的依赖来实现映射等等功能。
jsp 依赖:主要用于前端页面的功能的实现,例如jstl、el可以实现本项目数据展示和修改中信息回显。
springmvc的依赖与事务的依赖:本项目的核心依赖,用于实现spring的功能,spring的全部依赖都整合在这里。事务管理主要实现AOP等等。
mybatis 和 spring 整合的依赖:用于操作数据库,sprinh整合mybatis的依赖包可以让spring管理mybatis。
mysql 驱动依赖:用于连接数据库与mysql
druid数据库连接池依赖:阿里巴巴的druid连接池依赖,用于连接数据库
2.1.2.3.Tomcat的部署
打开idea软件在运行编译的右边点击向下箭头,然后点击Edit Configuration
进入界面后点击+号,选择Tomcat Srever 然后选择Local创建Tomcat服务器,
然后按照下图顺序部署Tomcat
最后修改Application context里的内容,把他改成你想要的名字。
运行Tomcat,测试是否配置成功。如下图所示tomcat配置成功。
2.1.2.4.创建项目所需要的包和类
在java中右键点击new然后选中package
然后输入自己想要的包名
然后在zjm包下再创建我们项目中需要的包,对应的包下再创建对应的类
controller包:用于后端,其中StudentController负责学生信息增删改查的逻辑处理.
interceptor包:用于拦截,主要用于登录的安全性。
dao包:操作数据库UserMapper与StudentMapper类用于编写方法和其对应的xml用于编写实现方法sql语句。
Pojo包:用于存放实体类,Student是学生类,User类是用户类。
Service与serviceimpl包:存放接口和实现类,用于实现用户登录注册和学生信息操作功能的接口其实现接口中方法的实现类。
如下图:
2.1.2.5.编写配置文件
因为我们是基于spring框架开发的系统,为了解耦,项目中大多数的操作都是有spring框架完成的,而spring框架是基于各种配置文件完成操作的。因此能够正确的编写配置文件是项目开始最重要的第一步。
要使用SSM,我们需要在resource中编写如下配置文件和WEB-INF下配置web.xml文件,为了方便管理我把们分开文件夹来放置,下面将来一一解释这些文件以及里面的内容的作用。
首先是mybatis.xml配置文件,我把它放在了mybatis文件夹中,其内容如下,开头的部分都是约束的声明,相当于定义使用规则。主要定义了pojo类的别名这样在mapper.xml中我们就可以用student代替com.zjm.pojo.Student了,然后用于注册mapper文件
<?xml version="1.0" encoding="UTF-8" ?><configuration>
<!-- 批量定义别名,批量指定很简单,只要指定包名即可,之后程序会为包下的所有类都自动加上别名,
其定义别名的规范就是对应包装类的类名首字母变为小写 设置了这里就可以使用student了 -->
<typeAliases>
<package name="com.zjm.pojo"/>
</typeAliases>
<!-- 注册 mapper.xml 文件 -->
<mappers>
<mapper class="com.zjm.dao.StudentMapper"/>
<mapper class="com.zjm.dao.UserMapper"/>
</mappers>
</configuration>
然后就是spring的配置文件,也是本系统最核心的配置文件,其实上图的spring文件都可以放在一起,不过为了后续方便修改和管理所以分级的方式来写。为了防止代码量过多,因此前面的约束内容就只展示一次。
Spring-dao.xml中主要负责数据库这部分,先引入我们properties文件,里面是数据库的账号密码以及驱动信息和数据库的url.
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/sims
jdbc.user=root
jdbc.password=
然后配置阿里巴巴的druid连接池相关的信息连接数据库。然后注册sqlSession,主要是注入dataSource和绑定mybatis.xml配置文件和配置阿里巴巴Druid数据库连接池的。最后是动态代理,再就是把mybatis和sqlSession交给spring代理。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--1.引入属性配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--2.配置阿里的Druid数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--3.注册sqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- dataSource 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 绑定 MyBatis 全局配置文件: mybatis/mybatis.xml -->
<property name="configLocation" value="classpath:mybatis/mybatis.xml"/>
</bean>
<!--4.动态代理对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入 sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="com.zjm.dao"/>
</bean>
</beans>
spring-service.xml中主要定义了组件扫描器和注入了数据库连接池,因为在service中我们肯定需要用到@Autowire为定义在serviceimpl类中的mapper注入值,因此我们也需要配置事务管理器。
<!-- 1.扫描service相关的bean -->
<context:component-scan base-package="com.zjm.service.impl"/>
<!-- 2.配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 3.注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
</bean>
springmvc主要配置了controller里内容例如声明在controller扫描ReqeustMapping注解,还配置了视图解析器给Controller中jsp名称中加上前后缀,配置拦截器增强了系统的安全性。
<!-- 1.扫描web相关的注解 -->
<context:component-scan base-package="com.zjm.controller"/>
<!-- 配置SpringMVC -->
<!-- 2.开启 SpringMVC 注解驱动 -->
<mvc:annotation-driven/>
<!-- 3.静态资源默认 servlet 配置-->
<mvc:default-servlet-handler/>
<!-- 4.配置 jsp 显示 ViewResolver 视图解析器,给名字加上前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
<!--配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截所有请求 -->
<mvc:mapping path="/**"/>
<!--拦截器类所在的位置 -->
<bean class="com.zjm.interceptor.CheckUserInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
</bean>
applicationContext.xml中主要是整合了以上三个spring配置文件,相当于配置文件分层管理,在web.xml中只需引入这个文件就相当于引入了三个配置文件非常方便.
<!-- 整合配置文件 导入 spring-dao.xml 和 spring-service.xml -->
<import resource="classpath:spring/spring-*.xml"/>
<!-- 整合配置文件 导入 spring-mvc.xml-->
<import resource="classpath:spring/springmvc.xml"/>
这些本是在代码中实现的繁杂内容,现在都由这个配置文件一一实现,这就是spring框架的强大之处。
web.xml文件主要声明了欢迎界面,即启动服务器时先访问到登录页面的jsp。然后配置DispatcherServlet(前端控制器)里面加载了我们编写的spring配置文件,前端控制器负责接收用户请求和返回处理结果,在ssm框架中是非常重要的一环。此外还设置了encodingFilter设置编码格式,防止中文乱码。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--1.定义首先要访问的页面,即登录页面-->
<welcome-file-list>
<welcome-file>/WEB-INF/jsp/login.jsp</welcome-file>
</welcome-file-list>
<!--2.DispatcherServlet-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 注意:这里加载的是总的配置文件 -->
<!-- 将所有的配置文件导入 -->
<param-value>classpath:spring/applicationContext.xml</param-value>
</init-param>
<!--当值大于等于 0 时,表示容器在启动时就加载并初始化这个 servlet,数值越小,
该Servlet的优先级就越高,其被创建的也就越早;-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--3.encodingFilter,防止中文乱码-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
到这里SSM框架就配置完成了.
2.2.功能实现
在完成功能前先做一点简单的准备.
1.在StudentController和UserController加上@Controller注解,让spring知道一个后端控制器类并为其创建对象.注解@RequestMapping 在类上定义相当于更改web根目录,这里改为student,到时后访问时和localhost:8081/sims/user/xxx和localhost:8081/sims/student/xxx来访问定义的Controller了
2.在UserMapper.xml和StudentMapper.xml添加namespace,声明StudentMapper的全限定名称,因为这样StudentMapper里的方法名才可以和StudentMapper.xml中的id对应上sql语句得以调用。
3.创建User类和Student类,并为其创建getter和setter方法(这里不一一展示)
4.实现类中我们需要用@Service为impl类创建service对象,然后还要引入Mapper对象并用@Autowire从dao的Mapper为Mapper类注入值,因为idea不推介使用用autowired注入,所以改成了构造器注入。
5.在WEB-INF下创建一个jsp目录,在这里编写jsp文件,因为这样springmvc.xml中视图解析器才自动加上前后缀.
2.2.1.用户注册功能实现
1.首先在UserMapper中定义好加入信息的方法.
2.然后再去UserMapper.xml中编写语句
3.然后在service包的接口中写入注册方法和在service的impl类实现接口中定义的方法
4.编写controller,其中toAddUser用于跳转到register.jsp页面上,AddUser中通过password和passwordAgain参数直接获取表单提交与id同名的数据,进行比对,如果两次输入的密码不一致会提示错误信息.然后就是通过账号密码查找注册的用户是否已存在的,然后用if语句判断,如果用户已经存在就提示错误信息.最后这两项都通过,就成功把数据添加到数据库中并跳转到登录页面.
@RequestMapping("/toAddUser")
public String toAddUser() {
// 跳转到register.jsp 页面
return "register";
}
@RequestMapping("/AddUser")
public String addUser(User user, String password, String passwordAgain, Model model) {
//注册时输入两次密码不一致
if (!password.equals(passwordAgain)) {
model.addAttribute("pattern_error", "您输入的两次密码不一致请重新输入");
return "register";
}
//用户信息已经存在
User u = userService.queryUserByUsernameAndPassword(user);
if (u != null) {
model.addAttribute("exist_error","用户已存在");
return "register";
}
userService.addUser(user);
return "login";
}
5.Jsp核心部分
2.2.2.用户登录功能实现
1.前面的步骤都同上,这里就不重复描述了,操作如下图
UserMapper
UserMapper.xml
UserService
UserServiceImpl
2.下面重点来说一个controller页面,就是调用mapper中的查询语句,然后判断该用户是否在,不存在则为空,表示账号密码有错误.存在则不为空,表示账号密码正确,然后跳转到学生展示页面.
@RequestMapping("/login")
public String login(User user, Model model) {
if (userService.queryUserByUsernameAndPassword(user) == null) {
model.addAttribute("login_error", "账号或者密码有误请重新输入");
} else {
return "studentInfo";
}
return "login";
}
3.Jsp核心部分
2.2.3.用户注销以及登录拦截功能
拦截与注销的功能需用通过拦截器来完成,在上面的配置文件中我们配置了拦截器的拦截范围和位置,下面我们要编写一个CheckUserInterceptor类来实现拦截器的接口,实现我们的拦截和注销功能。编写这个类需要实现接口中三个方法。分别是preHandle,postHandle和afterCompletion。preHandle是在执行Controller方法之前执行的。postHandle是在Controller执行时return执行前(即视图更新前)进行的,用于视图修改等操作。afterCompletion时在Controller中return执行完毕后(即视图更新完毕)进行的,用于。
由于这是针对登录的拦截,所以很多功能都是由preHandle完成,因此这里就只展示preHandle核心代码,功能如注释所示。
//检测用户身份的拦截器
//拦截目标对象:springmvc controller
public class CheckUserInterceptor implements HandlerInterceptor {
// 该方法是在进入handler之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 获取session,
HttpSession session = request.getSession();
// 获取资源的路径
String path = request.getRequestURI();
// 获取login的资源路径,再使用idexof函数,查找是否有login这个字符串(如果无就返回-1),因此只要其不等于-1就证明有。
// 然后对login不进行拦截,防止陷入登录死循环
if (path.indexOf("login") != -1) {
System.out.println(path);
System.out.println(path.indexOf("login") != -1);
System.out.println(session.getAttribute("user"));
// 返回true:可以进入到handler中
// 返回false:不放行
return true;
}
//获取Register的资源路径,对注册页面进行放行,防止注册页面请求被拦截,同上
if (path.indexOf("Register") != -1) {
System.out.println(path);
System.out.println(path.indexOf("Register") != -1);
return true;
}
//注销的时候或者关闭服务器的时候session会注销,因此为了防止直接输入url进入界面需要判断user的session 是否还存在
if (session.getAttribute("user") != null) {
System.out.println(path);
System.out.println(session.getAttribute("user"));
return true;
} else {
// 如果上述条件都不符合就重定向回登录页面
response.sendRedirect(request.getContextPath() + "/login.jsp");
return false;
}
}
- 用户注销的controller,初始化了session,防止用户注销后还可以访问学生页面,和恶意跳过登录访问学生页面。
@RequestMapping("/logout")
public String doLogout(HttpSession session) {
// 销毁session
session.invalidate();
return "login";
}
2.2.4.学生信息列表展示功能实现
1.要实现展示功能首先我们需要从数据库部分做起,首先在StudentMapper中定义好查询的方法.
2.然后再去StudentMapper.xml编写好查询语句.
3.然后在service包的接口中写入查询方法
4.在service的impl类实现接口中定义的方法
5.编写controller,实现展示学生信息的逻辑,定义了@RequestMapping(“/studentInfo”),表示跳转student/studentInfo到相关的请求都由list这个Controller处理.先通过list集合获取所有学生信息,然后加入到model中,再跳转到studentInfo.jsp页面,刷新数据
// 查询全部学生信息
//ModeAndView用于视图和数据之间的操作model.addAttribute("list", list);就是把list加入model中,后续可以通过jsp(view)来提取数据
@RequestMapping("/studentInfo")
public String list(Model model) {
List<Student> list = studentService.queryAllStudent();
//相当于request.setAttribute
model.addAttribute("list", list);
//跳转到 studentInfo 页面
return "studentInfo";
}
6.编写学生信息展示列表jsp页面,下面是核心展示学生信息的核心页面.通过el表达式与jstl获取controller中,其中${requestScope.get(‘list’)} 等价于 request.getAttribute(“list”),一般是从服务器传递结果到页面,在页面中取出服务器端保存的值,这个list值别名为student,然后调用方法输出内容.这样学生信息展示就完成了.
2.2.5.学生信息添加功能实现
1.前面的步骤都同上,这里就不重复描述了
2.我们重点说一下controller添加学生的逻辑实现,首先点击添加学生连接后执行toAddStudent()方法,该方法用于跳转到添加学生信息的页面.然后后面是管理员写好信息按添加按钮后调用addStudent()方法, 其调用studentService里的addStudent(添加学生信息)方法插入学生信息最后重定向到studentInfo,更新视图,这样学生的添加功能就完成了.
// 添加学生信息,跳转页面
@RequestMapping("/toAddStudent")
public String toAddStudent() {
// 跳转到 studentadd.jsp 页面
return "studentadd";
}
//添加学生信息的逻辑操作
@RequestMapping("/addStudent")
public String addStudent(Student student) {
//1.调用studentService里的addStudent(添加学生信息)方法
studentService.addStudent(student);
//重定向到studentInfo,更新视图
return "redirect:/student/studentInfo";
}
2.2.6.学生信息删除功能实现
1.前面步骤的操作重复不多说
2.学生删除controller的逻辑实现,因为跳转页面时student仍然还是list,所以其student.getId值时可以对应列表上每个学生的id的,通过jsp中student/del/${student.getId()}和@RequestMapping(“/del/{id}”)以及(@PathVariable(“id”) String id)可以把id值传到controller方法中,再调用serviceimpl里的deleteStudentById(id)就可以实现对列表里学生数据的抹除了.
//删除学生信息
@RequestMapping("/del/{id}")
//@PathVariable 接收请求路径中占位符的值
public String deleteStudent(@PathVariable("id") String id) {
studentService.deleteStudentById(id);
// 重定向到 /student/studentInfo.jsp 页面,更新视图。
return "redirect:/student/studentInfo";
}
2.2.7.学生信息查询功能实现
1.前面步骤的操作重复不多说
2.根据名字查询学生信息的Controller如下,逻辑在注释中,这里就不赘述了
//根据学生姓名查询学生信息
@RequestMapping("/queryStudent")
public String queryStudent(String queryStudentName, Model model) {
//1.获取学生名字,根据<form>中<input name="queryStudentName">提交的信息
Student student = studentService.queryStudentByName(queryStudentName);
//2.创建一个Student类型的List集合
List<Student> list = new ArrayList<Student>();
//3.把数据库查询出来的数据传入list集合中
list.add(student);
//4.判断,如果student为空list则为全部学生,相当于返回主页面。
if (student == null) {
list = studentService.queryAllStudent();
model.addAttribute("error", "未查到");
}
//5.如果student不为空,则证明查询到了消息。更新list信息。
model.addAttribute("list", list);
//6.跳转到studentInfo中
return "studentInfo";
}
2.2.8.学生信息的修改功能实现
1.前面步骤的操作如下图,因为修改功能需要先通过id查找到对应的学生,因此这里需要用到两个sql语句因此在mapper中要定义两个方法.
2.修改学生信息Controller的逻辑实现如下toUpdateStudent负责通过?id={student.getId()},获取的id值 ,然后把student 加入 model 中, model.addAttribute等同于request.setAttribute和跳转到studentmodify页面.
updateStudent()从model.addAttribute(“student”, student)获取student的数据,通过其中id找出修改后的信息,然后更新调用model.addAttribute(“student”, student);更新student对象否则下次更新回显示之前的,最后重定向到/student/studentInfo.jsp 页面.
// 修改学生信息
// 跳转页面
@RequestMapping("/toUpdateStudent")
public String toUpdateStudent(Model model, String id) {
// 获取的id值,通过?id={student.getId()},因为其被${requestScope.get('list')}包含,所以可以获取数据
Student student = studentService.queryStudentById(id);
// 将获取到的 student 加入 model 中, model.addAttribute等同于request.setAttribute
model.addAttribute("student", student);
// 跳转到 studentmodify.jsp 页面
return "studentmodify";
}
//更新学生信息
@RequestMapping("/updateStudent")
public String updateStudent(Model model, Student student) {
// 因为已经跳转到studentmodify页面中,所以可以直接从model.addAttribute("student", student)获取student的数据。
studentService.updateStudent(student);
//通过id找出修改后的信息
student = studentService.queryStudentById(student.getId());
//然后更新student对象,否则下次更新回显示之前的
model.addAttribute("student", student);
// 重定向到/student/studentInfo.jsp 页面
return "redirect:/student/studentInfo";
}
3.成果展示
3.1.用户注册功能展示
注册用户输入的密码不一致提示错误。
注册一个已存在的用户的错误提示
注册一个名为admin,密码为123的用户
3.2.用户登录功能展示
登录刚刚注册的admin用户,先密码输错,提示错误信息。
输入正确的密码,跳转到学生展示页面
3.3.学生信息列表展示
首先来到学生信息展示列表,点击查询所有学生信息
3.4.添加学生信息
在学生信息展示列表中点击添加学生信息,跳转到添加页面
添加一个 学号:201911671337,名字:邹嘉明,性别:男,年级:大三, 专业:信息系统与信息管理的学生。
点击添加,可以看到信息添加成果
3.5.更改学生信息
点击学生张三右边的修改连接,去到修改按键,可以看到张三学生的信息已经写上去了。
然后我们把张三同学的名字改成张三丰,年级改为大四,专业改为心理学。
点击修改钮,页面跳回展示页面,修改成功
3.6.删除学生信息
删除杰哥同学的信息
对比上图杰哥同学已经被删除。
3.7.查询学生信息
查询邹嘉明同学的信息
点击查询,邹嘉明同学的信息以及展示出来了
4.遇到的问题及解决方案
问题1:在注册页面点击注册按钮提示如下错误
原因:错误提示在Mapper接口中找不到adduser方法,后面发现是xml文件中的id是adduser而接口方法是addUser,对应不上
解决方法:把xml文件中的id换成addUser即可.
问题2:执行更新功能时遇到的错误,错误提示的时sql语句有错
原因:然后就去sql语句里看了一下,发现把#写道{}里面了,导致无法识别出id
解决方法:修改过后,查询功能就正常了
问题3:跳到修改页面的报错,提示不存在这种方法
原因:看了jsp页面原来是方法引用错了,要使用get方法
StudentMapper.xml文件中student打错了达成studnt,导致识别不出表
解决方法:后面修改成student.getGrade解决了.因为刚刚这样相当于写错方法,识别getter方法,得不到值
问题4:拦截回登录页面时404报错
原因:一开始使用重定向回response.sendRedirect(request.getContextPath() + “/login.jsp”);应该是路径有问题,试了很多方法都没有用。
解决方法:使用转发和绝对路径进行页面跳转。
问题5:登录过后点击查询学生信息然后回到登录页面
原因:没有在登录成功后加入session.setAttribute(“user”, user);导致CheckUserInterceptor中的session.getAttribute(“user”)为空return了一个false。
解决方法:在userController的login方法中,账号密码验证通过之后把user加入session。
问题6:点击注册时回到登录页面
原因:拦截器拦截了注册的请求,导致从新回到登录页面。
解决方法:放行注册的请求,通过path.inedx获取路径是否存在Register的字符串,如果有就返回true放行请求交给controller处理,这样就可以进入注册页面了。