【SpringBoot2.x】-SpringBoot Web开发中Thymeleaf、Web、Tomcat以及Favicon

简介: Web开发是开发中至关重要的一部分, Web开发的核心内容主要包括内嵌Servlet容器和Spring MVC。更重要的是,Spring Boot``为web开发提供了快捷便利的方式进行开发,使用依赖jar:spring-boot-starter-web,提供了嵌入式服务器Tomcat以及Spring MVC的依赖,且自动配置web相关配置,可查看org.springframework.boot.autoconfigure.web。

github:github.com/Ccww-lx/Spr…


模块:spring-boot-starter-base-web


Web开发是开发中至关重要的一部分, Web开发的核心内容主要包括内嵌Servlet容器和Spring MVC。更重要的是,Spring Boot``为web开发提供了快捷便利的方式进行开发,使用依赖jar:spring-boot-starter-web,提供了嵌入式服务器Tomcat以及Spring MVC的依赖,且自动配置web相关配置,可查看org.springframework.boot.autoconfigure.web


Web相关的核心功能:


  • Thymeleaf模板引擎
  • Web相关配置
  • Tomcat配置
  • Favicon配置


1.模板配置


1.1原理以及源码分析


Spring Boot提供了大量模板引擎, 包含括FreeMarkerGroovyThymeleafVelocity和MustacheSpring Boot中推荐 使用Thymeleaf作为模板引擎, 因为Thymeleaf提供了完美的Spring MVC的支持。


Spring Bootorg.springframework.boot.autoconfigure.thymeleaf包下实现自动配置,如下所示:


0.png


ThymeleafAutoConfiguration源码:


@Configuration
@EnableConfigurationProperties(ThymeleafProperties.class)
@ConditionalOnClass({ TemplateMode.class, SpringTemplateEngine.class })
@AutoConfigureAfter({ WebMvcAutoConfiguration.class, WebFluxAutoConfiguration.class })
public class ThymeleafAutoConfiguration {
        //配置TemplateResolver
  @Configuration
  @ConditionalOnMissingBean(name = "defaultTemplateResolver")
  static class DefaultTemplateResolverConfiguration {
            ...
  }
        //配置TemplateEngine
  @Configuration
  protected static class ThymeleafDefaultConfiguration {
            ...
  }
        //配置SpringWebFluxTemplateEngine
  @Configuration
  @ConditionalOnWebApplication(type = Type.SERVLET)
  @ConditionalOnProperty(name = "spring.thymeleaf.enabled", matchIfMissing = true)
  static class ThymeleafWebMvcConfiguration {
         ...
  }
        //配置thymeleafViewResolver
  @Configuration
  @ConditionalOnWebApplication(type = Type.REACTIVE)
  @ConditionalOnProperty(name = "spring.thymeleaf.enabled", matchIfMissing = true)
  static class ThymeleafWebFluxConfiguration {
           ...
  }
    ...
}
复制代码


ThymeleafAutoConfiguration自动加载Web所需的TemplateResolverTemplateEngineSpringWebFluxTemplateEngine以及thymeleafViewResolver,并通过ThymeleafProperties进行Thymeleaf属性配置。详细细节查看官方源码。


ThymeleafProperties源码:


//读取application.properties配置文件的属性
@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";
  /**
   *Web模板文件前缀路径属性,Spring boot默认路径为classpath:/templates/
   */
  private String prefix = DEFAULT_PREFIX;
  /**
   * Web模板文件后缀属性,默认为html
   */
  private String suffix = DEFAULT_SUFFIX;
  /**
   * Web模板模式属性,默认为HTML
   */
  private String mode = "HTML";
  /**
   *  Web模板文件编码属性,默认为UTF_8
   */
  private Charset encoding = DEFAULT_ENCODING;
        ....
}
复制代码


可以从ThymeleafProperties中看出,Thymeleaf的默认设置,以及可以通过前缀为spring.thymeleaf属性修改Thymeleaf默认配置。


1.2 示例


1).根据默认Thymeleaf配置,在src/main/resources/下,创建static文件夹存放脚本样式静态文件以及templates文件夹存放后缀为html的页面,如下所示:


1.png


2)index.html页面


<!DOCTYPE html>
<!-- 导入xmlns: th=http://www.thymeleaf.org命名空间 -->
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en">
 <head>
     <meta charset="UTF-8">
    <title>首面详细</title>
 </head>
  <body>
    <div class="user" align="center"  width="400px" height="400px">
        message:<span th:text="${user.message}"/><br/>
       用户名:<span th:text="${user.username}"/><br/>
         密码:<span th:text="${user.password}"/>
    </div>
 </body>
</html>
复制代码


3).controller配置:


@Controller
public class LoginController {
    @Autowired
    private LoginService loginService;
    /**
     * 将首页设置为登陆页面login.html
     * @return
     */
    @RequestMapping("/")
    public String startIndex() {
        return "login";
    }
    /**
     *  登陆验证
     * @param username
     * @param password
     * @param model
     * @return
     */
    @RequestMapping("/login")
    public String login(@RequestParam("username") String username, @RequestParam("password") String password, Model model) {
        UserDTO userDTO = loginService.login(username, password);
        model.addAttribute("user", userDTO);
        return "index";
    }
}
复制代码


2. web相关配置


根据WebMvcAutoConfiguration以及WebMvcProperties理解Spring Boot提供的自动配置原理。


2.1 ViewResolver以及静态资源


Spring boot自动配置ViewResolver


  • ContentNegotiatingViewResolver(最高优先级Ordered.HIGHEST_PRECEDENCE
  • BeanNameViewResolver
  • InternalResourceViewResolver


静态资源


addResourceHandlers 方法默认定义了/static/public/resources/METAINF/resources文件夹下的静态文件直接映射为/**


2.2 Formatter和Converter类型转换器


addFormatters 方法会自动加载ConverterGenericConverter以及Formatter的实现类、并注册到Spring MVC中,因此自定义类型转换器只需继承其三个接口即可。


自定义Formatter:


/**
 * 将格式为 ccww:ccww88转为UserDTO
 *
 * @Auther: ccww
 * @Date: 2019/10/4 16:25
 * @Description:
 */
public class StringToUserConverter implements Converter<String, UserDTO> {
    @Nullable
    public UserDTO convert(String s) {
        UserDTO userDTO = new UserDTO();
        if (StringUtils.isEmpty(s))
            return userDTO;
        String[] item = s.split(":");
        userDTO.setUsername(item[0]);
        userDTO.setPassword(item[1]);
        return userDTO;
    }
}
复制代码


2.3 HttpMessageConverters (HTTP request (请求)和response (响应)的转换器)


configureMessageConverters方法自动配置HttpMessageConverters:


public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
      this.messageConvertersProvider.ifAvailable((customConverters) -> converters
          .addAll(customConverters.getConverters()));
    }
复制代码


通过加载由HttpMessageConvertersAutoConfiguration定义的HttpMessageConverters,会自动注册一系列HttpMessage Converter类,比如Spring MVC默认:


  • ByteArrayHttpMessageConverter
  • StringHttpMessageConverter
  • ResourceHttpMessageConverter
  • SourceHttpMessageConverter
  • AllEncompassingFormHttpMessageConverter


自定义HttpMessageConverters,只需要在自定义的HttpMessageConvertersBean注册自定义HttpMessageConverter即可。 如下:


注册自定义的HttpMessageConverter


@Configuration
public class CustomHttpMessageConverterConfig {
    @Bean
    public HttpMessageConverters converter(){
        HttpMessageConverter<?> userJsonHttpMessageConverter=new UserJsonHttpMessageConverter();
        return new HttpMessageConverters(userJsonHttpMessageConverter);
    }
}
复制代码


自定义HttpMessageConverter


public class UserJsonHttpMessageConverter extends AbstractHttpMessageConverter<UserDTO> {
    private static Charset DEFUALT_ENCODE=Charset.forName("UTF-8");
    public UserJsonHttpMessageConverter(){
        super(new MediaType("application", "xxx-ccww", DEFUALT_ENCODE));
    }
    protected boolean supports(Class aClass) {
            return UserDTO.class == aClass;
    }
    protected UserDTO readInternal(Class aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {
        String message = StreamUtils.copyToString(httpInputMessage.getBody(), DEFUALT_ENCODE);
        String[] messages = message.split("-");
        UserDTO userDTO = new UserDTO();
        userDTO.setUsername(messages[0]);
        userDTO.setMessage(messages[1]);
        return userDTO;
    }
    protected void writeInternal(UserDTO userDTO, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {
        String out = "ccww: " + userDTO.getUsername() + "-" + userDTO.getMessage();
        httpOutputMessage.getBody().write(out.getBytes());
    }
}
复制代码


同理,可以将Servlet、Filter以及Listener相对于的注册即可。


2.4 MVC相关配置


自定义的MVC配置类上加@EnableWebMvc将废弃到Spring boot默认配置,完全由自己去控制MVC配置,但通常是Springboot默认配置+所需的额外MVC配置,只需要配置类继承WebMvcConfigurerAdapter即可


2.5 Tomcat配置


可以使用两种方式进行Tomcat配置属性


  1. application.properties配置属性即可,Tomcat是以"server.tomcat"为前缀的特有配置属性,通用的是以"server"作为前缀;
  2. 通过实现WebServerFactoryCustomizer接口自定义属性配置类即可,同理其他服务器实现对应的接口即可。


application.properties配置属性:


#通用Servlet容器配置
server.port=8888
#tomcat容器配置
#配置Tomcat编码, 默认为UTF-8
server.tomcat.uri-encoding = UTF-8
# Tomcat是否开启压缩, 默认为关闭off
server.tomcat.compression=off
复制代码


实现WebServerFactoryCustomizer接口自定义:


/**
 * 配置tomcat属性
 * @Auther: ccww
 * @Date: 2019/10/5 23:22
 * @Description: 
 */
@Component
public class CustomTomcatServletContainer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
    public void customize(ConfigurableServletWebServerFactory configurableServletWebServerFactory) {
        ((TomcatServletWebServerFactory)configurableServletWebServerFactory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
            public void customize(Connector connector) {
                Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                protocol.setMaxConnections(200);
                protocol.setMaxThreads(200);
                protocol.setSelectorTimeout(3000);
                protocol.setSessionTimeout(3000);
                protocol.setConnectionTimeout(3000);
                protocol.setPort(8888);
            }
        });
    }
}
复制代码


替换spring boot 默认Servlet容器tomcat,直接在依赖中排除,并导入相应的Servlet容器依赖:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starterweb</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-startertomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starterjetty</artifactId>
</dependency
复制代码


2.6 自定义Favicon


自定义Favicon只需要则只需将自己的favicon.ico( 文件名不能变动) 文件放置在类路径根目录、 类路径META-INF/resources/下、 类路径resources/下、 类路径static/下或类路径public/下。


> 各位看官还可以吗?喜欢的话,动动手指点个💗,点个关注呗!!谢谢支持! >


目录
相关文章
|
1月前
|
数据库 开发者 Python
web应用开发
【9月更文挑战第1天】web应用开发
40 1
|
23天前
|
数据可视化 图形学 UED
只需四步,轻松开发三维模型Web应用
为了让用户更方便地应用三维模型,阿里云DataV提供了一套完整的三维模型Web模型开发方案,包括三维模型托管、应用开发、交互开发、应用分发等完整功能。只需69.3元/年,就能体验三维模型Web应用开发功能!
43 8
只需四步,轻松开发三维模型Web应用
|
13天前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
59 6
|
12天前
|
存储 JSON API
实战派教程!Python Web开发中RESTful API的设计哲学与实现技巧,一网打尽!
在数字化时代,Web API成为连接前后端及构建复杂应用的关键。RESTful API因简洁直观而广受欢迎。本文通过实战案例,介绍Python Web开发中的RESTful API设计哲学与技巧,包括使用Flask框架构建一个图书管理系统的API,涵盖资源定义、请求响应设计及实现示例。通过准确使用HTTP状态码、版本控制、错误处理及文档化等技巧,帮助你深入理解RESTful API的设计与实现。希望本文能助力你的API设计之旅。
37 3
|
13天前
|
JSON API 数据库
从零到英雄?一篇文章带你搞定Python Web开发中的RESTful API实现!
在Python的Web开发领域中,RESTful API是核心技能之一。本教程将从零开始,通过实战案例教你如何使用Flask框架搭建RESTful API。首先确保已安装Python和Flask,接着通过创建一个简单的用户管理系统,逐步实现用户信息的增删改查(CRUD)操作。我们将定义路由并处理HTTP请求,最终构建出功能完整的Web服务。无论是初学者还是有经验的开发者,都能从中受益,迈出成为Web开发高手的重要一步。
37 4
|
11天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
32 1
|
13天前
|
JSON API 开发者
惊!Python Web开发新纪元,RESTful API设计竟能如此性感撩人?
在这个Python Web开发的新纪元里,RESTful API的设计已经超越了简单的技术实现,成为了一种追求极致用户体验和开发者友好的艺术表达。通过优雅的URL设计、合理的HTTP状态码使用、清晰的错误处理、灵活的版本控制以及严格的安全性措施,我们能够让RESTful API变得更加“性感撩人”,为Web应用注入新的活力与魅力。
31 3
|
13天前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
在Web开发中,安全至关重要,尤其要警惕SQL注入和XSS攻击。SQL注入通过在数据库查询中插入恶意代码来窃取或篡改数据,而XSS攻击则通过注入恶意脚本来窃取用户敏感信息。本文将带你深入了解这两种威胁,并提供Python实战技巧,包括使用参数化查询和ORM框架防御SQL注入,以及利用模板引擎自动转义和内容安全策略(CSP)防范XSS攻击。通过掌握这些方法,你将能够更加自信地应对Web安全挑战,确保应用程序的安全性。
43 3
|
15天前
|
JSON API 数据格式
深度剖析!Python Web 开发中 RESTful API 的每一个细节,你不可不知的秘密!
在 Python Web 开发中,RESTful API 是构建强大应用的关键,基于 Representational State Transfer 架构风格,利用 HTTP 卞性能。通过 GET、POST、PUT 和 DELETE 方法分别实现资源的读取、创建、更新和删除操作。示例代码展示了如何使用 Flask 路由处理这些请求,并强调了状态码的正确使用,如 200 表示成功,404 表示未找到资源等。
38 5
|
1月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
下一篇
无影云桌面