文章目录
作业要求
- 用户为学生和老师
- 用户可以注册登录
- 学生可以查看作业、提交作业、更新作业
- 老师可以查看学生信息、查看学生作业、查看已发布作业、发布作业、添加学生
使用工具
- 软件:IDEA
- 语言:Java
项目启动
创建项目
新建项目
新建步骤如下图所示:
引入依赖
以下是项目会用到的一些依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
创建webapp文件
根据下图提示进行操作,手动添加webapp目录:
随后在webapp文件夹下创建WEB-INF文件夹,该文件夹下创建web.xml文件,内容为:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<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_4_0.xsd"
version="4.0">
</web-app>
配置文件
在application.properties文件中设置数据库连接信息和mybatis配置信息以及JSP文件的位置
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/javaee?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username = root
spring.datasource.password = 123456
mybatis.type-aliases-package=com.example.demo.model
mybatis.config-locations=classpath:mybatis-config.xml
mybatis.mapper-locations=classpath:mapper/*.xml
spring.mvc.view.prefix=/WEB-INF/views/
mybatis-config.xml内容如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- mybatis全局设置 -->
<settings>
<!--使用数据库自增id-->
<setting name="useGeneratedKeys" value="true" />
<setting name="useColumnLabel" value="true" />
<!-- 开启驼峰命名规范-->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
项目结构
设置完成之后,项目的目录结构如下:
数据库设计
Teacher
Student
Homework
StudentHomework
Mybatis整合
以Homework为例
首先是Model实体层,使用lombok减少get()、set()方法的编写。
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class Homework {
private int homework_id;
private String homework_title;
}
其次是mapper层
import com.example.demo.model.Homework;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface HomeworkMapper{
String getTitlebyId(int homework_id);
void save(Homework h);
List<Homework> findAll();
Homework findById(int homeworkId);
}
mapper对应SQL语句在对应mapper.xml文件中
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.HomeworkMapper">
<insert id="save" parameterType="Homework">
insert into homework (homework_id,homework_title) value (#{homework_id}, #{homework_title})
</insert>
<select id="findById" resultType="com.example.demo.model.Homework">
select * from homework where homework_id = #{homeworkId}
</select>
<select id="findAll" resultType="com.example.demo.model.Homework">
select * from homework
</select>
</mapper>
service实现层
package com.example.demo.service;
import com.example.demo.mapper.HomeworkMapper;
import com.example.demo.model.Homework;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class HomeworkService {
@Autowired
final HomeworkMapper homeworkMapper;
public HomeworkService(HomeworkMapper homeworkMapper){
this.homeworkMapper = homeworkMapper;
}
//得到全部已发布的作业
public List<Homework> selectAllHomework() {
return homeworkMapper.findAll();
}
//向数据库中添加老师新发布的作业
public boolean addHomework(Homework h) {
try{
//判断该作业是否存在
boolean ishomework = false;
List<Homework> hlist = homeworkMapper.findAll();
for (Homework ho : hlist) {
if (ho.getHomework_id() == h.getHomework_id()) {
ishomework = true;
break;
}
}
if(ishomework){
return false;
}else{
homeworkMapper.save(h);
return true;
}
}catch (Exception e){
e.printStackTrace();
return false;
}
}
//通过作业编号得到作业标题
public String getTitlebyId(int homeworkId) {
Homework homework=homeworkMapper.findById(homeworkId);
return homework.getHomework_title();
}
}
Controller连接前端进行调用
package com.example.demo.controller;
import com.example.demo.model.Homework;
import com.example.demo.service.HomeworkService;
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.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@Controller
public class HomeworkController {
@Autowired
private final HomeworkService homeworkService;
public HomeworkController(HomeworkService homeworkService) {
this.homeworkService = homeworkService;
}
@RequestMapping(value = "/allHomework",method= RequestMethod.GET)
public ModelAndView allHomework(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//DataResponse response = new DataResponse();
List<Homework> list = homeworkService.selectAllHomework();
ModelAndView mav = new ModelAndView("allHomework.jsp");
mav.addObject("homeworklist", list);
return mav;
}
@RequestMapping("publishHomework")
public String publishHomework(){
return "publishHomework.jsp";
}
//发布新作业
@RequestMapping(value = "publishH")
public void publishHomework(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String str = new String(req.getParameter("homework_title"));
Homework newHomework = Homework.builder()
.homework_id(Integer.parseInt(req.getParameter("homework_id")))
.homework_title(str)
.build();
resp.setContentType("text/html;charset=UTF-8");
if (newHomework.getHomework_title().equals("")) {
//显示弹窗并且当关闭弹窗后跳到指定页面
resp.getWriter().write("<script>alert('作业标题不得为空!网页将跳转到发布界面!'); window.location='publishHomework'; window.close();</script>");
resp.getWriter().flush();
} else {
if (homeworkService.addHomework(newHomework)) {
//显示弹窗并且当关闭弹窗后跳到指定页面
resp.getWriter().write("<script>alert('发布成功!网页将跳转到首页!'); window.location='teachermenu'; window.close();</script>");
resp.getWriter().flush();
} else {
//显示弹窗并且当关闭弹窗后跳到指定页面
resp.getWriter().write("<script>alert('发布失败,请检查后再发布!网页将跳转到发布界面!'); window.location='publishHomework'; window.close();</script>");
resp.getWriter().flush();
}
}
}
//所有作业
@RequestMapping(value = "/sallHomework",method = RequestMethod.GET)
public ModelAndView doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<Homework> list = homeworkService.selectAllHomework();
ModelAndView mav = new ModelAndView("sallHomework.jsp");
mav.addObject("homeworklist", list);
return mav;
}
}
在启动时,需要加上mapper扫描注释,否则可能扫描不到mapper文件。
@SpringBootApplication
@MapperScan(basePackages = "com.example.demo.mapper")
public class DemoApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
这样就实现了mybatis在spring boot中的整合,其重点是mapper文件和mapper.xml文件
JSP整合
整合JSP首先需要向pom.xml文件添加依赖,这是因为需要使用JSP引擎,而spring boot内置tomcat没有此依赖
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
之后就可以在Controller层进行JSP调用,下面给出一个示例:
注意注解要写@Controller
@Controller
public class HomeworkController {
@Autowired
private final HomeworkService homeworkService;
public HomeworkController(HomeworkService homeworkService) {
this.homeworkService = homeworkService;
}
@RequestMapping(value = "allHomework",method= RequestMethod.GET)
public ModelAndView allHomework() {
List<Homework> list = homeworkService.selectAllHomework();
ModelAndView mav = new ModelAndView("allHomework.jsp");
mav.addObject("homeworklist", list);
return mav;
}
@RequestMapping("publishHomework")
public String publishHomework(){
return "publishHomework.jsp";
}
}
启动项目之后就可以输入网址进行访问啦~
AOP应用
引入依赖
pom.xml文件引入依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.5</version>
</dependency>
ServiceAspect
package com.example.demo.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.sql.Connection;
@Aspect
@Component
public class ServiceAspect {
@Pointcut("execution(* com.example.demo.service..*.*(..))")
public void service(){}
@Before("service()")
public void beforeService(JoinPoint joinPoint){
System.out.println("Before Service");
}
@After("service()")
public void afterService(){
System.out.println("After Service");
}
@Around("service()")
public Object aroundService(ProceedingJoinPoint joinPoint) throws Throwable {
Object object=null;
try{
System.out.println("Before Around Service");
object=joinPoint.proceed();
System.out.println("After Around Service. "+object);
}catch(Throwable throwable){
throwable.printStackTrace();
}
return object;
}
}
项目展示
注册界面
** 登录界面**
教师主界面
查询学生信息
查询学生作业
添加学生
查询作业
发布作业
学生主界面
学生查询作业
学生提交作业
如果此次作业已存在,那么会更新此次作业。