使用SpringToolSuite快速构建一个SpringBoot项目
话不多说,直奔主题。
先上效果图
1、搭建开发环境
安装JDK(至少1.8),安装SpringToolSuite,此处这两个安装我就不再废话了,直接跳过。
2、安装Maven
安装就略过了,一般都是直接解压即可。
maven下载地址:http://maven.apache.org/download.cgi
maven解压完毕
2.1、配置maven环境变量
新建环境变量MAVEN_HOME
变量名:MAVEN_HOME
变量值:D:\Program Files\apache-maven-3.6.3(Maven的解压路径)
将新添加的MAVEN_HOME添加到path中
%MAVEN_HOME%\bin
mvn -v命令查看,出现如下,则表示安装成功,虽然安装成功,也能使用,但是此时用的镜像仓库是国外的,这里我们需要把镜像替换成alibaba的
2.2、settings.xml更换maven镜像仓库地址
在我们的安装目录下,找到settings.xml文件,添加阿里镜像。
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
2.3、settings.xm设置本地maven仓库地址
创建本地仓库文件夹:D:\workSpace\repository
修改settings.xml中的本地
2.4、sts-preferences设置Installations
打开我们的STS,在eclipse中设置maven的Installations
2.5、sts-preferences设置User Settings
3、创建Stater Project
3.1、设置New Spring Starter Project参数
3.2、选择依赖
根据自身情况选择SpringBootversion版本,以及自己需要使用的架包.
Spring Boot DevTools :热部署
Spring Web :囊括了spring Web项目的包
thymeleaf:模板引擎
Mybatis Framework :mybatis框架
创建项目后,发现如下报错信息,mavan已经给我们管理架包了,所以架包不太可能会出现冲突,出现的问题,可能是maven的版本问题。如下问题就是maven问题。
在2.2中,我们选择的版本是2.2.2版本,但是可能我们所安装的maven不一定适用该版本,因此我们可以修改版本。如修改到2.1.0版本。修改版本后,项目鼠标右键—》maven—》update project。等待更新架包即可。
3.3、添加依赖
如果我们创建项目的时候没有勾选的驱动,框架架包等,我们也可以自行在pom文件中添加,如这里添加了mysql的驱动。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
3.4、配置application
可以采用yalm,也可以采用properties,这里我们采用properties。
server.port=8081
#设置前端模板引擎
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
#设置开启或者关闭和thymeleaf的页面缓存
spring.thymeleaf.cache=false
#设置热部署
spring.devtools.restart.enabled=true
#设置需要开启热部署的文件目录
spring.devtools.restart.additional-paths=src/main/java
#设置mysql连接
spring.datasource.url = jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
#设置日期格式化
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
spring.jackson.serialization.write-dates-as-timestamps=false
#设置日志
logging.path=/softwareLifeCycle/target/log
logging.file=softwareLifeCycle.log
logging.level.root=info
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n
至此,我们的配置工作基本完成,上述配置中,模板引擎和mysql是必须,而其他的配置,如果没有配置,则会采用系统默认的配置。
4、开始编写我们的项目
4.1、创建如下目录(可自己随意创建),编写启动类
通过STS的创建的spring Boot项目,会给我们自动创建好了启动类
4.2、配置注入返回的数据实体类
public class ResultData implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String resultCode;
private String resultInfo;
private String token;
public Object data;
public String getResultCode() {
return resultCode;
}
public void setResultCode(String resultCode) {
this.resultCode = resultCode;
}
public String getResultInfo() {
return resultInfo;
}
public void setResultInfo(String resultInfo) {
this.resultInfo = resultInfo;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
@Override
public String toString() {
return "ResultData [resultCode=" + resultCode + ", resultInfo=" + resultInfo + ", token=" + token + ", data="
+ data + "]";
}
@Configuration
public class ResultDataConfiguration {
/**
* @Description: 统一处理返回数据
* @author hutao
* @mail hutao_2017@aliyun.com
* @date 2019年12月22日
*/
@Bean
public ResultData resultData() {
return new ResultData();
}
}
4.3、编写我们的控制器类
备注 @RestController 采用rest风格请求,因此是需要返回数据的,而不是返回页面,用了RestController注解,该控制器的方法就不能使用返回String的形式去返回页面了。
因此如果需要实现以下效果,不能使用RestController
4.4、编写我们的service实现类
下述这个代码中,service没有将查询的数据库直接返回给控制器,而是将与数据库持久化的对象的镜像返回给控制器。
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;/**
• @Description: 对象转换工具类,将资源类Source转化为目标类Target
• @author hutao
• @mail hutao_2017@aliyun.com
• @date 2019年12月19日
*/
public class ClassConverter<Source, Target> {
protected static final Logger logger = LoggerFactory.getLogger(ClassConverter.class);
/**• @Description: 将单个的Source对象转化成单个的Target对象
• @author hutao
• @mail hutao_2017@aliyun.com
• @date 2019年12月19日
*/
public Target convert(Source source, Class clazz) {
if (source == null) {
return null;
}
Target target = null;
try {
target = clazz.newInstance();
} catch (Exception e) {
logger.error(“初始化{}对象失败,失败原因”, clazz, e);
}
convert(source, target);
return target;
}/**
• @Description: 批量将List集合转化成List集合
• @author hutao
• @mail hutao_2017@aliyun.com
• @date 2019年12月19日
*/
public List convert(List listSource, Class clazz) {
if (CollectionUtils.isEmpty(listSource)) {
return null;
}
List listTarget = new ArrayList();
try {
for (Source source : listSource) {
listTarget.add(convert(source, clazz));
}
return listTarget;
} catch (Exception e) {
logger.error(“批量将List集合转化成List集合失败,失败原因:”+e);
}
return null;}
/**
• @Description: 属性拷贝方法,有特殊需求时子类覆写此方法
• @author hutao
• @mail hutao_2017@aliyun.com
• @date 2019年12月19日
*/
private void convert(Source source, Target target) {
try {
BeanUtils.copyProperties(source, target);
} catch (Exception e) {
logger.error(“属性转换异常,异常原因:”+e);
}
}
}
4.5、编写我们的mapper接口
public class Company implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String companyName;//公司名称
private String companyAddress;//公司地址
private String emailAddress;//邮件
private String userName;
private String passWord;
private String companyCode;//公司编号码
private String customerType;//客户类型 : F免费客户 A级收费客户 B级收费客户 C级收费客户
private String operator;//操作者
private String status;//状态:S申请中 Y有效 W无效(过期)
private Date startEffectTime;//有效开始日期
private Date endEffectTime;//有效结束日期
private Date createTime;
private Date updateTime;
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public String getCompanyAddress() {
return companyAddress;
}
public void setCompanyAddress(String companyAddress) {
this.companyAddress = companyAddress;
}
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getCompanyCode() {
return companyCode;
}
public void setCompanyCode(String companyCode) {
this.companyCode = companyCode;
}
public String getCustomerType() {
return customerType;
}
public void setCustomerType(String customerType) {
this.customerType = customerType;
}
public String getOperator() {
return operator;
}
public void setOperator(String operator) {
this.operator = operator;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Date getStartEffectTime() {
return startEffectTime;
}
public void setStartEffectTime(Date startEffectTime) {
this.startEffectTime = startEffectTime;
}
public Date getEndEffectTime() {
return endEffectTime;
}
public void setEndEffectTime(Date endEffectTime) {
this.endEffectTime = endEffectTime;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "Company [companyName=" + companyName + ", companyAddress=" + companyAddress + ", emailAddress="
+ emailAddress + ", userName=" + userName + ", passWord=" + passWord + ", companyCode=" + companyCode
+ ", customerType=" + customerType + ", operator=" + operator + ", status=" + status
+ ", startEffectTime=" + startEffectTime + ", endEffectTime=" + endEffectTime + ", createTime="
+ createTime + ", updateTime=" + updateTime + "]";
}
5、开始编写我们的前端
5.1、编写HTML页面
公司申请管理页面
<link rel="stylesheet" href="../plugins/bootStrap/css/bootstrap.min.css">
<script src="../plugins/jquery-3.0.0/jquery-3.0.0.min.js"></script>
<script src="../plugins/bootStrap/js/bootstrap.min.js"></script>
<script src="../plugins/bootStrap/js/bootstrap-table.min.js"></script>
<script src="../js/common/httpUrlConstant.js"></script>
<script src="../js/common/httpUtils.js"></script>
<script src="../js/company/application.js"></script>
</head>
<body>
<div id = "" style="width:100%">
<table class="table table-hover" id = "applicationCompany"></table>
</div>
</body>
### 5.2、编写JS #### httpUtils.js /** *
请求提交Object对象 * @author hutaoa * var data = { * "userName":$("#userName").val(), "passWord":$("#passWord").val(), "token":"" * } * */ function httpRequestForObjetc(url,objectData){ var resultData; $.ajax({ type: "POST", url: url, data:objectData, async: false, dataType: "json", success: function(rdata){ resultData = rdata; }
});
return resultData;
}
/**• 请求提交Json字符串
*/
function httpRequestForJson(url,jsonStrData){
var resultData;
$.ajax({
type: “POST”,
contentType: “application/json;charset=UTF-8”,//Spring MVC @RequestBody注解做提交json字符串自动绑定到pojo入参
url: url,
data:jsonStrData,
async: false,
dataType: “json”,
success: function(rdata){
resultData = rdata;
}});
return resultData;}
/**• 请求提交form表单文件
• @author hutaoa
*/
function httpRequestForFile(url,formData){
var resultData;
$.ajax({
url:url,
type: ‘POST’,
data: formData,
async: false,
cache: false,
contentType: false,
processData: false,
success: function (data) {
resultData = data;
},
error: function (data) {
alert(“文件上传失败,请联系管理员”);
}
});
}httpUrlConstant.js
var baseUrl = “http://127.0.0.1:8081/”
/**• 跳转页面地址
*/
var pageUrlConstant = {
//登录地址
“login” : baseUrl+“page/login”,
//忘记密码地址
“forget”:baseUrl+“page/forgetPassword”,
//注册地址
“register”:baseUrl+“page/register”,
//PC系统主页面
“homeMain”:baseUrl+“page/homeMain”,
}/**
• 处理公司模块接口地址
/
var companyUrlConstant = {
//提交公司注册信息
“registerSubmit”:baseUrl+“company/registerSubmit”,
//认证公司注册信息
“registerApprove”:baseUrl+“company/registerApprove”,
//查询公司信息
“queryApplication”:baseUrl+“company/queryApplication”
}
/*• 处理用户模块接口地址
*/
var userUrlConstant = {
//登录认证地址
“loginApprove”:baseUrl+“user/loginApprove”
}
var httpUrlConstant = {
“token”:"",
“pageUrlConstant”:pageUrlConstant,
“companyUrlConstant”:companyUrlConstant,
“userUrlConstant”:userUrlConstant
}application.js
$(function () {
initApplicationCompanyTable();
})/**
• 初始化申请公司表格
*/
function initApplicationCompanyTable(){
var url = httpUrlConstant.companyUrlConstant.queryApplication;
$(’#applicationCompany’).bootstrapTable({
url: url,
//url:"…/data/company.json",
queryParams:{“status”:“A”},//状态为申请中的
method:‘POST’,
dataType:‘json’,
contentType : “application/x-www-form-urlencoded”,
pagination:true,
search:true,
cache: false,
pageNumber:1,
pageSize: 10,
columns: [
{field: ‘companyCode’,title: ‘公司代码’, align: ‘center’},
{field: ‘companyName’,title: ‘公司名称’, align: ‘center’,},
{field: ‘emailAddress’,title: ‘邮箱’, align: ‘center’,},
{field: ‘userName’,title: ‘登录用户’, align: ‘center’,},
{field: ‘customerType’,title: ‘客户类型’, align: ‘center’,},
{field: ‘companyAddress’,title: ‘公司地址’, align: ‘center’,},
{field: ‘createTime’,title: ‘申请时间’, align: ‘center’,}
]
});
}