spring-booter-starter-web是spring-boot web发开的核心,自动配置信息存储在spring-boot-autoconfigure.jar 下面的web目录里面,包含了各种web自动配置,例如

ServerPropertiesAutoConfiguration  ServerProperties 自动配置servlet容器

HttpEncodingAutoConfiguration 和 HttpEncodingProperties 用来自动配置http编码

MultipartAutoConfiguration   MultipartProperties 配置上传文件的属性

WebMvnAutoConfiguration WebMvcProperties 配置spring mvc

1   Thymeleaf 模版引擎

spring-boot 可以使用jsp,但是内嵌的tomcat和jetty 不支持以jar的形式运行jsp,Undertow不支持jsp;同时spring-boot提供了很多模版引擎,包括常用的freemaker等,最推荐实用的是Thymeleaf,它提供了完美的springmvc支持。Thymeleaf是一个java类库,是一个xml/xhtml/html5的模版引擎,可以视为mvc的web应用的view层,完全可以替代jsp。

2 集成spring mvc

在springmvc中,当对springmvc控制的资源发起请求时,这些请求会被springmvc的DispatherServlet处理,分析出HanderMapping中合适的映射,然后取得handlerAdapter 处理该handler,处理完了返回一个ModelAndView对象,最后把这个对象渲染成view返回给用户。渲染的过程是靠ViewResolver和View进行的,ModelAndView中不包含真正的试图,只返回一个逻辑试图名称,ViewResolver就会根据逻辑视图名称解析出真正的view对象,最后view对象进行视图渲染返回给浏览器。项目中ViewResolver常用于配置路径前缀和后缀。  例如freemaker的viewresolver

<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="contentType" value="text/html; charset=UTF-8"/>
<property name="cache" value="true"/>
<property name="prefix" value="WEB-INF/pages/"/>
<property name="suffix" value=".ftl"/>
</bean>

在spring-boot中,Thymeleaf定义了ThymeleafView(默认view)和 ThymeleafViewResolver以及通用的SpringTemplateEngine(引擎里放置TemplateResolver),还提供了TemplateResolver用来设置通用的模版引擎(比如设置路径前后缀不用区分哪种模版)。

可以不用手动配置,自动注入autoconfigure.thymeleaf中对Thymeleaf进行了自动配置,包括了上面的TemplateResolver ThymeleafViewResolver SpringTemplateEngine ,在对应的properties文件中,可以看到各种默认属性配置如图

代码中可以根据参数设置如下 ,action中使用model跟spring mvc一样。

spring.thymeleaf.prefix=classpath:/pages/
spring.thymeleaf.suffix=.html

(1) springboot 会自动配置springmvc的resolver,WebMvcAutoConfiguration 里面有自动配置。

1)ContentNegotiatinViewResolver  一个特殊的resolver,不自己处理View,而是交给其他resolver处理,具有最高优先级,原理是拿到并遍历所有resolver,根据contenttype选择需要的resolver,resolver能处理什么杨的contentType,可以设置在 spring.thymeleaf.content-type=text/html,默认都是这种页面类型。如果多个resolver都能处理同一个contenttype,那么选取优先级最高的那一个。

2)BeanNameViewResolver  根据名称选择使用的resolver。action中返回一个字符串,这个字符串对应生成resolver bean的方法名,如下图。在action中,返回“jsonView”

3)InternalResourceViewResolver  spring mvc最常用的resolver,通常用来设置前后缀等。但是在spring-boot里有坑。因为这个resolver的跳转(forward dispatcher)是基于webinf的,而spring-boot的根目录是classpath,所以这个resolver跳转不到配置的classpath页面。如果实在想用,需要加上web-inf,mvn设置成打war包,路径写在webinf下,使用外部tomcat容器启动才行。 非常强烈推荐使用thymeleaf自己的resolver。这也是spring-boot不推荐使用jsp的原因,必须打成war包,而其他模版都是jar war都可。

(2)如果spring mvc 自带的配置不符合要求,可以通过一个配置类(@Configuration) 加上@EnableWebMvc 注解 来完全控制自己的mvc配置。如果只想拓展springmvc的额外配置,可以定义配置类继承WebMvcConfigurerAdapter ,无需使用@EnableWebMvc,例如重写 addViewControllers,用于不经过controller直接跳转页面,springboot 配置'/' 映射到'index.html',自己配置的跳转也同时有效,推荐这种写法。

(3)注册servlet,filter,listener

spring boot提供两种方法配置这些,一种是在类前面加 @WebServlet  @WebListener @WebFilter  (都要加配置路径),然后配置一个scan,@Import(ServletComponentScanRegistrar.class),可以配置要扫描的包 ,最后在入口处加上@ServletComponentScan,即可扫描配置的内容。

另一种推荐配置,是@component 实现filter,然后在一个配置类里 @Bean 注册一个FilterRegistrationBean,这个bean里配置名字,url路径等。非常重要的一点就是,filter的执行顺序和配置类@bean的从上到下配置顺序一致,类似xml里从上到下那种顺序。

(4) 配置tomcat

用代码可以配置servlet信息,如果要配置通用的servlet,可以注册一个实现EmbeddedServletContannerCustomizer接口的bean ;如果想要单独配置tomcat ,jetty,undertow,就定一个bean 返回 TomcatEmbeddedServletContannerFactory,JettyEmbeddedServletContannerFactory,UndetowEmbeddedServletContannerFactory,里面可以配置端口,session时间等。但是更方便的是直接在外部文件里配置server.port等,注意如果同时配置,文件里的配置优先级会高于代码优先级。如果像替换tomcat,那么在spring-boot-starter-web里面排除掉spring-boot-starter-tomcat依赖,加上spring-boot-starter-jetty依赖即可。

spirng boot web配置开发的更多相关文章

  1. Spring Boot Web应用开发 CORS 跨域请求支持:

    Spring Boot Web应用开发 CORS 跨域请求支持: 一.Web开发经常会遇到跨域问题,解决方案有:jsonp,iframe,CORS等等CORS与JSONP相比 1. JSONP只能实现 ...

  2. Spring Boot Web应用开发 CORS 跨域请求支持

    一.Web开发经常会遇到跨域问题,解决方案有:jsonp,iframe,CORS等等 CORS与JSONP相比 1. JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求. 2. 使用C ...

  3. spring boot ---web应用开发-错误处理

    一.错误的处理 方法一:Spring Boot 将所有的错误默认映射到/error, 实现ErrorController @Controller @RequestMapping(value = &qu ...

  4. Springboot 系列(六)Spring Boot web 开发之拦截器和三大组件

    1. 拦截器 Springboot 中的 Interceptor 拦截器也就是 mvc 中的拦截器,只是省去了 xml 配置部分.并没有本质的不同,都是通过实现 HandlerInterceptor ...

  5. Springboot 系列(五)Spring Boot web 开发之静态资源和模版引擎

    前言 Spring Boot 天生的适合 web 应用开发,它可以快速的嵌入 Tomcat, Jetty 或 Netty 用于包含一个 HTTP 服务器.且开发十分简单,只需要引入 web 开发所需的 ...

  6. 四、Spring Boot Web开发

    四.Web开发 1.简介 使用SpringBoot: 1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可 ...

  7. 4.Spring Boot web开发

    1.创建一个web模块 (1).创建SpringBoot应用,选中我们需要的模块: (2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来 (3).自己编 ...

  8. spring boot web相关配置

    spring boot集成了servlet容器,当我们在pom文件中增加spring-boot-starter-web的maven依赖时,不做任何web相关的配置便能提供web服务,这还得归于spri ...

  9. Springboot 系列(七)Spring Boot web 开发之异常错误处理机制剖析

    前言 相信大家在刚开始体验 Springboot 的时候一定会经常碰到这个页面,也就是访问一个不存在的页面的默认返回页面. 如果是其他客户端请求,如接口测试工具,会默认返回JSON数据. { &quo ...

随机推荐

  1. JAVA实现多线程的四种方式

    JAVA多线程实现方式: 1.继承Thread类(无返回值) 2.实现Runnable接口(无返回值) 3.实现Callable接口,通过FutureTask包装器来创建Threak线程(有返回值) ...

  2. ural 2012 About Grisha N.(水)

    2012. About Grisha N. Time limit: 1.0 secondMemory limit: 64 MB Grisha N. told his two teammates tha ...

  3. ural 1039 树dp

    http://acm.timus.ru/problem.aspx?space=1&num=1039 1039. Anniversary Party Time limit: 0.5 second ...

  4. IDT 查询 hana SQL 聚合问题。

    因为业务需要,用HANA的数据做成DASHBOARD.工厂运营概况.结果发现奇怪的问题.明明是一个类型的但是不会聚合.(数据量特别大,一个月的应该就一条,但是有几千条做不下去.) 比如车辆类型是 焊装 ...

  5. 09-THREE.JS 物体缩放,坐标,旋转,位移,是否可见

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...

  6. Mybatis_总结_06_用_插件开发

    一.前言 Mybatis采用责任链模式,通过动态代理组织多个插件(拦截器),通过这些插件可以改变Mybatis的默认行为(诸如SQL重写之类的),由于插件会深入到Mybatis的核心,因此在编写自己的 ...

  7. 配合Jenkins自动化构建,bat脚本(二)

    批量通过模板,拷贝文件,然后替换模板文件中的标记位为预制的内容. 1 Set servicePath=Ehong.MedicareReview.Web\地区配置\ Set webPath=Ehong. ...

  8. Java 利用Gson将json字符串转换为List<Map<String, String>>

    json字符串类似于: [ { "userPhone": "123", "userNo": "123-2", " ...

  9. [独孤九剑]Oracle知识点梳理(十)%type与%rowtype及常用函数

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  10. 类和对象(12)—— this指针

    首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针: ...