开发基于Mysql+Servlet+JSP的作业管理系统(四)
开发基于Mysql+Servlet+JSP的作业管理系统(四)
一、构建Spring MVC项目
1.创建maven项目
(1)创建新项目,如图:
(2)文件命名、选择路径:
2.添加Spring MVC框架
(1)项目右键→ Add Framework Support
(2)添加 Spring MVC 框架
(3)将 lib 文件夹移至 WEB-INF 文件夹下:
(4)将 lib 文件添加到依赖中:
二、配置Tomcat
(1) Run → Edit Configuration
三、移入原项目部分文件
(1) main 右键 → new → Directory 分别新建 java、resources 文件夹:
(2)分别将 Jdbc.package 及 Model.package 移至 java 文件夹下;
将 hikari.properties 移至 resources 文件夹下;
将 css、fonts、images、js 移至 webapp 文件夹下;
在 java 文件夹下 新建 Controller.package,文件目录如下:
四、修改.xml文件(代码中包含注释)
1.pom.xml
在 pom.xml 文件中添加依赖(分别用于 Servlet 相关、数据库连接池、el表达式、springframework 相关 jar 包):
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!--数据库连接池-->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.4.2</version>
</dependency>
<!--https://mvnrepository.com/artifact/org.slf4j/slf4j-api-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.22</version>
</dependency>
<!--https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.22</version>
</dependency>
<!--https://mvnrepository.com/artifact/org.slf4j/slf4j-simple-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.22</version>
</dependency>
<!--el表达式-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations-java5</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<!--springframework 相关 jar 包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
2.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Archetype Created Web Application</display-name>
<!--指定运行后出现界面-->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--配置SpringMVC DispatcherServlet-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--配置dispatcher.xml作为mvc的配置文件-->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--把applicationContext.xml加入到配置文件中-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--过滤器,防止前端向后端传输数据出现中文乱码-->
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--base-package由目录结构决定-->
<context:component-scan base-package="java"/>
</beans>
4.dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--此文件负责整个mvc中的配置-->
<!--启用spring的一些annotation -->
<context:annotation-config/>
<!-- 配置注解驱动 可以将request参数与绑定到controller参数上 -->
<mvc:annotation-driven/>
<!--静态资源映射-->
<!--本项目把静态资源放在了webapp目录下,资源映射如下-->
<mvc:resources mapping="/css/**" location="css/"/>
<mvc:resources mapping="/fonts/**" location="fonts/"/>
<mvc:resources mapping="/images/**" location="images/"/>
<mvc:resources mapping="/js/**" location="js/"/>
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP-->
<!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/><!--设置JSP文件的目录位置-->
<property name="suffix" value=".jsp"/>
<property name="exposeContextBeansAsAttributes" value="true"/>
</bean>
<!--自动扫描装配 (base-package由包名决定-->
<context:component-scan base-package="Controller"/>
</beans>
五、通过Controller实现前后端交互及跳转
1.jsp 向 controller 传递数据
(1) 通过 form 表单(以注册为例):
index.jsp
<!-- index 为对应 controller 的注释中的 value 值 -->
<form action="index" method="get">
<div class="form-group has-feedback feedback-left">
<input type="text" placeholder="请输入您的用户名" class="form-control" name="login_name" id="login_name" />
</div>
<div class="form-group has-feedback feedback-left">
<input type="text" placeholder="请输入您的身份(老师/学生)" class="form-control" id="login_identity" name="login_identity" />
</div>
<div class="form-group">
<a class="btn btn-w-xl btn-default" type="button" href="register.jsp">注册</a>
<input class="btn btn-w-xl btn-primary" type="submit" value="登录" />
</div>
</form>
IndexController.class
@Controller
public class IndexController {
@RequestMapping(value = "index")
public String Login(@RequestParam("login_name") String login_name,
@RequestParam("login_identity") String login_identity,
Model model,
HttpServletRequest request) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
if(login_identity.equals("学生")) {
request.getSession().setAttribute("student_name", login_name);
Student student = (Student) applicationContext.getBean("student");
student.setStudent_name(login_name);
StudentJdbc studentJdbc = (StudentJdbc) applicationContext.getBean("student_jdbc");
List<Homework> homework_list = studentJdbc.QueryHomework(student);
request.setAttribute("homework_list", homework_list);
return "student_submit";
}else {
request.getSession().setAttribute("teacher_name", login_name);
Teacher teacher = (Teacher) applicationContext.getBean("teacher");
teacher.setTeacher_name(login_name);
TeacherJdbc teacherJdbc = (TeacherJdbc) applicationContext.getBean("teacher_jdbc");
List<Homework> homework_list = teacherJdbc.QueryHomework(teacher);
model.addAttribute("homework_list", homework_list);
return "teacher_homework";
}
}
}
(2)通过 url 传值(以查看已提交名单为例):
teacher_homework.jsp
<a type="button" class="btn btn-info btn-xs" href="homework_submit_list?homework_title=${list.homework_title}">查看已提交名单</a>
HomeworkSubmitListController.class
@Controller
public class HomeworkSubmitListController {
@RequestMapping(value = "homework_submit_list")
public String getSubmitList(@RequestParam("homework_title") String homework_title,
Model model,
HttpServletRequest request) {
String teacher_name = (String) request.getSession().getAttribute("teacher_name");
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Teacher teacher = (Teacher) applicationContext.getBean("teacher");
teacher.setTeacher_name(teacher_name);
TeacherJdbc teacherJdbc = (TeacherJdbc) applicationContext.getBean("teacher_jdbc");
List<Submit> submit_list = teacherJdbc.QuerySubmit(homework_title, teacher);
model.addAttribute("submit_list", submit_list);
return "homework_student";
}
}
2.controller 向 jsp 传递数据
controller 通过 return “jsp名称” 直接跳转到相应 jsp 界面,并返回数据
以由老师作业列表跳转至相应作业已完成名单为例:
HomeworkSubmitListController.class
@Controller
public class HomeworkSubmitListController {
@RequestMapping(value = "homework_submit_list")
public String getSubmitList(@RequestParam("homework_title") String homework_title,
Model model,
HttpServletRequest request) {
String teacher_name = (String) request.getSession().getAttribute("teacher_name");
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Teacher teacher = (Teacher) applicationContext.getBean("teacher");
teacher.setTeacher_name(teacher_name);
TeacherJdbc teacherJdbc = (TeacherJdbc) applicationContext.getBean("teacher_jdbc");
List<Submit> submit_list = teacherJdbc.QuerySubmit(homework_title, teacher);
model.addAttribute("submit_list", submit_list);
return "homework_student";
}
}
homework_student.jsp
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="utf-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:forEach items="${submit_list}" var="list" varStatus="status">
<tr style="text-align: center">
<th scope="row" style="text-align: center">${status.count}</th>
<td>${list.student_name}</td>
<td>
<a type="submit" class="btn btn-primary btn-xs" data-toggle="modal" href="homework_content?homework_title=${list.homework_title}&student_name=${list.student_name}">查看作业</a>
</td>
</tr>
</c:forEach>
六、使用Spring IoC管理实例
(1)将 WEB-INF 文件夹下的 applicationContext.xml 复制粘贴到 resources 文件夹下。
(2)将 main/java/Model 文件夹重命名为 Bean。
(3)在 applicationContext.xml 文件中添加如下内容:
<bean id="homework" class="Bean.Homework" />
<bean id="student" class="Bean.Student" />
<bean id="submit" class="Bean.Submit" />
<bean id="teach" class="Bean.Teach" />
<bean id="teacher" class="Bean.Teacher" />
(4)以 Student.class 为例,通过 bean 创建一个实例,并调用其中函数:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
<!-- getBean("student"), student 与 Student类的 id 一致 -->
Student student = (Student) applicationContext.getBean("student");
student.setStudent_name(register_name);
七、JDBC操作类注册为bean
在 applicationContext.xml 文件中添加如下内容,通过与步骤六同样的方法使用 JDBC 操作类:
<bean id="student_jdbc" class="Jdbc.StudentJdbc" />
<bean id="teacher_jdbc" class="Jdbc.TeacherJdbc" />