一、SpringBoot简介
1.概述
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
2.特点
1)创建独立的Spring应用程序
2)嵌入的Tomcat,无需部署war文件
3)简化maven配置
4)自动配置Spring
5)提供生产就绪型功能,如指标、健康检查、外部配置
6)绝对没有代码生成和对xml没有要求配置
二、SpringBoot安装
从最根本上来讲,Spring Boot就是一些库的集合,它能够被任意项目的构建系统所使用。简便起见,该框架也提供了命令行界面,它可以用来运行和测试Boot应用。框架的发布版本,包括集成的CLI(命令行界面),可以在Spring仓库中手动下载和安装。
对于不是使用CLI构建的工程,Boot提供了许多的“starter”模块,它们定义了一组依赖,这些依赖能够添加到构建系统之中,从而解析框架及其父平台所需的特定类库。例如,spring-boot-starter-actuator依赖会引入一组基本的Spring项目,从而实现应用的快速配置和即时可用。关于这种依赖,值得强调的一点就是当开发Web应用,尤其是RESTful Web服务的时候,如果包含了spring-boot-starter-web依赖,它就会为你提供启动嵌入式Tomcat容器的自动化配置,并且提供对微服务应用有价值的端点信息,如服务器信息、应用指标(metrics)以及环境详情。除此之外,如果引入spring-boot-starter-security模块的话,actuator会自动配置Spring Security,从而为应用提供基本的认证以及其他高级的安全特性。它还会为应用结构引入一个内部的审计框架,这个框架可以用来生成报告或其他的用途,比如开发认证失败的锁定策略。
在pom文件中添加SpringBoot的依赖
<!-- SpringBoot的依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
三、SpringBoot集成mybatis、集成Freemarker:
1.在pom中添加依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.et</groupId>
<artifactId>SpringBoot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- SpringBoot的依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<!-- SpringBoot的每一个框架的集成都是一个starter
spring-boot-starter-web加载内嵌Tomcat
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JSP limitations中有例子:
org.apache.tomcat.embed是个内嵌的tomcat,
tomcat-embed-jasper是Tomcat中用来解析jsp文件的
-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!-- 连接数据库的starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<!-- 集成mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- FreeMarker的starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- 阿里 druid 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.5</version>
</dependency>
<!-- 健康检查 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 开发工具 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
2.包结构:
3.application.properties文件的配置如下:
spring.datasource.url=jdbc:mysql://localhost/food
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.filters=stat,config
spring.jpa.show-sql=true
server.port=80
server.context-path=/sb
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.devtools.restart.enabled=true
debug=true
4.Emp员工表实体类(与数据库中的表相对应):
package cn.et.lesson01;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Emp {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column
private String ename;
@Column
private double sal;
@Column
private int deptid;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
public int getDeptid() {
return deptid;
}
public void setDeptid(int deptid) {
this.deptid = deptid;
}
}
5.dao层EmpRepository接口:
package cn.et.lesson01.dao;
import org.springframework.data.repository.CrudRepository;
import cn.et.lesson01.Emp;
public interface EmpRepository extends CrudRepository<Emp,Integer>{
}
6.Service包下的EmpService 接口:
package cn.et.lesson01.service;
import java.util.Map;
import cn.et.lesson01.Emp;
public interface EmpService {
/**
* 根据empId获取员工信息
* @param empId
* @return
*/
public Map getEmp(Integer empId);
/**
* 添加员工
*/
public void saveEmp();
/**
* 查询所有员工信息
* @return
*/
public Emp queryEmp();
/**
* 根据empId修改员工信息
* @param empId
*/
public void updateEmp(Integer empId);
/**
* 根据empId删除员工信息
* @param empId
*/
public void deleteEmp(Integer empId);
}
7.EmpServiceImpl类的实现:
package cn.et.lesson01.service.impl;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import cn.et.lesson01.Emp;
import cn.et.lesson01.dao.EmpRepository;
import cn.et.lesson01.service.EmpService;
@Service
public class EmpServiceImpl implements EmpService{
@Autowired
JdbcTemplate jdbc;
@Autowired
EmpRepository er;
/**
* 根据id查询员工信息
*/
public Map getEmp(Integer empId){
List<Map<String, Object>> empList = jdbc.queryForList("select * from emp where id="+empId);
return empList.get(0);
}
/**
* 添加员工信息
*/
public void saveEmp(){
Emp emp = new Emp();
emp.setEname("ss");
emp.setSal(500.55);
emp.setDeptid(4);
er.save(emp);
}
/**
* 查询员工信息
*/
public Emp queryEmp(){
Emp emp = er.findOne(7);
return emp;
}
/**
* 修改员工信息
*/
public void updateEmp(Integer empId){
Emp emp = new Emp();
emp.setId(empId);
emp.setEname("张三疯");
er.save(emp);
}
/**
* 更新员工信息
*/
public void deleteEmp(Integer empId){
er.delete(empId);
}
}
8.controller包下的SbController 类的实现:
package cn.et.lesson01.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.et.lesson01.Emp;
import cn.et.lesson01.service.EmpService;
@RestController
public class SbController {
@Autowired
EmpService service;
@RequestMapping("/helloSb")
public Map helloSb(){
Map map = new HashMap();
map.put("id",1);
map.put("name","zs");
map.put("age",20);
return map;
}
/**
* 根据员工id查询员工信息
* @param empId
* @return
*/
@RequestMapping("/emp/{empId}")
public Map getEmp(@PathVariable Integer empId){
return service.getEmp(empId);
}
/**
* 添加员工信息
* @return
*/
@RequestMapping("/saveEmp")
public String saveEmp(){
service.saveEmp();
return "1";
}
/**
* 查询员工信息
* @return
*/
@RequestMapping("/queryEmp")
public Emp queryEmp(){
return service.queryEmp();
}
/**
* 删除员工信息
* @return
*/
@RequestMapping("/deleteEmp/{empId}")
public String deleteEmp(@PathVariable Integer empId){
service.deleteEmp(empId);
return "1";
}
/**
* 修改员工信息
* @return
*/
@RequestMapping("/updateEmp/{empId}")
public String updateEmp(@PathVariable Integer empId){
service.updateEmp(empId);
return "1";
}
}
9.main方法的实现:
package cn.et.lesson01;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//@EnableAutoConfiguration//能够自动配置
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
10.前端页面
tree.html(运用了easyUi):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>tree.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="themes/icon.css">
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery.easyui.min.js"></script>
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
<script type="text/javascript">
//根据员工姓名查询
function queryForm(){
var eName=$("#empId").textbox('getValue');
$("#dg").datagrid(('load'),{
ename:eName
});
}
function updateForm(){
//获取选中的行
var selectedRow=$("#dg").datagrid("getSelected");
var empId=selectedRow.id
$('#ff').form('submit',{
url:'updateEmp/'+empId,
success: function(msg){
msg = JSON.parse(msg);
if(msg.code==1){
$.messager.alert('提示消息','修改成功!');
queryForm();
$("#w").window('close');
}else{
$.messager.alert('错误消息',msg.message);
}
}
});
}
function addForm(){
$("#aa").form('submit',{
url:'saveEmp',
method:'POST',
success:function(msg){
msg = JSON.parse(msg);
if(msg.code==1){
$.messager.alert('提示消息','新增成功!');
queryForm();
$("#a").window('close');
$("#aa").form('clear');
}else{
$.messager.alert('错误消息',msg.message);
}
}
});
}
$(function(){
$("#tt").tree({
onSelect:function(node){
//获取id
var id=node.id;
//重新加载
$("#dg").datagrid('load',{
deptid:id
});
}
});
//通过数组定义工具栏
$("#dg").datagrid({
toolbar:[{
iconCls: 'icon-insert',
text:'新增',
onClick:function(){
//打开一个新增的窗口
$("#a").window('open');
}
},{
iconCls: 'icon-update',
text:'修改',
onClick:function(){
//获取选中的行
var selectedRow=$("#dg").datagrid("getSelected");
if(selectedRow==null){
$.messager.alert('提示消息','请选择要修改的行');
return;
}
//打开窗口
$("#w").window('open');
$('#ff').form('load',selectedRow);
}
},{
iconCls: 'icon-delete',
text:'删除',
onClick:function(){
//获取所有选中的行
var selectedRow=$("#dg").datagrid("getSelections");
//判断是否选中行
if(selectedRow==null || selectedRow==""){
$.messager.alert('提示消息','请选择要删除的行');
return;
}
//获取菜品编号的字符串形式
var empId ="";
for(var i=0;i<selectedRow.length;i++){
if(empId==""){
empId=selectedRow[i].id;
}else{
empId+=','+selectedRow[i].id;
}
}
//发送AJAX请求从后台删除
$.ajax({
url:'deleteEmp/'+empId,
method:'POST',
data:'_method=delete',
dataType:'json',
success: function(msg){
if(msg.code==1){
$('#dg').datagrid('clearSelections');
$.messager.alert('提示消息','删除成功!');
//删除成功后再查询一遍
queryForm();
}else{
//弹出异常信息
$.messager.alert('错误消息',msg.message);
}
}
});
}
}]
})
})
</script>
</head>
<body>
<div id="cc" class="easyui-layout" style="width:100%;height:100%;">
<div data-options="region:'west',title:'部门管理',split:true" style="width:15%;">
<ul id="tt" class="easyui-tree" data-options="url:'queryDept'"></ul>
</div>
<div data-options="region:'center',title:'员工信息'" style="padding:5px;background:#eee;">
员工姓名:<input id="empId" class="easyui-textbox" type="text" name="ename" data-options="required:false"></input>
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="queryForm()">查询</a>
<div style="height:10px"></div>
<table id="dg" class="easyui-datagrid" style="width:650px;height:350px"
data-options="singleSelect:false,url:'queryEmp',method:'get',collapsible:true,pagination:true">
<thead>
<tr>
<!-- {"foodid":1,"foodname":"包","price":2,"img":"t01d5cd25d62b51a194.jpg"} -->
<th data-options="field:'id',width:80">员工编号</th>
<th data-options="field:'ename',width:100">员工姓名</th>
<th data-options="field:'sal',width:80,align:'right'">薪水</th>
<th data-options="field:'deptid',width:80,align:'right'">部门编号</th>
</tr>
</thead>
</table>
</div>
</div>
<div id="a" class="easyui-window" title="添加员工" data-options="iconCls:'icon-update',closed:true" style="width:330px;height:400px;padding:5px;">
<div class="easyui-layout" data-options="fit:true">
<form id="aa" method="post">
<table cellpadding="5">
<tr>
<td>员工姓名:</td>
<td><input class="easyui-textbox" type="text" name="ename" data-options="required:true"></input></td>
</tr>
<tr>
<td>薪水:</td>
<td><input class="easyui-textbox" type="text" name="sal" data-options="required:true"></input></td>
</tr>
<tr>
<td>部门编号:</td>
<td><input class="easyui-textbox" name="deptid" data-options="prompt:'请输入部门编号...',editable:true"></input></td>
</tr>
</table>
</form>
<div style="text-align:center;padding:5px">
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="addForm()">保存</a> 
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="clearForm()">重置</a>
</div>
</div>
</div>
<div id="w" class="easyui-window" title="修改员工信息" data-options="iconCls:'icon-update',closed:true" style="width:330px;height:200px;padding:5px;">
<div class="easyui-layout" data-options="fit:true">
<form id="ff" method="post">
<input type="hidden" name="_method" value="put"/>
<table cellpadding="5">
<tr>
<td>员工姓名:</td>
<td><input class="easyui-textbox" type="text" name="ename" data-options="required:true"></input></td>
</tr>
<tr>
<td>薪水:</td>
<td><input class="easyui-textbox" type="text" name="sal" data-options="required:true"></input></td>
</tr>
<tr>
<td>部门编号:</td>
<td><input class="easyui-textbox" type="text" name="deptid" data-options="required:true"></input></td>
</tr>
</table>
</form>
<div style="text-align:center;padding:5px">
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="updateForm()">保存</a> 
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="clearForm()">重置</a>
</div>
</div>
</div>
</body>
</html>
注意:
jsp文件需要添加解析jsp文件的依赖:
<!-- JSP limitations中有例子:
org.apache.tomcat.embed是个内嵌的tomcat,
tomcat-embed-jasper是Tomcat中用来解析jsp文件的
-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
ftl文件要放在指定的templates文件夹下: