zoukankan      html  css  js  c++  java
  • SpringBoot Web开发

    1、简介

    使用SpringBoot;

    1)、创建SpringBoot应用,选中我们需要的模块;

    2)、SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来

    3)、自己编写业务代码;

    自动配置原理?

    这个场景SpringBoot帮我们配置了什么?能不能修改?能修改哪些配置?能不能扩展?Xxx

    xxxxAutoConfiguration:帮我们给容器中自动配置组件;
    
    xxxxProperties:配置类来封装配置文件的内容;

    看这个jar下面

    2、SpringBoot对静态资源的访问规则

    Spring mvc的相关配置都在WebMvcAutoConfiguration里面

        public WebMvcAutoConfigurationAdapter(ResourceProperties resourceProperties,
                    WebMvcProperties mvcProperties, ListableBeanFactory beanFactory,
                    ObjectProvider<HttpMessageConverters> messageConvertersProvider,
                    ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider) {
                this.resourceProperties = resourceProperties;
                this.mvcProperties = mvcProperties;
                this.beanFactory = beanFactory;
                this.messageConvertersProvider = messageConvertersProvider;
                this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider
                        .getIfAvailable();
            }
    
    @ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)
    public class ResourceProperties {
           //可以设置和静态资源有关的参数,缓存时间等
        private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
                "classpath:/META-INF/resources/", "classpath:/resources/",
                "classpath:/static/", "classpath:/public/" };
      @Override
            public void addResourceHandlers(ResourceHandlerRegistry registry) {
                if (!this.resourceProperties.isAddMappings()) {
                    logger.debug("Default resource handling disabled");
                    return;
                }
                Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
                CacheControl cacheControl = this.resourceProperties.getCache()
                        .getCachecontrol().toHttpCacheControl();
              //静态资源文件夹映射 
                if (!registry.hasMappingForPattern("/webjars/**")) {
                    customizeResourceHandlerRegistration(registry
                            .addResourceHandler("/webjars/**")
                            .addResourceLocations("classpath:/META-INF/resources/webjars/")
                            .setCachePeriod(getSeconds(cachePeriod))
                            .setCacheControl(cacheControl));
                }
                String staticPathPattern = this.mvcProperties.getStaticPathPattern();
        
                if (!registry.hasMappingForPattern(staticPathPattern)) {
                    customizeResourceHandlerRegistration(
                            registry.addResourceHandler(staticPathPattern)
                                    .addResourceLocations(getResourceLocations(
                                            this.resourceProperties.getStaticLocations()))
                                    .setCachePeriod(getSeconds(cachePeriod))
                                    .setCacheControl(cacheControl));
                }
            }
        //配置欢迎页
        @Bean
            public WelcomePageHandlerMapping welcomePageHandlerMapping(
                    ApplicationContext applicationContext) {
                return new WelcomePageHandlerMapping(
                        new TemplateAvailabilityProviders(applicationContext),
                        applicationContext, getWelcomePage(),
                        this.mvcProperties.getStaticPathPattern());
            }
    
    
    //喜欢的图标
    @Configuration
            @ConditionalOnProperty(value = "spring.mvc.favicon.enabled", matchIfMissing = true)
            public static class FaviconConfiguration implements ResourceLoaderAware {
    
                private final ResourceProperties resourceProperties;
    
                private ResourceLoader resourceLoader;
    
                public FaviconConfiguration(ResourceProperties resourceProperties) {
                    this.resourceProperties = resourceProperties;
                }
    
                @Override
                public void setResourceLoader(ResourceLoader resourceLoader) {
                    this.resourceLoader = resourceLoader;
                }
    
                @Bean
                public SimpleUrlHandlerMapping faviconHandlerMapping() {
                    SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
                    mapping.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
                    mapping.setUrlMap(Collections.singletonMap("**/favicon.ico",
                            faviconRequestHandler()));
                    return mapping;
                }
    
                @Bean
                public ResourceHttpRequestHandler faviconRequestHandler() {
                    ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler();
                    requestHandler.setLocations(resolveFaviconLocations());
                    return requestHandler;
                }

    1)、所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源;
       webjars:以jar包的方式引入静态资源;

    http://www.webjars.org/

    localhost:8080/webjars/jquery/3.3.1/jquery.js

      <!--引入juqery依赖 访问的时候只需要写webjars下面资源的名称即可-->
            <dependency>
                <groupId>org.webjars</groupId>
                <artifactId>jquery</artifactId>
                <version>3.3.1</version>
            </dependency>

     2)、"/**" 访问当前项目的任何资源,都去(静态资源的文件夹)找映射

    "classpath:/META-INF/resources/", 
    "classpath:/resources/",
    "classpath:/static/", 
    "classpath:/public/" 
    "/":当前项目的根路径
    localhost:8080/abc === 去静态资源文件夹里面找abc

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

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

    localhost:8080/ 找index页面

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

     3、模板引擎

     JSP、Velocity、Freemarker、Thymeleaf

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

    1、使用Thymeleaf渲染页面

       引入pom依赖

     <!--引入thymeleaf依赖 依赖版本可以在GitHub上面去找 https://github.com/thymeleaf/thymeleaf/releases-->
             <dependency>
                <groupId>org.springframework.boot</groupId>
                 <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 = StandardCharsets.UTF_8;
    
        public static final String DEFAULT_PREFIX = "classpath:/templates/";
    
        public static final String DEFAULT_SUFFIX = ".html";

     只要我们把HTML页面放在classpath:/templates/,thymeleaf就能自动渲染;

    使用:

       1、导入thymeleaf的名称空间

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

     2、使用thymeleaf语法

    @RequestMapping("/getData")
    public String getData(Map<String,Object> map){
        map.put("name","hello");
        return "index";
    }
    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>哈哈</h1>
    <div th:text="${name}">这是显示欢迎信息</div>
    </body>
    </html>

     3、语法规则

    1)、th:text;改变当前元素里面的文本内容;

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

     

    2)、表达式?

    Simple expressions:(表达式语法)
        Variable Expressions: ${...}:获取变量值;OGNL;
         1)、获取对象的属性、调用方法        
         2)、使用内置的基本对象:        
         #ctx : the context object.            
         #vars: the context variables.
        #vars: the context variables.            
                    #locale : the context locale.
                    #request : (only in Web Contexts) the HttpServletRequest object.
                    #response : (only in Web Contexts) the HttpServletResponse object.
                    #session : (only in Web Contexts) the HttpSession object.
                    #servletContext : (only in Web Contexts) the ServletContext object.
                   
                    ${session.foo}
                3)、内置的一些工具对象:
    #execInfo : information about the template being processed.
    #messages : methods for obtaining externalized messages inside variables expressions, in the
    same way as they would be obtained using #{…} syntax.
    #uris : methods for escaping parts of URLs/URIs
    #conversions : methods for executing the configured conversion service (if any).
    #dates : methods for java.util.Date objects: formatting, component extraction, etc.
    #calendars : analogous to #dates , but for java.util.Calendar objects.
    #numbers : methods for formatting numeric objects.
    #strings : methods for String objects: contains, startsWith, prepending/appending, etc.
    #objects : methods for objects in general.
    #bools : methods for boolean evaluation.
    #arrays : methods for arrays.
    #lists : methods for lists.
    #sets : methods for sets.
    #maps : methods for maps.
    #aggregates : methods for creating aggregates on arrays or collections.
    #ids : methods for dealing with id attributes that might be repeated (for example, as a
    result of an iteration).
        Selection Variable Expressions: *{...}:选择表达式:和${}在功能上是一样;
         补充:配合 th:object="${session.user}:    
       <div th:object="${session.user}">
        <p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
        <p>Surname: <span th:text="*{lastName}">Pepper</span>.</p>
        <p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
        </div>
       
        Message Expressions: #{...}:获取国际化内容
        Link URL Expressions: @{...}:定义URL;
         @{/order/process(execId=${execId},execType='FAST')}        
        Fragment Expressions: ~{...}:片段引用表达式
         <div th:insert="~{commons :: main}">...</div>        

    SpringMVC的自动配置

           Spring MVC auto-configuration

               Spring Boot 自动配置好了SpringMVC

               以下是SpringBoot对SpringMVC的默认配置:(WebMvcAutoConfiguration)

              inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.     

                   1)自动配置了ViewResolver(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?))

                   2) ContentNegotiatingViewResolver:组合所有的视图解析器的;

          3)如何定制:我们可以自己给容器中添加一个视图解析器;自动的将其组合进来;

         @Bean
            @ConditionalOnBean({ViewResolver.class})
            @ConditionalOnMissingBean(
                name = {"viewResolver"},
                value = {ContentNegotiatingViewResolver.class}
            )
            public ContentNegotiatingViewResolver viewResolver(BeanFactory beanFactory) {
                ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
                resolver.setContentNegotiationManager((ContentNegotiationManager)beanFactory
    .getBean(ContentNegotiationManager.
    class)); resolver.setOrder(-2147483648); return resolver; }

     l Support for serving static resources, including support for WebJars (see below).静态资源文件夹路径,webjars

    l Static index.html support. 静态首页访问

    l Custom Favicon support (see below). favicon.ico

    l 自动注册了 of Converter, GenericConverter, Formatter beans.

    l Converter:转换器; public String hello(User user):类型转换使用ConverterFormatter 格式化器; 2017.12.17===Date;

    @Bean        
    @ConditionalOnProperty(prefix = "spring.mvc", name = "date‐format")//在文件中配置日期格
    式化的规则
           
    public Formatter<Date> dateFormatter() {        
    return new DateFormatter(this.mvcProperties.getDateFormat());//日期格式化组件            
    }

     自己添加的格式化器转换器,我们只需要放在容器中即可

    l Support for HttpMessageConverters (see below).

    (1) HttpMessageConverter:SpringMVC用来转换Http请求和响应的;User---Json;

    (2)HttpMessageConverters 是从容器中确定;获取所有的HttpMessageConverter;

    ==自己给容器中添加HttpMessageConverter,只需要将自己的组件注册容器中(@Bean,@Component)==

    l Automatic registration of MessageCodesResolver (see below).定义错误代码生成规则

    l Automatic use of a ConfigurableWebBindingInitializer bean (see below).

    ==我们可以配置一个ConfigurableWebBindingInitializer来替换默认的;(添加到容器)==

    初始化WebDataBinder;

    请求数据=====JavaBean;

    org.springframework.boot.autoconfigure.web:web的所有自动场景;

    If you want to keep Spring Boot MVC features, and you just want to add additional MVC configuration (interceptors, formatters, view controllers etc.) you can add your own @Configuration class of type WebMvcConfigurerAdapter, but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter or ExceptionHandlerExceptionResolver you can declare a WebMvcRegistrationsAdapter instance providing such components.If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc.

    SpringMVC的扩展

     以前的拦截器

    <mvc:view-controller path="/hello" view-name="success"/>
    <mvc:interceptors>
      <mvc:interceptor>
       <mvc:mapping path="/hello"/>
      <bean></bean>
    </mvc:interceptor>
    </mvc:interceptors>

    编写一个配置类(@Configuration),是WebMvcConfigurer类型;不能标注@EnableWebMvc;

    既保留了所有的自动配置,也能用我们扩展的配置;

    public class MyMVCConfig  implements WebMvcConfigurer{
    
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            // super.addViewControllers(registry);
            //浏览器发送 /atguigu 请求来到 success
            registry.addViewController("/atguigu").setViewName("/success");
        }
    } 

    原理:

    1)、WebMvcAutoConfiguration是SpringMVC的自动配置类
    2)、在做其他自动配置时会导入;@Import(EnableWebMvcConfiguration.class) 

    @Configuration
    public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration {
    private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
    //从容器中获取所有的WebMvcConfigurer
    @Autowired(required = false)
    public void setConfigurers(List<WebMvcConfigurer> configurers) {
        if (!CollectionUtils.isEmpty(configurers)) {
            this.configurers.addWebMvcConfigurers(configurers);
            //一个参考实现;将所有的WebMvcConfigurer相关配置都来一起调用;
            @Override
            // public void addViewControllers(ViewControllerRegistry registry) {
            //    for (WebMvcConfigurer delegate : this.delegates) {
            //       delegate.addViewControllers(registry);
            //   }
        }
    }

    3)、容器中所有的WebMvcConfigurer都会一起起作用;
    4)、我们的配置类也会被调用;
    效果:SpringMVC的自动配置和我们的扩展配置都会起作用

    全面接管springMVC

    SpringBoot对SpringMVC的自动配置不需要了,所有都是我们自己配置;所有的SpringMVC的自动配置都失效了
    我们需要在配置类中添加@EnableWebMvc即可;

    @Configuration
    @EnableWebMvc//使用WebMvcConfigurer可以来扩展SpringMVC的功能
    public class MyConfig implements WebMvcConfigurer {
    
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            //浏览器发送 /index 请求来到 success
           registry.addViewController("/index").setViewName("success");
        }
    }

    原理:
      为什么@EnableWebMvc自动配置就失效了;

       1)@EnableWebMvc的核心

    @Import(DelegatingWebMvcConfiguration.class)
    public @interface EnableWebMvc {
    }

            2)

    @Configuration
    public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {

     3)

    @Configuration
    @ConditionalOnWebApplication
    @ConditionalOnClass({ Servlet.class, DispatcherServlet.class,
    WebMvcConfigurerAdapter.class })        
    //容器中没有这个组件的时候,这个自动配置类才生效
    @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
    @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
    @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
    ValidationAutoConfiguration.class })        
    public class WebMvcAutoConfiguration {

    4)、@EnableWebMvc将WebMvcConfigurationSupport组件导入进来;
    5)、导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能;

    修改SpringBoot的默认配置

    模式:
    1)、SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如
    果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默
    认的组合起来;
    2)、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置
    3)、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置

    使用Freemarker模板引擎渲染Web视图

    pom文件

    <!-- 引入freeMarker的依赖包. -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>

    后台代码

    src/main/resources/创建一个templates文件夹,后缀*.ftl

        @RequestMapping("/index")
        public String index(Map<String, Object> map) {
            map.put("name","美丽的天使...");
            return "index";
        }

    前端代码

    <!DOCTYPE html>
    <html>
    <head lang="en">
    <meta charset="UTF-8" />
    <title></title>
    </head>
    <body>
          ${name}
    </body> 
    </html>

    freemarker配置

    新建application.properties文件

    ########################################################
    ###FREEMARKER (FreeMarkerAutoConfiguration)
    ########################################################
    spring.freemarker.allow-request-override=false
    spring.freemarker.cache=true
    spring.freemarker.check-template-location=true
    spring.freemarker.charset=UTF-8
    spring.freemarker.content-type=text/html
    spring.freemarker.expose-request-attributes=false
    spring.freemarker.expose-session-attributes=false
    spring.freemarker.expose-spring-macro-helpers=false
    #spring.freemarker.prefix=
    #spring.freemarker.request-context-attribute=
    #spring.freemarker.settings.*=
    spring.freemarker.suffix=.ftl
    spring.freemarker.template-loader-path=classpath:/templates/
    #comma-separated list
    #spring.freemarker.view-names= # whitelist of view names that can be resolved

    使用JSP渲染Web视图

    pom文件

        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.0.RELEASE</version>
        </parent>
        <dependencies>
            <!-- SpringBoot 核心组件 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
            </dependency>
        </dependencies>

    在application.properties创建以下配置

    spring.mvc.view.prefix=/WEB-INF/jsp/
    spring.mvc.view.suffix=.jsp

    后台代码

    @Controller
    public class IndexController {
    	@RequestMapping("/index")
    	public String index() {
    		return "index";
    	}
    }

    注意:创建SpringBoot整合JSP,一定要为war类型,否则找不到页面.

  • 相关阅读:
    CSS浮动(float、clear)通俗讲解
    JAVA 类的加载
    数据库操作 delete和truncate的区别
    正则表达式 匹配相同数字
    Oracle EBS OM 取消订单
    Oracle EBS OM 取消订单行
    Oracle EBS OM 已存在的OM订单增加物料
    Oracle EBS OM 创建订单
    Oracle EBS INV 创建物料搬运单头
    Oracle EBS INV 创建物料搬运单
  • 原文地址:https://www.cnblogs.com/cxyyh/p/10628760.html
Copyright © 2011-2022 走看看