[SpringBoot2.x] — Thymeleaf, Web, Tomcat и Favicon в веб-разработке SpringBoot

Spring Boot

гитхаб:GitHub.com/ccAsk Me-Contact/SPR…
模块:spring-boot-starter-base-web

  WebРазвитие является жизненно важной частью развития,WebОсновное содержание разработки в основном включает встроенныеServletконтейнер иSpring MVC. важнее,Spring Boot``为webРазработка предоставляет быстрый и удобный способ разработки с использованием зависимых банок:spring-boot-starter-web, предоставляет встроенный серверTomcatтак же какSpring MVCзависимости и автоматически настраиваютсяwebСвязанную конфигурацию можно просмотретьorg.springframework.boot.autoconfigure.web.

WebСвязанные основные функции:

  • Thymeleafшаблонизатор
  • WebСвязанная конфигурация
  • Tomcatнастроить
  • Faviconнастроить

1. Конфигурация шаблона

1.1 Принцип и анализ исходного кода

  Spring BootПредоставляет большое количество шаблонизаторов, в том числеFreeMarker,Groovy,Thymeleaf,Velocity和Mustache,Spring Bootрекомендуется в использоватьThymeleafв качестве шаблонизатора, потому чтоThymeleafобеспечивает идеальноеSpring MVCслужба поддержки.

существуетSpring Bootизorg.springframework.boot.autoconfigure.thymeleafАвтоматическая настройка реализована в рамках пакета следующим образом:

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нужныйTemplateResolver,TemplateEngine,SpringWebFluxTemplateEngineтак же как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 следующим образом:

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метод будет загружен автоматическиConverter,GenericConverterтак же как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, просто нужно быть в кастомеHttpMessageConvertersизBeanЗарегистрировать пользовательский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По умолчаниюServleт контейнер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/Вниз.


> Можешь смотреть офицеров? Если вам это нравится, проведите пальцем, чтобы нажать 💗, нажмите, чтобы подписаться! ! Спасибо за поддержку! > > Добро пожаловать в общедоступный аккаунт [**Ccww Technology Blog**], оригинальная техническая статья будет запущена в первый раз