Spring Boot实战学习笔记2


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继承/实现直到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

12.分布式系统开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值