Spring Boot
Spring Boot 是Java领域的第一框架。
通过Spring Boot可以快速构建一个基于Spring框架的Java Application, 简化配置,自动装配。
JavaConfiguration 用 Java类替代XML的配置方式。
Spring Boot对常用的第三方库提供了配置方案,可以很好地和Spring进行整合,一键式搭建功能完备的Java企业级应用。
开箱即用是 Spring Boot 的特点
1.Spring Boot 的优势:
- 不需要任何XML配置文件
- 内嵌Tomcat,可以直接部署
- 默认支持JSON数据,不需要进行转换
- 支持RESTful
- 配置文件非常简单,支持YAML格式
Spring Boot是一种只需要极少配置就可以快速搭建Spring应用,并且集成了常用的第三方类库,让开发者可以快速进行企业级应用开发。
Spring Boot 2.x要求必须基于Spring 5.x,Spring 5.x要求Java版本必须是8以上。
2.Spring Boot的使用
1.创建 Handler
@RestController
@RequestMapping("/hello")
public class HelloHandler {
@GetMapping("/index")
public String index(){
return "Hello Spring Boot";
}
}
2.创建启动类
package com.southwind.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
启动类必须覆盖所有与业务相关的类: 启动类所在的包必须是业务类所在包的同包或者父包,如果没有覆盖,业务类就不会自动装配到IOC容器中
Spring Boot 配置文件
自定义banner
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nNjFP3Cg-1621597689627)(D:\图片\boot.png)]
Properties
#端口
server.port=8888
#项目访问路径
server.servlet.context-path=/springboot
#cookie失效时间
server.servlet.session.cookie.max-age=100
#session失效时间
server.servlet.session.timeout=100
#编码格式
server.tomcat.uri-encoding=UTF-8
YAML
YAML是不同于Properties的另外一种文件格式,同样可以用来写配置文件, Spring Boot默认支持YAML格式,YAML的优点在于编写简单,结构清晰,利用缩紧的形式来表示层级关系。
相比于Properties, YAML可以进一步简化配置文件的编写, 更加方便。
server:
port: 8888
servlet:
context-path: /springboot
session:
cookie:
max-age: 100
timeout: 100
tomcat:
uri-encoding: UTF-8
需要注意的是YAML格式书写规范非常严格,属性名和属性值之间必须至少一个空格。
Spring Boot 会自动集成各种框架
只要你在pom.xml中配置了相关框架的依赖。那么Spring Boot就会自动装载
如果Properties和YAML两种类型的文件同时存在,Properties 的优先级更高。
优先级顺序如下所示:
1、根路径下的config中的配置文件
2、根路径下的配置文件
3、resources 路径下的config中的配置文件
4、resources路径下的配置文件
可以直接在Handler中读取YAML文件中的数据,比如在业务方法中向客户端返回当前服务的端口信息。
package com.southwind.springboot.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/hello")
public class HelloHandler {
@Value("${server.port}")
private String port;
@GetMapping("/index")
public String index(){
return "当前服务的端口号:"+this.port;
}
}
@Value注解同样适用于Properties文件.
3.Spring Boot 整合 JSP
Servlet接口,类- -旦实现这个接口,该类就具备了给客户端做响应的功能。
Servlet的体系
最顶层是Servlet接口
第二层: GenericServlet,屏蔽其他不需要的方法
第三层: HttpServlet,根据请求类型再进行分发
第四层:开发者自定义的Servlet
Spring Boot 与视图层的整合
- JSP
- JSP 的弊端:效率低
- JSP底层是Servlet
- JSP转换为Servlet,再通过Servlet的方式将视图信息响应给客户端。
- Thymeleaf
Java Server Page,是Java提供的一种动态网页技术,底层是Servlet,可以直接在HTML中插入Java代码。
JSP 底层原理:
JSP 是一种中间层组件,开发者可以在这个组件将Java代码与HTML代码经行整合,由JSP引擎将组件转为Servlet,再把开发者定义在组件中的混合代码翻译成Servlet的响应语句,输出给客户端。
1.创建基于maven的项目,添加依赖
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.4.5</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9.0.45</version>
</dependency>
</dependencies>
2.创建Handler
package com.southwind.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloHandler {
@RequestMapping("/index")
public ModelAndView index(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
modelAndView.addObject("mess","hello Spring Boot");
return modelAndView;
}
}
3.创建JSP
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
<!-- Bootstrap -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
</head>
<body>
<h1>Index</h1>
${mess}
</body>
</html>
4.application.yml
server:
port: 8888
spring:
mvc:
view:
prefix: /
suffix: .jsp
5.Application
package com.wdzl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
实际应用
JSTL
1.pom.xml
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
Lombok的功能是简化实体类的编写工作,常用的方法getter、setter、toString 等方法都可以由Lombok自动生成,开发者不需要手动编写,Lombok的使用需要安装插件。
2.创建实体类
package com.southwind.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class User {
private Integer id;
private String name;
}
3.Dao层及其实现类
public interface UserDao {
Collection<User> finAll();
User findById(Integer id);
void addUser(User user);
void deleteById(Integer id);
void update(User user);
}
@Repository
public class UserDaoImpl implements UserDao {
private static Map<Integer,User> map;
static {
map = new HashMap<>();
map.put(1,new User(1,"张三"));
map.put(2,new User(2,"李四"));
map.put(3,new User(3,"王五"));
}
@Override
public Collection<User> finAll() {
return map.values();
}
@Override
public User findById(Integer id) {
return map.get(id);
}
@Override
public void addUser(User user) {
map.put(user.getId(),user);
}
@Override
public void deleteById(Integer id) {
map.remove(id);
}
@Override
public void update(User user) {
map.put(user.getId(),user);
}
}
4.Service层的接口及其实现类
public interface UserService {
Collection<User> finAll();
User findById(Integer id);
void addUser(User user);
void deleteById(Integer id);
void update(User user);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDaoImpl userDao;
@Override
public Collection<User> finAll() {
return userDao.finAll();
}
@Override
public User findById(Integer id) {
return userDao.findById(id);
}
@Override
public void addUser(User user) {
userDao.addUser(user);
}
@Override
public void deleteById(Integer id) {
userDao.deleteById(id);
}
@Override
public void update(User user){
userDao.update(user);
}
}
5…Controller
package com.southwind.controller;
import com.southwind.pojo.User;
import com.southwind.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class UserHandler {
@Autowired
private UserService userService;
@RequestMapping("/findAll")
public ModelAndView findAll(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
modelAndView.addObject("list",userService.finAll());
return modelAndView;
}
@RequestMapping("/findById/{id}"