一、Spring Boot介绍
Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置。
简单来说,它提供了一堆依赖打包,并已经按照使用习惯解决了依赖问题—习惯大于约定。
Spring Boot默认使用tomcat作为服务器,使用logback提供日志记录。
Spring Boot提供了一系列的依赖包,所以需要构建工具的支持:maven 或 gradle。
二、一个简单的springboot pom.xml配置示例
Springboot父工程依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.1.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
Springboot web启动器依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
三、Springboot注解
1、@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中
@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。
@Configuration 等同于spring的XML配置文件;使用Java代码可以检查类型安全。
@EnableAutoConfiguration 自动配置。
@ComponentScan 组件扫描,可自动发现和装配一些Bean。
@Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。
2、@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。在返回值类型前加上@ResponseBody表示返回结果是json的格式,不会是页面。
3、@EnableAutoConfiguration:Spring Boot自动配置(auto-configuration):尝试根据你添加的jar依赖自动配置你的Spring应用。例如,如果你的classpath下存在HSQLDB,并且你没有手动配置任何数据库连接beans,那么我们将自动配置一个内存型(in-memory)数据库”。你可以将@EnableAutoConfiguration或者@SpringBootApplication注解添加到一个@Configuration类上来选择自动配置。如果发现应用了你不想要的特定自动配置类,你可以使用@EnableAutoConfiguration注解的排除属性来禁用它们。
这个注释告诉SpringBoot“猜”你将如何想配置Spring,基于你已经添加jar依赖项。如果spring-boot-starter-web已经添加Tomcat和Spring MVC,这个注释自动将假设您正在开发一个web应用程序并添加相应的spring设置。
自动配置被设计用来和“Starters”一起更好的工作,但这两个概念并不直接相关。您可以自由挑选starter依赖项以外的jar包,springboot仍将尽力自动配置您的应用程序。
4、@Bean:相当于XML中的bean,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。
5、@RequestMapping:@RequestMapping(value = {“/”, “/index”})value值为“/”表示根目录,“/index”表示访问路径后面为index,方法如果直接返回字符串,框架默认会去 spring.view.prefix 目录下的 (index拼接spring.view.suffix)页面;如果返回类型为ModelAndView,则是返回页面,页面由返回的ModelAndView对象确定。
@RequestMapping(value = {"/", "/index"})
public String index(Map<String, Object> model) {
// 直接返回字符串,框架默认会去 spring.view.prefix 目录下的 (index拼接spring.view.suffix)页面
// 本例为 /WEB-INF/jsp/index.jsp
model.put("time", new Date());
model.put("message", this.hello);
return "index";
}
@RequestMapping("/page")
public ModelAndView page() {
ModelAndView model = new ModelAndView();
model.setViewName("index");
model.addObject("time", new Date());
model.addObject("message", this.hello);
return model;
}
6、其他
@Autowired自动导入。
@PathVariable获取参数。
@JsonBackReference解决嵌套外链问题。
@RepositoryRestResourcepublic配合spring-boot-starter-data-rest使用。
四、Springboot支持jsp
1、配置application.properties
# 页面默认前缀目录
spring.mvc.view.prefix=/WEB-INF/jsp/
# 响应页面默认后缀
spring.mvc.view.suffix=.jsp
2、加入依赖
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
3、使用方法结合@RequestMapping的用法。
五、Springboot支持freemarker
1、配置application.properties
spring.freemarker.allow-request-override=false
spring.freemarker.cache=true
spring.freemarker.check-template-location=true
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=false
2、加入依赖
<!-- 引入freeMarker的依赖包. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
control代码:
@RequestMapping("/freemarker")
public String freemarker(Map<String, Object> map) {
map.put("name", "[Angel -- 守护天使]");
map.put("gender", 1);//gender:性别,1:男;0:女;
List<Map<String, Object>> friends = new ArrayList<Map<String, Object>>();
Map<String, Object> friend = new HashMap<String, Object>();
friend.put("name", "jack");
friend.put("age", 30);
friends.add(friend);
friend = new HashMap<String, Object>();
friend.put("name", "jeff");
friend.put("age", 36);
friends.add(friend);
map.put("friends", friends);
return "freemarker";
}
freemarker.ftl
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Hello World!</title>
</head>
<body>
<p>
welcome ${name} to freemarker!
</p>
<p>性别:
<#if gender==0>
女
<#elseif gender==1>
男
<#else>
保密
</#if>
</p>
<h4>我的好友:</h4>
<#list friends as item>
姓名:${item.name} , 年龄${item.age}
<br>
</#list>
</body>
</html>
六、Springboot Servlet注册
Springboot中有两种方式可以添加 Servlet、Filter、Listener
1、代码注册通过ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 获得控制,并且要在方法前加上@Bean注解。
SpringBoot启动类上添加代码:
@Bean
public ServletRegistrationBean servletRegistrationBean() {
return new ServletRegistrationBean(new JackServlet(), "/xs/*");}
单请求url为xs时,就会调用JackServlet。
对应的JackServlet代码:
package com.dongnao.jack.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class JackServlet extends HttpServlet {
private static final long serialVersionUID = -8685285401859800066L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("this is jackServlet doposet method");
PrintWriter pw = resp.getWriter();
pw.write("hello springboot servlet register by JackServlet");
pw.flush();
pw.close();
}
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
}
}
2、在 SpringBootApplication 上使用@ServletComponentScan 注解后,Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码。
SpringBoot启动类上添加注解:
//扫描工程中的Servlet、Filter、Listener
@ServletComponentScan(basePackages = {"com.dongnao.jack"})
servlet类添加@WebFilter(要加上urlPatterns访问路径)就可以访问了,相应的servlet类:
package com.dongnao.jack.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Description 带 @WebServlet注解的Servlet注册需要@ServletComponentScan注解的扫描
* @ClassName JeffServlet
* @Date 2017年8月28日 下午2:17:01
* @Author 动脑学院-jack
*/
@WebServlet(urlPatterns = "/jeff/*")
public class JeffServlet extends HttpServlet {
private static final long serialVersionUID = -8685285401859800067L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("this is JeffServlet doposet method");
PrintWriter pw = resp.getWriter();
pw.write("hello springboot servlet register by JeffServlet");
pw.flush();
pw.close();
}
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
}
}
七、拦截器
Springboot 拦截器
1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。其中preHandle方法返回true就是放行,false就是拦截。
package com.dongnao.jack.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class JackInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println(this.getClass().getName() + "<------>preHandle");
return true;//返回true就是放行,false就是拦截
}
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println(this.getClass().getName() + "<------>postHandle");
}
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println(this.getClass().getName()
+ "<------>afterCompletion");
}
}
2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法,并且需要添加@Configuration注解,让启动器找能够找到。
3、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。
package com.dongnao.jack.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.dongnao.jack.interceptor.JackInterceptor;
import com.dongnao.jack.interceptor.JeffInterceptor;
@Configuration
public class SpringInterceptorRegister extends WebMvcConfigurerAdapter {
private static final Logger logger = LoggerFactory.getLogger(SpringInterceptorRegister.class);
/*
* 添加spring中的拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JackInterceptor()).addPathPatterns("/**");//添加拦截路径
registry.addInterceptor(new JeffInterceptor())
.addPathPatterns("/freemarker/**");
super.addInterceptors(registry);
}
}
自定义拦截器
package com.dongnao.jack.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
/**
* @Description 自定义的Serlvlet过滤器
* @ClassName JackFilter
* @Date 2017年8月28日 下午2:29:50
* @Author 动脑学院-jack
*/
@WebFilter(filterName = "jackFilter", urlPatterns = "/*")
public class JackFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
System.out.println(req.getRequestURL() + "------>doFilter");
chain.doFilter(request, response);
}
public void destroy() {
// TODO Auto-generated method stub
}
}
八、Springboot 静态资源处理
1、Spring Boot 的默认资源映射
其中默认配置的 /**映射到 /static (或/public、/resources、/META-INF/resources)
其中默认配置的 /webjars/** 映射到 classpath:/META-INF/resources/webjars/ 上面的 static、public、resources 等目录都在 classpath: 下面(如 src/main/resources/static)。
2、自定义资源映射
继承 WebMvcConfigurerAdapter 并重写方法 addResourceHandlers
registry.addResourceHandler(“/image/**”).addResourceLocations(“file:H:/image/”);
registry.addResourceHandler(“/image1/**”).addResourceLocations(“classpath:/img1/”)
package com.dongnao.jack.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.dongnao.jack.interceptor.JackInterceptor;
import com.dongnao.jack.interceptor.JeffInterceptor;
@Configuration
public class SpringInterceptorRegister extends WebMvcConfigurerAdapter {
private static final Logger logger = LoggerFactory.getLogger(SpringInterceptorRegister.class);
/*
* 注册静态文件的自定义映射路径
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//image/** 这个是url请求路径
//classpath:/image/ 去这个路径下寻找静态文件
registry.addResourceHandler("/image/**")
.addResourceLocations("classpath:/image/");
registry.addResourceHandler("/picture/**")
.addResourceLocations("file:D:/picture/");
super.addResourceHandlers(registry);
}
}
3、通过配置文件映射
使用 spring.mvc.static-path-pattern 可以重新定义pattern,如修改为 /image/**
使用 spring.resources.static-locations 可以重新定义 pattern 所指向的路径,支持 classpath: 和 file: