Spring Boot实战学习笔记2
来源:互联网 发布:用c语言写九九乘法口诀 编辑:程序博客网 时间:2024/05/22 00:26
title: Spring Boot实战学习笔记2
tags:Spring Boot实战
grammar_cjkRuby: true
摘要
本文为学习Spring Boot实战的学习笔记,学习了一遍,但是好记性不如烂笔头,所以文章记录下来。图书购买地址为: https://item.jd.com/11894632.html.
Spring Boot实战学习笔记1
Spring Boot实战学习笔记2
Spring Boot实战学习笔记3
Spring Boot实战学习笔记4
Spring Boot实战学习笔记5
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继承/实现直到ViewResolverpublic 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的继承/实现到Viewpublic 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继承
@Overridepublic boolean preHandle(HttpServletRequest request, //2在请求发生前执行 HttpServletResponse response, Object handler) throws Exception { long startTime = System.currentTimeMillis(); request.setAttribute("startTime", startTime); return true;}@Overridepublic 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.javahighlight_springmvc4/src/main/java/com/wisely/highlight_springmvc4/service/PushService.javahighlight_springmvc4/src/main/java/com/wisely/highlight_springmvc4/WebInitializer.javahighlight_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
12.分布式系统开发
- Spring Boot实战学习笔记2
- Spring Boot实战学习笔记1
- Spring Boot实战学习笔记3
- Spring Boot实战学习笔记4
- Spring Boot实战学习笔记5
- spring boot实战笔记
- Spring Boot实战笔记
- spring-boot学习笔记2
- spring-boot学习笔记
- Spring Boot学习笔记
- Spring Boot学习笔记
- spring boot 学习笔记
- Spring Boot学习笔记
- Spring Boot学习笔记
- Spring Boot 学习笔记
- spring boot学习笔记
- Spring Boot 学习笔记
- Spring Boot 学习笔记(-)
- 一篇文章搞懂人脸识别的十个概念
- ssm框架的细枝末节之批量删除
- ATM(异步传输模式)
- 全面解析Linux 内核 3.10.x
- SONET/SDH
- Spring Boot实战学习笔记2
- 10-rabbitmq-消息主题-spring
- live555学习之基本类介绍及计划任务深度探讨
- 303 Range Sum Query
- SpringMVC面试
- MYSQL基础
- linux使用ss的网络配置
- Spring面试
- 用于 Android 开发的 Kotlin:是重量级语言还是毫无意义的炒作?