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.分布式系统开发

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 月经停了两个月怎么办 别人诬告我我该怎么办 有人造谣我我该怎么办 宝宝晚上不睡觉哭闹怎么办 婴儿晚上不睡觉哭闹怎么办 2月宝宝排便困难怎么办 3岁宝宝老是哭闹怎么办 2岁了囟门闭合晚怎么办 宝宝卤门闭合慢怎么办 手经常碰水脱皮怎么办 迅雷文件已移除怎么办 手机不读sd卡怎么办 g买卖卖错账号怎么办 森林被野人拖走怎么办 我的世界没有羊怎么办 黑魂3杀死铁匠后怎么办 幻境7下8走错了怎么办 换了手机号微信怎么办 微信游戏没了怎么办 找sf网站被劫持怎么办 护发精油抹多了怎么办 用了护发素洗头怎么办 电脑c盘空间不足怎么办 把水蛭吃肚子里怎么办 不小心喝到蚂蟥怎么办 水蛭喝进肚子里怎么办 蚂蝗钻入皮肤里怎么办 孩子屁眼红疼怎么办啊 宝宝屁眼红疼怎么办4岁 屁股眼上火很疼怎么办 屁股上火了很痛怎么办 脚被虫子咬肿了怎么办 人在低谷的时候怎么办 支付宝忘了密码怎么办 忘了支付宝账号怎么办 支付宝账号丢了怎么办 生完孩子奶水不足怎么办 生完宝宝没奶水怎么办 生完三天没奶水怎么办 生完孩子奶头小怎么办 生完孩子没有奶水怎么办