三层架构 —— 具体代码

Rover20230226 / 2023-05-11 / 原文

准备环境

1. 创建新的环境,引入坐标 

2. 创建包结构( domain、util、servlet、service、mapper )

3. 添加文件( Mybatis配置文件、工具类、实体类 )

4. 添加过滤器(全面处理中文乱码)

5. 添加前端页面

6. 部署测试

 

(一)domain

 1 package com.itheima.domain;
 2 
 3 import lombok.AllArgsConstructor;
 4 import lombok.Data;
 5 import lombok.NoArgsConstructor;
 6 
 7 @Data
 8 @NoArgsConstructor
 9 @AllArgsConstructor
10 public class Student {
11     private String id;  //学号
12     private String name;    //姓名
13     private String birthday;  //生日
14     private String address; //地址
15 }
Student

 

(二)mapper

 1 package com.itheima.mapper;
 2 
 3 import com.itheima.domain.Student;
 4 import org.apache.ibatis.annotations.Delete;
 5 import org.apache.ibatis.annotations.Insert;
 6 import org.apache.ibatis.annotations.Select;
 7 import org.apache.ibatis.annotations.Update;
 8 
 9 import java.util.List;
10 
11 public interface StudentMapper {
12     @Select("select * from student")
13     List<Student> findAll();
14 
15     @Insert("insert into student values(#{id},#{name},#{birthday},#{address})")
16     void save(Student student);
17 
18     @Delete("delete from student where id = #{id}")
19     void deleteById(String id);
20 
21     @Select("select * from student where id = #{id}")
22     Student findById(String id);
23 
24     @Update("update student set name = #{name}, birthday = #{birthday}, address = #{address} where id = #{id}")
25     void update(Student student);
26 }
StudentMapper

 

(三)service

 1 package com.itheima.service;
 2 
 3 import com.itheima.domain.Student;
 4 
 5 import java.util.List;
 6 
 7 public interface StudentService {
 8 
 9     List<Student> findAll();
10 
11     void save(Student student);
12 
13     void deleteById(String id);
14 
15     Student findById(String id);
16 
17     void update(Student student);
18 }
StudentService

  impl

 1 package com.itheima.service.impl;
 2 
 3 import com.itheima.domain.Student;
 4 import com.itheima.mapper.StudentMapper;
 5 import com.itheima.service.StudentService;
 6 import com.itheima.util.MyBatisUtil;
 7 import org.apache.ibatis.session.SqlSession;
 8 
 9 import java.util.List;
10 
11 public class StudentServiceImpl implements StudentService {
12     @Override
13     public List<Student> findAll() {
14         SqlSession sqlSession = MyBatisUtil.getSqlSession();
15         StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
16         List<Student> list = studentMapper.findAll();
17         MyBatisUtil.close(sqlSession);
18         return list;
19     }
20 
21     @Override
22     public void save(Student student) {
23         SqlSession sqlSession = MyBatisUtil.getSqlSession();
24         StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
25         studentMapper.save(student);
26         MyBatisUtil.close(sqlSession);
27     }
28 
29     @Override
30     public void deleteById(String id) {
31         SqlSession sqlSession = MyBatisUtil.getSqlSession();
32         StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
33         studentMapper.deleteById(id);
34         MyBatisUtil.close(sqlSession);
35     }
36 
37     @Override
38     public Student findById(String id) {
39         SqlSession sqlSession = MyBatisUtil.getSqlSession();
40         StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
41         Student student = studentMapper.findById(id);
42         MyBatisUtil.close(sqlSession);
43         return student;
44     }
45 
46     @Override
47     public void update(Student student) {
48         SqlSession sqlSession = MyBatisUtil.getSqlSession();
49         StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
50         studentMapper.update(student);
51         MyBatisUtil.close(sqlSession);
52     }
53 }
StudentServiceImpl

 

(四)util

 1 package com.itheima.util;
 2 
 3 import org.apache.ibatis.io.Resources;
 4 import org.apache.ibatis.session.SqlSession;
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 7 
 8 import java.io.InputStream;
 9 
10 public class MyBatisUtil {
11     private static SqlSessionFactory sqlSessionFactory;
12 
13     //静态代码块
14     static {
15         try {
16             //读取配置文件,读成数据流
17             InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
18 
19             //创建SqlSessionFactory
20             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
21         } catch (Exception e) {
22             e.printStackTrace();
23         }
24     }
25 
26     //获取sqlSession
27     public static SqlSession getSqlSession() {
28         return sqlSessionFactory.openSession();
29     }
30 
31     //提交事务和释放资源
32     public static void close(SqlSession sqlSession) {
33         if (sqlSession != null) {
34             //提交事务(mybatis默认情况下是不会自动提交事务)
35             sqlSession.commit();
36 
37             //释放资源
38             sqlSession.close();
39         }
40     }
41 }
MyBatisUtil

 

(五)web

  filter

 1 package com.itheima.web.filter;
 2 import javax.servlet.*;
 3 import javax.servlet.annotation.WebFilter;
 4 import javax.servlet.http.HttpServletRequest;
 5 import javax.servlet.http.HttpServletResponse;
 6 import java.io.IOException;
 7 
 8 /**
 9  * 解决全站乱码问题,处理所有的请求
10  */
11 @WebFilter("/*")
12 public class CharacterEncodingFilter implements Filter {
13     @Override
14     public void doFilter(ServletRequest req, ServletResponse rep, FilterChain filterChain) throws IOException, ServletException {
15         //将父接口转为子接口
16         HttpServletRequest request = (HttpServletRequest) req;
17         HttpServletResponse response = (HttpServletResponse) rep;
18 
19         //不需要过滤的url
20         String path = request.getServletPath();
21         String[] urls = {".html", ".js", ".css", ".ico", ".jpg", ".png"};
22         boolean flag = true;
23         for (String str : urls) {
24             if (path.indexOf(str) != -1) {
25                 flag = false;
26                 break;
27             }
28         }
29 
30         //需要过滤的资源走这个逻辑
31         if (flag) {
32             //解决post请求中文数据乱码问题
33             if (request.getMethod().equalsIgnoreCase("post")) {
34                 request.setCharacterEncoding("utf-8");
35             }
36 
37             //解决跨域问题
38             /* 允许跨域的主机地址 */
39             response.setHeader("Access-Control-Allow-Origin", "*");
40             /* 允许跨域的请求方法GET, POST, HEAD 等 */
41             response.setHeader("Access-Control-Allow-Methods", "*");
42             /* 重新预检验跨域的缓存时间 (s) */
43             response.setHeader("Access-Control-Max-Age", "3600");
44             /* 允许跨域的请求头 */
45             response.setHeader("Access-Control-Allow-Headers", "*");
46             /* 是否携带cookie */
47             response.setHeader("Access-Control-Allow-Credentials", "true");
48 
49 
50             //处理响应乱码
51             response.setContentType("application/json;charset=utf-8");
52         }
53 
54         filterChain.doFilter(request, response);
55     }
56 
57     @Override
58     public void init(FilterConfig filterConfig) throws ServletException {
59 
60     }
61     @Override
62     public void destroy() {
63 
64     }
65 }
CharacterEncodingFilter

  servlet

  1 package com.itheima.web.servlet;
  2 
  3 import cn.hutool.core.io.IoUtil;
  4 import com.fasterxml.jackson.databind.ObjectMapper;
  5 import com.itheima.domain.Student;
  6 import com.itheima.service.StudentService;
  7 import com.itheima.service.impl.StudentServiceImpl;
  8 
  9 import javax.servlet.ServletException;
 10 import javax.servlet.ServletInputStream;
 11 import javax.servlet.annotation.WebServlet;
 12 import javax.servlet.http.HttpServlet;
 13 import javax.servlet.http.HttpServletRequest;
 14 import javax.servlet.http.HttpServletResponse;
 15 import java.io.IOException;
 16 import java.util.List;
 17 
 18 @WebServlet("/studentServlet")
 19 public class StudentServlet extends HttpServlet {
 20     @Override
 21     protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 22         // 接收action,确定请求目的
 23         String action = req.getParameter("action");
 24         if ("findAll".equals(action)) {
 25             findAll(req, resp);
 26         } else if ("save".equals(action)) {
 27             save(req, resp);
 28         } else if ("deleteById".equals(action)) {
 29             deleteById(req, resp);
 30         } else if ("findById".equals(action)) {
 31             findById(req, resp);
 32         } else if ("update".equals(action)) {
 33             update(req, resp);
 34         } else {
 35             resp.getWriter().write("方法请求错误");
 36         }
 37     }
 38 
 39     // 修改
 40     private void update(HttpServletRequest req, HttpServletResponse resp) throws IOException {
 41         // 1. 获取请求参数
 42         ServletInputStream is = req.getInputStream();
 43         String json = IoUtil.read(is, "utf-8");
 44         Student student = new ObjectMapper().readValue(json, Student.class);
 45         // 2. 调用业务逻辑
 46         StudentService studentService = new StudentServiceImpl();
 47         studentService.update(student);
 48         // 3. 响应结果
 49         resp.getWriter().write("OK");
 50     }
 51 
 52     // 根据id查询学生(回显)
 53     private void findById(HttpServletRequest req, HttpServletResponse resp) throws IOException {
 54         // 1. 获取请求参数
 55         String id = req.getParameter("id");
 56         // 2. 调用业务逻辑
 57         StudentService studentService = new StudentServiceImpl();
 58         Student student = studentService.findById(id);
 59         // 3. 响应结果
 60         String json = new ObjectMapper().writeValueAsString(student);
 61         resp.getWriter().write(json);
 62     }
 63 
 64     // 根据id删除
 65     private void deleteById(HttpServletRequest req, HttpServletResponse resp) throws IOException {
 66         // 1. 获取请求参数
 67         String id = req.getParameter("id");
 68         // 2. 调用业务逻辑
 69         StudentService studentService = new StudentServiceImpl();
 70         studentService.deleteById(id);
 71         // 3. 响应结果
 72         resp.getWriter().write("OK");
 73 
 74     }
 75 
 76     // 新增
 77     private void save(HttpServletRequest req, HttpServletResponse resp) throws IOException {
 78         // 1. 获取请求参数(如果页面提交的数据为json格式,则req.getPXXX方法不能用了,只能使用字节流获取)
 79 //        String id = req.getParameter("id");
 80         ServletInputStream is = req.getInputStream();
 81         // 把字节数据转换为指定编码格式的字符串{key:value}
 82         String json = IoUtil.read(is, "utf-8");
 83         Student student = new ObjectMapper().readValue(json, Student.class);
 84         // 2. 调用业务逻辑
 85         StudentService studentService = new StudentServiceImpl();
 86         studentService.save(student);
 87         // 3. 响应结果
 88         resp.getWriter().write("OK");
 89     }
 90 
 91     // 查询所有
 92     private void findAll(HttpServletRequest req, HttpServletResponse resp) throws IOException {
 93         // 1. 获取请求参数(无)
 94 
 95         // 2. 调用业务逻辑
 96         StudentService studentService = new StudentServiceImpl();
 97         List<Student> studentList = studentService.findAll();
 98         // 3. 响应结果
 99         String json = new ObjectMapper().writeValueAsString(studentList);
100         resp.getWriter().write(json);
101     }
102 }
StudentServlet