title: Spring Boot实战学习笔记2
tags:Spring Boot实战
grammar_cjkRuby: true
摘要
本文为学习Spring Boot实战的学习笔记,学习了一遍,但是好记性不如烂笔头,所以文章记录下来。图书购买地址为: https://item.jd.com/11894632.html.
1.Spring 基础
2.Spring 常用配置
3.Spring 高级话题
4.Spring mvc基础
4.1 Spring mvc概述
MVC:Model+View+Controller(数据模型+视图+控制器) V有:jsp,freemark,velocity,Thymeleaf,Tile.
三层架构: Presentiont tier+Application tier+Data tier.(展示层+应用层+数据访问层)
4.2 Spring mvc项目快速搭建
Spring mvc源码路径如下:highlight_springmvc4工程中的com.wisely.highlight_springmvc4下.
//maven中需要的依赖如下
//highlight_springmvc4/pom.xml
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!-- 其他web依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp.version}</version>
<scope>provided</scope>
</dependency>
<!-- Spring and Transactions -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!-- 使用SLF4J和LogBack作为日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
<!--对json和xml格式的支持 -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.5.3</version>
</dependency>
<!-- file upload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- 非必需,可简化IO操作 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.3</version>
</dependency>
//highlight_springmvc4/src/main/resources/logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="1 seconds">
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<jmxConfigurator/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>logbak: %d{HH:mm:ss.SSS} %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.springframework.web" level="DEBUG"/> <!-- 1 -->
<root level="info">
<appender-ref ref="console"/>
</root>
</configuration>
JSP所在位置:highlight_springmvc4/src/main/resources/views/index.jsp
springMVC配置:
//本例中包含了本节及后面章节的代码. 用到哪里介绍哪里.
@Configuration
@EnableWebMvc// 1
@EnableScheduling
@ComponentScan("com.wisely.highlight_springmvc4")
public class MyMvcConfig extends WebMvcConfigurerAdapter {// 2
//4.2 设置jsp后缀及jsp路径
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/classes/views/");
viewResolver.setSuffix(".jsp");
viewResolver.setViewClass(JstlView.class);
return viewResolver;
}
//4.4.1 静态资源映射
//assets/** 对外访问路径
//classpath:/assets/ 文件所在路径. /src/main/resources/assets
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations(
"classpath:/assets/");// 3
}
//4.4.2 配置拦截器Bean,和4.4.2 DemoInterceptor搭配使用
@Bean
// 1
public DemoInterceptor demoInterceptor() {
return new DemoInterceptor();
}
//4.4.2 重写addInterceptors,注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {// 2
registry.addInterceptor(demoInterceptor());
}
//4.4.4-1 ViewControllers写法
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("/index");
registry.addViewController("/toUpload").setViewName("/upload");
registry.addViewController("/converter").setViewName("/converter");
registry.addViewController("/sse").setViewName("/sse");
registry.addViewController("/async").setViewName("/async");
}
//4.4.4-2 路径匹配参数配置
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
}
//4.5.1 文件上传
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(1000000);
return multipartResolver;
}
//4.5.2 自定义HttpMessageConverter
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(converter());
}
//4.5.2 自定义HttpMessageConverter
@Bean
public MyMessageConverter converter(){
return new MyMessageConverter();
}
}
//InternalResourceViewResolver继承/实现直到ViewResolver
public class InternalResourceViewResolver extends UrlBasedViewResolver {}
public class UrlBasedViewResolver extends AbstractCachingViewResolver implements Ordered {}
public abstract class AbstractCachingViewResolver extends WebApplicationObjectSupport implements ViewResolver {}
public interface ViewResolver {
View resolveViewName(String viewName, Locale locale) throws Exception;
}
//源码中JstlView的继承/实现到View
public class JstlView extends InternalResourceView {}
public class InternalResourceView extends AbstractUrlBasedView {}
public abstract class AbstractUrlBasedView extends AbstractView implements InitializingBean {}
public abstract class AbstractView extends WebApplicationObjectSupport implements View, BeanNameAware {}
public interface View {}
//1WebApplicationInitializer是Spring提供用来配置Servlet3.0+配置的接口,替代web.xml,实现此接口将会被自动被SpringServletContainerInitializer(用来启动Servlet3.0容器)获取到.
public class WebInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(MyMvcConfig.class);
ctx.setServletContext(servletContext); //2
Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); //3
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
servlet.setAsyncSupported(true);//1
}
}
//WebApplicationInitializer源码如下:
public interface WebApplicationInitializer {
/**
* Configure the given {@link ServletContext} with any servlets, filters, listeners
* context-params and attributes necessary for initializing this web application. See
* examples {@linkplain WebApplicationInitializer above}.
* @param servletContext the {@code ServletContext} to initialize
* @throws ServletException if any call against the given {@code ServletContext}
* throws a {@code ServletException}
*/
void onStartup(ServletContext servletContext) throws ServletException;
}
4.3 Spring mvc常用注解
@EnableWebMvc 开启SpringMvc,及一些默认配置
@Controller 声明为一个控制器
@RequestMapping 配置URL和方法之间的映射,支持servlet的reqeust和response作为配置参数
@ResponseBody 支持将返回值放在response体内,ajax时返回数据而不是页面.
@RequestBody 允许request的参数放在reqeust体中,而不是直接链接在地址后面.此注解放置在参数前.
@PathVariable 用来接收参数,如/news/001,可接收001作为参数,此注解放置在参数前.
@RestController 组合注解,组合@Controller和ResponseBody.
//示例1
@Controller // 1控制内
@RequestMapping("/anno") //2映射路径
public class DemoAnnoController {
@RequestMapping(produces = "text/plain;charset=UTF-8") // 3定制返回类型和字符集
public @ResponseBody String index(HttpServletRequest request) { // 4接收request参数
return "url:" + request.getRequestURL() + " can access";
}
@RequestMapping(value = "/pathvar/{str}", produces = "text/plain;charset=UTF-8")// 5接收路径参数,用在restful风格
public @ResponseBody String demoPathVar(@PathVariable String str, //3
HttpServletRequest request) {
return "url:" + request.getRequestURL() + " can access,str: " + str;
}
@RequestMapping(value = "/requestParam", produces = "text/plain;charset=UTF-8") //6 接收url参数
public @ResponseBody String passRequestParam(Long id,
HttpServletRequest request) {
return "url:" + request.getRequestURL() + " can access,id: " + id;
}
@RequestMapping(value = "/obj", produces = "application/json;charset=UTF-8")//7 解释参数到对象
@ResponseBody //8 返回数据也不是页面
public String passObj(DemoObj obj, HttpServletRequest request) {
return "url:" + request.getRequestURL()
+ " can access, obj id: " + obj.getId()+" obj name:" + obj.getName();
}
@RequestMapping(value = { "/name1", "/name2" }, produces = "text/plain;charset=UTF-8")//9 支持name1和name2
public @ResponseBody String remove(HttpServletRequest request) {
return "url:" + request.getRequestURL() + " can access";
}
}
@RestController //1 rest的哦控制器
@RequestMapping("/rest")
public class DemoRestController {
@RequestMapping(value = "/getjson",
produces={"application/json;charset=UTF-8"}) //2 返回为json(application/json)
public DemoObj getjson (DemoObj obj){
return new DemoObj(obj.getId()+1, obj.getName()+"yy");//3 对象自动转成json
}
@RequestMapping(value = "/getxml",
produces={"application/xml;charset=UTF-8"})//4 返回为json(application/xml)
public DemoObj getxml(DemoObj obj){
return new DemoObj(obj.getId()+1, obj.getName()+"yy");//5对象自动转成xml
}
}
4.4 Spring mvc高级配置
4.4.1 静态资源
详细查看4.2中的MyMvcConfig.java中的4.4.1介绍.
4.4.2 拦截器配置
Interceptor 拦截器.可让普通的Bean实现HandleInterceptor接口或者继承HandleInterceptorAdapter来实现自定义拦截器.
通过重写WebMvcConfigurerAdapter的addInterceptors方法来注册自定义的拦截器.
代码示例:
““
DemoInterceptor继承HandlerInterceptorAdapter,重写preHandle和postHandle
配合看4.2中的MyMvcConfig.java中的4.4.2一起使用.
public class DemoInterceptor extends HandlerInterceptorAdapter {//1继承
@Override
public boolean preHandle(HttpServletRequest request, //2在请求发生前执行
HttpServletResponse response, Object handler) throws Exception {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
return true;
}
@Override
public void postHandle(HttpServletRequest request, //3在请求完成后执行
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
long startTime = (Long) request.getAttribute("startTime");
request.removeAttribute("startTime");
long endTime = System.currentTimeMillis();
System.out.println("本次请求处理时间为:" + new Long(endTime - startTime)+"ms");
request.setAttribute("handlingTime", endTime - startTime);
}
}
““
4.4.3 @ControllerAdvice
控制器建言(增强).可以对Controller参数/异常做controller执行前的处理.
@ControllerAdvice 将控制器的全局配置放置在同一个位置,注解了@ControllerAdvice的方法可用@ExceptionHandler,@InitBinder,@ModelAttribute注册到方法上,对所有注解了@RequestMapping的控制器内有效.
@ExceptionHandler :用于全局处理控制器里的异常. value属性设置可以过滤拦截的条件.
@InitBinder 用来设置WebDataBinder,WebDataBinder用来自动绑定前台请求参数到Model中. 比如设置将某个参数值置空.
@ModelAttribute 绑定键值对到Model里.
4.4.4 其它配置
1) ViewController
RequestMapping和return string的函数写法.
源码查看: 4.2 中的MyMvcConfig的 4.4.4-1
2) 路径匹配参数配置
设置路径参数中的.字符不被忽略.
源码查看: 4.2 中的MyMvcConfig的 4.4.4-2
更多配置,查看WebMvcConfigurerAdapter的API和WebMvcConfigurer
源码中:WebMvcConfigurerAdapter implements WebMvcConfigurer
4.5 Spring mvc的高级配置
4.5.1 文件上传
引入commons-fileupload和commons-io,查看4.2中的pom.xml
查看源码:/highlight_springmvc4/com.wisely.highlight_springmvc4.web.ch4_5.UploadController.java,和4.2中的MyMvcConfig的的4.5.1 文件上传.
4.5.2 自定义HttpMessageConverter
HttpMessageConverter 用来处理request和response里的数据.
内置了大量HttpMessageConverter: MappingJackson2HttpMessageConverter,StringHttpMessageConverter等.
示例可以自定义一种MediaType,然后MyMvcConfig中实现相关方法注册,然后自定义该类Message的处理方法.实现自动转换.
//com.wisely.highlight_springmvc4.messageconverter.MyMessageConverter.java及MyMvcConfig.java
//highlight_springmvc4/src/main/resources/views/converter.jsp
//highlight_springmvc4/src/main/java/com/wisely/highlight_springmvc4/web/ch4_5/ConverterController.java
4.5.3 服务器端推送技术
1)SSE
支持Chrome,FireFox等,EventSource是SSE的客户端,添加SSE客户端监听,然后到等待服务端推送消息.
//highlight_springmvc4/src/main/java/com/wisely/highlight_springmvc4/web/ch4_5/SseController.java
//highlight_springmvc4/src/main/resources/views/sse.jsp
2)Servlet3.0+异步方法处理
DeferredResult.
步骤有:开启异步方法支持,打开计划配置,Service定义DeferredResult,计划任务定时为DeferredResult.
highlight_springmvc4/src/main/java/com/wisely/highlight_springmvc4/web/ch4_5/AysncController.java
highlight_springmvc4/src/main/java/com/wisely/highlight_springmvc4/service/PushService.java
highlight_springmvc4/src/main/java/com/wisely/highlight_springmvc4/WebInitializer.java
highlight_springmvc4/src/main/resources/views/async.jsp
4.6 Spring mvc测试
Servlet模拟对象 MockMVC,MockHttpServletRequest,MockHttpServletResponse,MockHttpSession.
JUnit和Spring TestContextFramework
/highlight_springmvc4/src/main/java/com/wisely/highlight_springmvc4/service/DemoService.java
/highlight_springmvc4/src/main/java/com/wisely/highlight_springmvc4/web/ch4_6/NormalController.java
/highlight_springmvc4/src/main/java/com/wisely/highlight_springmvc4/web/ch4_6/MyRestController.java
/highlight_springmvc4/src/test/java/com/wisely/highlight_springmvc4/web/ch4_6/TestControllerIntegrationTests.java
5.Spring Boot基础
6.Spring Boot核心
7.Spring Boot的Web开发
8.Spring Boot的数据访问
9.Spring Boot的企业级开发
10.Spring Boot开发部署与测试
11.Spring 应用监控
Spring Boot有四大神器,分别是auto-configuration、starters、cli、actuator