美文网首页
四、Srin Boot与Web

四、Srin Boot与Web

作者: 紫雨杰 | 来源:发表于2018-05-04 18:36 被阅读0次

1、简介

    使用SpringBoot;
          1)、创建SpringBoot应用,选中我们需要的模块;
          2)、SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来
          3)、自己编写业务代码;

2、SpringBoot对静态资源的映射规则(查看源码WebMvcAutoConfiguration);

  1)、所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源;

      ●  webjars:以jar包的方式引入静态资源; 【可以去这个网站去找webjars静态资源:http://www.webjars.org/】

         例如:<!‐‐引入jquery‐webjar‐‐>在访问的时候只需要写webjars下面资源的名称即可
                      <dependency>
                              <groupId>org.webjars</groupId>
                              <artifactId>jquery</artifactId>
                              <version>3.3.1</version>
                      </dependency>

  访问:localhost:8080/webjars/jquery/3.3.1/jquery.js ,就可以访问到jQuery
webjars引入Jquery.png
  2)、"/**" 访问当前项目的任何资源,都去(静态资源的文件夹)找映射

            "classpath:/META‐INF/resources/",
            "classpath:/resources/",
            "classpath:/static/",
            "classpath:/public/"
            "/":当前项目的根路径

      localhost:8080/abc === 去静态资源文件夹里面找abc


  3)、欢迎页; 静态资源文件夹下的所有index.html页面;被"/**"映射;

             localhost:8080/         找index页面

  4)、所有的 **/favicon.ico 都是在静态资源文件下找;

3、模板引擎

   1、模板引擎有:JSP、Velocity、Freemarker、Thymeleaf

★ 2、SpringBoot推荐的Thymeleaf;语法更简单,功能更强大;

   3、Thymeleaf 的使用
        ①、导入Thymeleaf 的依赖
                      <dependency>
                             <groupId>org.springframework.boot</groupId>
                             【默认是2.1.6版本,现在都有3以上版本了(可以查看Thymeleaf github中的文档)】
                             <artifactId>spring‐boot‐starter‐thymeleaf</artifactId>
                      </dependency>

          切换thymeleaf版本的方法:

                      <properties>
                             <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
                             <!‐‐ 布局功能的支持程序 thymeleaf3主程序,对应的 layout2以上版本 ‐‐>
                             <!‐‐ thymeleaf2 对应的 layout1‐‐>
                             <thymeleaf‐layout‐dialect.version>2.2.2</thymeleaf‐layout‐dialect.version>
                      </properties>

        ②、Thymeleaf使用

                @ConfigurationProperties(prefix = "spring.thymeleaf")
                public class ThymeleafProperties {
                      private static final Charset DEFAULT_ENCODING = Charset.forName("UTF-8");

                      private static final MimeType DEFAULT_CONTENT_TYPE = MimeType.valueOf("text/html");

                      public static final String DEFAULT_PREFIX = "classpath:/templates/";

                      public static final String DEFAULT_SUFFIX = ".html";

          ● 查看源码,由ThymeleafProperties 类可知,只要把HTML页面放在classpath:/templates/,thymeleaf 就能自动渲染;

       ③、导入thymeleaf的名称空间

                    <html lang="en" xmlns:th="http://www.thymeleaf.org">

  4、语法规则(查看Thymeleaf的官方文档)
        1)、th:text;改变当前元素里面的文本内容;

             th:任意html属性;来替换原生属性的值

       2)、常用的有:
            th:replace、th:each、th:if、th:switch、th:case、th:value、th:href、th:src、
            th:text【转义特殊字符】、th:utext【不转义特殊字符】
        
       3)、支持表达式
            ①、Simple expressions:(表达式语法)
                        ● Variable Expressions: ${...}:获取变量值;OGNL;
                                   1)、获取对象的属性、调用方法
                                   2)、使用内置的基本对象(比如从request,session等内置对象中取数据)
                                   3)、内置的一些工具对象(比如使用arrays工具类进行一些操作 )

                        ● Selection Variable Expressions: *{...}:选择表达式:和${}在功能上是一样
                                 <div th:object="${session.user}">
                                 <p>Name: <span th:text="*{firstName}">Sebastian</span></p>
                                 等价于
                                  <p>Name: <span th:text="${session.user.firstName}">Sebastian</span></p>

                        ● Message Expressions: #{...}:获取国际化内容

                        ● Link URL Expressions: @{...}:定义URL;
                                  @{/order/process(execId=${execId},execType='FAST')}

                        ● Fragment Expressions: ~{...}:片段引用表达式
                                  <div th:insert="~{commons :: main}">...</div>

            ②、Literals(字面量)
                          Text literals: 'one text' , 'Another one!' ,…
                          Number literals: 0 , 34 , 3.0 , 12.3 ,…
                          Boolean literals: true , false
                          Null literal: null
                          Literal tokens: one , sometext , main ,…
            ③、Text operations:(文本操作)
                          String concatenation: +
                          Literal substitutions: |The name is ${name}|
            ④、Arithmetic operations:(数学运算)
                          Binary operators: + , ‐ , * , / , %
            ⑤、Boolean operations:(布尔运算)
                          Binary operators: and , or
                          Boolean negation (unary operator): ! , not
           ⑥、Comparisons and equality:(比较运算)
                          Comparators: > , < , >= , <= ( gt , lt , ge , le )
                          Equality operators: == , != ( eq , ne )
            ⑦、Conditional operators:条件运算(三元运算符)
                          If‐then: (if) ? (then)
                          If‐then‐else: (if) ? (then) : (else)
                          Default: (value) ?: (defaultvalue)

4、如何修改SpringBoot的默认配置

  模式:
    1)、SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component),如果有就用用户配置的,
         如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来;

    2)、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置

    3)、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置              

8、配置嵌入式Servlet容器

  SpringBoot默认使用Tomcat作为嵌入式的Servlet容器;
Springboot内嵌的tomcat.png
1)、如何定制和修改Servlet容器的相关配置;

      方法1、修改和server有关的配置(ServerProperties实现了【EmbeddedServletContainerCustomizer】);
             
               ●  server.xxx           //通用的Servlet容器设置
               ●  server.tomcat.xxx       //通用的Tomcat的设置

           例如:
                  server.port=8081
                  server.context‐path=/crud
                  server.tomcat.uri‐encoding=UTF‐8

      方法2、编写一个EmbeddedServletContainerCustomizer:嵌入式的Servlet容器的定制器;来修改Servlet容器的配置

                @Bean //一定要将这个定制器加入到容器中
                public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){
                      return new EmbeddedServletContainerCustomizer() {
                                  //定制嵌入式的Servlet容器相关的规则
                                  @Override
                                  public void customize(ConfigurableEmbeddedServletContainer container) {
                                                container.setPort(8083);
                                  }
                      };
                }

            
2)、注册Servlet三大组件【Servlet、Filter、Listener】    

      由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。
      
    ▲ 注册三大组件用以下方式      

    ①、ServletRegistrationBean

              //注册三大组件
              @Bean
              public ServletRegistrationBean myServlet(){
                  ServletRegistrationBean registrationBean = new ServletRegistrationBean(newMyServlet(),"/myServlet"); 
                  return registrationBean;
              }


    ②、FilterRegistrationBean

                  @Bean
                  public FilterRegistrationBean myFilter(){
                          FilterRegistrationBean registrationBean = new FilterRegistrationBean();
                          registrationBean.setFilter(new MyFilter());
                          registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
                          return registrationBean;
                  }


    ③、ServletListenerRegistrationBean

                  @Bean
                  public ServletListenerRegistrationBean myListener(){
                          ServletListenerRegistrationBean<MyListener> registrationBean = new
                          ServletListenerRegistrationBean<>(new MyListener());
                          return registrationBean;
                  }

   ●  SpringBoot帮我们自动配置SpringMVC的时候,自动的注册SpringMVC的前端控制器:DispatcherServlet;
   ●  DispatcherServletAutoConfiguration中:就使用 ServletRegistrationBean 注册

          @Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
          @ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)              
          public ServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
                ServletRegistrationBean registration = new ServletRegistrationBean(
                      dispatcherServlet, this.serverProperties.getServletMapping());
           
                 //默认拦截: / 所有请求;包静态资源,但是不拦截jsp请求; /*会拦截jsp
                //可以通过server.servletPath来修改SpringMVC前端控制器默认拦截的请求路径
                registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
                registration.setLoadOnStartup(
                this.webMvcProperties.getServlet().getLoadOnStartup());
                if (this.multipartConfig != null) {
                      registration.setMultipartConfig(this.multipartConfig);
                }
                return registration;
          }


3)、SpringBoot能支持其他的Servlet容器,替换为其他嵌入式Servlet容器

            ● Tomcat(默认使用)

            ● Jetty(长连接)

            ● Undertow(不支持JSP)

    ▲ 引入方法:引入web模块,因为默认就是使用嵌入式的Tomcat作为Servlet容器,所以需要在web模块使用exclusions标签排除tomcat,
               然后引入引入其它的Servlet容器

4)、嵌入式Servlet容器自动配置原理;
         步骤:
         1)、SpringBoot根据导入的依赖情况,给容器中添加相应的EmbeddedServletContainerFactory
             【TomcatEmbeddedServletContainerFactory】;

         2)、容器中某个组件要创建对象就会惊动后置处理器;EmbeddedServletContainerCustomizerBeanPostProcessor;
             只要是嵌入式的Servlet容器工厂,后置处理器就工作;

         3)、后置处理器从容器中获取所有的EmbeddedServletContainerCustomizer,调用定制器的定制方法
SpringBoot支持的三个容器.png

9、使用外置的Servlet容器

    1)、嵌入式Servlet容器:应用打成可执行的jar

    2)、优点:简单、便携;

    3)、缺点:默认不支持JSP、优化定制比较复杂(使用定制器【ServerProperties、自定义EmbeddedServletContainerCustomizer】,
         自己编写嵌入式Servlet容器的创建工厂【EmbeddedServletContainerFactory】);

    4)、外置的Servlet容器:外面安装Tomcat---应用war包的方式打包;

    5)、步骤
        ①、必须创建一个war项目;(利用idea创建好目录结构)
        ②、将嵌入式的Tomcat指定为provided;

                    <dependency>
                          <groupId>org.springframework.boot</groupId>
                          <artifactId>spring‐boot‐starter‐tomcat</artifactId>
                          <scope>provided</scope>
                    </dependency>


        ③、必须编写一个SpringBootServletInitializer的子类,并调用configure方法

              public class ServletInitializer extends SpringBootServletInitializer {
                   @Override
                   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
                         //传入SpringBoot应用的主程序
                         return application.sources(SpringBoot04WebJspApplication.class);
                   }
              }

  6)、启动服务器就可以使用;

相关文章

网友评论

      本文标题:四、Srin Boot与Web

      本文链接:https://www.haomeiwen.com/subject/fkfslftx.html