目录
前言
用于记录一个简单springboot项目在Spring Tool Suite4如何发布,以及应用于web端的简单的springboot项目应该包含怎样的内容,它的逻辑又是怎么样的?(自用/小白)
需求假定为:从后端获取数据到前端(增删改查)
一、创建一个springboot项目?
创建流程:File>>New>>Spring Starter Project
以需求为从后端获取数据到前端为例(增删改查)
点击Spring Starter Project后跳转如下页面
创建项目的具体配置为:
本页面用于配置路径、项目名、版本等基础信息,无特殊需求可以直接next,进入到如下页面。
在左下方的选项中选择Web下拉栏,选择Spring Web选项选择Finish。
.
二、三层架构在项目中的使用逻辑
数据访问层:通过Dao层获取到数据库中的目标数据,并提供方法供Service层调用。
业务逻辑层:通过Service层获取Dao层数据,并提供方法供Controller调用。
表现层:Controller与前端页面共同构成表现层。其中:
Controller:获取Service层提供的数据,并将数据从后端传给前端。
前端页面:获取Controller传来的数据,并加以前端设计最终展现。
1.数据访问层
假定数据库中所需数据为:
其中数据库为:myemployees
所需数据为员工表中的数据。
在项目中创建实体类包(entity)并创建员工类(Employees)用来接收数据库中的数据
代码如下(示例):
package com.example.demo.entity; import java.util.Date; import org.springframework.format.annotation.DateTimeFormat; public class Employees { private int employee_id; private String first_name; private String last_name; private String email; private String phone_number; private String job_id; private double salary; private double commission_pct; private int manager_id; private int department_id; @DateTimeFormat(pattern="yyyy-MM-dd") private Date hiredate; public int getEmployee_id() { return employee_id; } public void setEmployee_id(int employee_id) { this.employee_id = employee_id; } public String getFirst_name() { return first_name; } public void setFirst_name(String first_name) { this.first_name = first_name; } public String getLast_name() { return last_name; } public void setLast_name(String last_name) { this.last_name = last_name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone_number() { return phone_number; } public void setPhone_number(String phone_number) { this.phone_number = phone_number; } public String getJob_id() { return job_id; } public void setJob_id(String job_id) { this.job_id = job_id; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public double getCommission_pct() { return commission_pct; } public void setCommission_pct(double commission_pct) { this.commission_pct = commission_pct; } public int getManager_id() { return manager_id; } public void setManager_id(int manager_id) { this.manager_id = manager_id; } public int getDepartment_id() { return department_id; } public void setDepartment_id(int department_id) { this.department_id = department_id; } public Date getHiredate() { return hiredate; } public void setHiredate(Date hiredate) { this.hiredate = hiredate; } @Override public String toString() { return "Employees [employee_id=" + employee_id + ", first_name=" + first_name + ", email=" + email + ", phone_number=" + phone_number + ", salary=" + salary + ", manager_id=" + manager_id + ", department_id=" + department_id + ", hiredate=" + hiredate + "]"; } }
创建接口EmpDao,用于获取到数据库的数据。 声明抽象方法供Service调用。并添加相关依赖注解。package com.example.demo.dao; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; import com.example.demo.entity.Employees; @Mapper @Repository public interface EmpDao { public List<Employees> getEmp(); }
由于接口不允许实例化,无法获取/传递具体属性与方法,所以添加@Repository注解。其作用是在内存中开辟空间,等效的实例化接口。并用@Mapper连接Dao与Mybatis进行接口具体功能的编写。 由于@Mapper是外部依赖,所以通过在pom.xml中<dependencies>标签中添加:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
进行到这步,完成了mybatis在springboot框架中的注入。 在资源文件夹下创建mappers文件夹并创建EmpDao.xml用于编写sql语句。如图:
由于接下来要写sql语句,所以需要在pom.xml的<dependencies>中添加相关依赖的注入。
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
并在application.properties中对于数据库进行连接与设置。
#spring的mysql和mybatis相关
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/myemployees?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#下两行代码分别对应资源文件夹下创建的可被识别的文件夹名称,以及项目包命名
mybatis.mapper-locations:classpath:/mappers/*.xml
mybatis.type-aliases-package:com.example.demo.*
#静态资源路径
#拦截路径
interceptor.is.url=/**@
#放行路径
interceptor.no.url=/css/*.css@/css/lib/*.css@/js/**/*.js@/js/*.js@/other/**/*.*@/user/login/**
EmpDao.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">
<!-- 通过 namespace链接EmpDao.xml与EmpDao.java 其中com.example.demo.dao.EmpDao是EmpDao接口的地址名 -->
<mapper namespace="com.example.demo.dao.EmpDao">
<!-- 声明使用查找语句 其对应方法为getEmp 返回类型以Employees的格式一条一条的返回 com.example.demo.entity.Employees就是Employees的地址名 -->
<select id="getEmp" resultType="com.example.demo.entity.Employees">
SELECT * FROM `employees`
</select>
<insert id="addEmp" parameterType="com.example.demo.entity.Employees">
INSERT INTO `employees`(`first_name`,`email`,`phone_number`,`salary`,`commission_pct`,`manager_id`,`department_id`,`hiredate`)
VALUES(#{first_name},#{email},#{phone_number},#{salary},#{commission_pct},#{manager_id},#{department_id},#{hiredate})
</insert>
<select id="getEmpUpdate" resultType="com.example.demo.entity.Employees" parameterType="com.example.demo.entity.Employees">
SELECT *
FROM `employees`
WHERE `employee_id`=#{id}
</select>
</mapper>
在配置自己的数据库时务必修改用户名、密码、与数据库名称为自己的想要的。
截止目前为止,Dao层数据与方法均已编译完成。进入Service层进行编译。
2.业务逻辑层
创建service包,并创建EmpService类进行Service层编写。
EmpService代码如下:
package com.example.demo.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.demo.dao.EmpDao;
import com.example.demo.entity.Employees;
//在类上添加该注解以声明将进行Service编写,并使用框架中一些集成方法
@Service
public class EmpService {
// 声明了Dao层对象并通过Autowired注解从内存中寻找同类型的对象并赋值。
@Autowired
private EmpDao empdao;
public EmpDao getEmpdao() {
return empdao;
}
public void setEmpdao(EmpDao empdao) {
this.empdao = empdao;
}
// 提供方法给Controller调用
public List<Employees> getEmpSer(){
return empdao.getEmp();
}
}总结:Service层获取了Dao层传来的数据并编写了方法供Controller调用
3.表现层
表现层包括Controller与前端页面。
先进行Controller的编写
创建controller包并创建EmpController类:
Controller中代码及相关解释如下:
package com.example.demo.controller;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.example.demo.entity.Employees;
import com.example.demo.service.EmpService;
//添加注解用以使用Controller内置集成方法
@Controller
public class EmpController {
// 声明Service层对象,并通过@Autowired从内存中找到同类型对象予以赋值。
@Autowired
private EmpService empser;
public EmpService getEmpser() {
return empser;
}
public void setEmpser(EmpService empser) {
this.empser = empser;
}
// 声明网址并连接
@GetMapping("/tomain")
// Model为Java内置类,作用在这里是将后端数据送到前端供前端使用。
public String toSearch(Model model) {
//运用了Model的内置方法addAttribute,作用是将 empser.getEmpSer() 传到前端 并通过"emplist"这个名字在前端进行识别。
model.addAttribute("emplist", empser.getEmpSer());
// 设定对应网址返回到哪一个html页面
return "main";
}
}
Controller获取了Service传来的数据并编写了方法连接前端(供前端使用数据等)。
配置前端页面:
首先Springboot的前端语言为thymeleaf,需要在pom.xml的<dependencies>中注入依赖:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.7.0</version>
</dependency>
并在application.properties中添加相关配置:
server.port=8885
#thymeleaf模板配置
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.cache=false
其中server.port=8885作用是设置端口号。
配置结束,现在开始编写前端页面:
在资源文件夹下的templates文件夹下创建main.html
若有js.jq.css等配置文件添加在static文件夹下
main.html的代码及相关解释如下
<!DOCTYPE html>
<!--本行代码作用是声明该页面使用了thymeleaf进行编译-->
<html lang="ch" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
hello springboot
<table border="1 px">
<!-- th: 代表将要使用thymeleaf的某一个方法 each代表遍历 ${} 为控制器的固定格式 -->
<!--${emplist} 是用来识别后端传来数据的标示名称-->
<tr th:each="emp:${emplist}">
<td th:text="${emp.employee_id}" ></td>
<td th:text="${emp.first_name}"></td>
<td th:text="${emp.email}"></td>
<td th:text="${emp.phone_number}"></td>
<td th:text="${emp.salary}"></td>
<td th:text="${emp.commission_pct}"></td>
<td th:text="${emp.manager_id}"></td>
<td th:text="${emp.department_id}"></td>
<td th:text="${emp.hiredate}"></td>
</tr>
</table>
</body>
</html>
运行项目控制台显示:
打开浏览器进行查看:
添加以及修改功能本文中未提及,故应只展示查询结果。
总结
例如:以上就是一个最简单的javaweb项目使用springboot框架的全部编译过程,仅用于初步理解三层框架的内部逻辑以及部分基础的注解、依赖的使用方法。