SpringBoot总结
来源:互联网 发布:mac开机有声音但是黑屏 编辑:程序博客网 时间:2024/05/21 01:51
一、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/foodspring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.filters=stat,configspring.jpa.show-sql=trueserver.port=80server.context-path=/sbspring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.devtools.restart.enabled=truedebug=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;@Entitypublic 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;@Servicepublic 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;@RestControllerpublic 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//能够自动配置@SpringBootApplicationpublic 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文件夹下: