SpringBoot-Web和SpringBoot基础

╰+攻爆jí腚メ 2022-05-20 01:17 260阅读 0赞

SpringBoot系列(5)—-SpringBoot-Web和SpringBoot基础

笔者所参考的书籍是SpringBoot实战,其理论性说得不多,内容上也不是非常详细。但是说到的内容也足够平时使用了,以下就是我根据SpringBoot实战学到的一些东西,希望分享给大家,并成为我以后回忆这门技术的笔记。

开始SpringBoot之前,我建议大家还是从Spring官网上按照自己的需要下载一个基础包,https://start.spring.io 。在这个笔记当中只需要用到web 和 websocket。

Center

导入到项目当中,然后我们就开始小试牛刀!

一、SpringBoot Web 小试牛刀

可以看到导入之后会有一个DemoApplication的类,这个类会发现有一个@SpringBootApplication。目前这个类就是我们在上几遍说到的配置类,当然SpringBoot让我这种懒人非常兴奋,因为他将我们会用到的东西都配置上去了。而且最重要的是他的自动配置的,会根据当前有什么包和当前的环境去判断应该配置什么。目前我的maven有:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  8. </dependency>

显然我是一个Web项目,所以Spring已经自动帮我们配置上了SpringMVC的支持,而且我们连最基本的ComponentScan都不用配,Spring都为我们办妥了。

然后我们想尝试创建一个Controller然后我们使用@ResponseBody在页面直接返回一个字符串。当然你可以直接使用@RestController 就不用写@ResponseBody了(@RestController 等于 @Controller @ResponseBody的混合体,可以这样理解)

  1. @Controller
  2. public class TestController {
  3. @RequestMapping("/")
  4. public @ResponseBody String index(){
  5. return "test";
  6. }
  7. }

OK,到这里Web容器呢···· 嗯SpringBoot 在 spring-boot-starter-web 做好了一个内嵌在SpringBoot上的Tomcat,当然也可以使用其他Jetty等等的其他Web容器,这个后面说。明显看到我们的项目当中在resources目录下会有一个application.properties配置文件。springBoot基本的配置都会写到这里,例如服务器的端口和contextpath等等都会在这里去配置。

  1. #Servlet容器配置
  2. server.port=8080
  3. server.context-path=/boot
  4. server.session.timeout=10800
  5. #server.error.path=/error

目前我配置了 8080端口、context-path为/boot 、session超时时间为3小时、错误页面error(但是我没有使用)

现在可以访问了一下我们的第一个测试路径了,http://localhost:8080/boot/

二、杂项配置

SpringBoot已经为我们自动配置的大部分的日常配置,还有一些自定义操作还是需要我们亲自动手。例如我们启动SpringBoot时候的console显现一个大大的Spring,又例如我们通过profile去控制当前运行环境等等。

1、配置SpringBoot的banner

配置SpringBoot的banner,我们在SpringBoot当中看的console输出可以通过在resource目录下创建banner.txt 在banner.txt中编写自己的banner。

. ____ _ __ _ _
/\\ / ___‘_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | ‘_ | ‘_| | ‘_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
‘ |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.4.RELEASE)

当然如果我们不希望有BANNER的输出,也可以通过在main方法中将banner禁用:

  1. public static void main(String[] args) {
  2. SpringApplication application = new SpringApplication(DemoApplication.class);
  3. application.setBannerMode(Banner.Mode.OFF);
  4. application.run(args);
  5. }

2、配置SpringBoot的Profile

Profile如果不熟悉的同学可以看看我之前的笔记:SpringBoot系列(1)—-无配置文件配置基础1 。

我们需要创建不同环境的application-{profile}.properties,然后配置不同profile环境的配置即可。例如我配置两个环境,开发环境和生成环境,我就会创建application-dev.properties和application-prod.properties 两个文件(在resources目录下创建)。在不同的properties文件当中配置不同的server.port 开发环境是8080 生产环境是80。

application-prod.properties

  1. server.port=80
  2. server.context-path=/

application-dev.properties

  1. server.port=8080
  2. server.context-path=/boot

最后按照当前我们的实际环境在application.properties中配置profile的值:

  1. spring.profiles.active=dev

3、用户自定义配置

我们还可以在application.properties配置文件当中配置我们自定义的属性,然后通过@value注入到我们的bean或者是controller当中。

  1. myprperties.developer.name=tony

然后在我们的bean中配置:

  1. @Controller
  2. public class TestController {
  3. @Value("${myprperties.developer.name}")
  4. private String developerName;

4、日志配置

SpringBoot 支持多种日志框架,默认情况下SpringBoot使用LogBack作为日志框架,配置SpringBoot 日志级别和日志文件位置,可以通过application.properties进行如下配置:

  1. #日志配置
  2. logging.file=/Users/yanzhichao/Desktop/log.log
  3. logging.level.org.springframework.web=DEBUG

5、配置文件导入

SpringBoot是不提倡使用xml配置文件的,当然如果你必要去使用xml配置文件也是允许的通过@ImportResource导入所需的xml配置文件,但是笔者并没有进行相关的测试,没有别的,就因为Spring不推荐我就不测这个功能了。有事件的同学可以测测然后在评论说下测试结果,看看能不能用。

  1. @ImportResource({
  2. "classpath:application.xml"})
  3. @SpringBootApplication
  4. public class DemoApplication extends WebMvcConfigurerAdapter {

6、favicon配置

favicon就是浏览器标签页的icon

禁用favicon,在application.properties进行如下配置:

  1. spring.mvc.favicon.enabled=false

替换自己的favicon只需要在resources目录下、resources/static目录下 、resources/public目录下 随便一个目录添加自定义的favicon.ico即可

三、Thymeleaf 模板引擎

由于SpringBoot内嵌的Tomcat对支持JSP存在问题,在SpringBoot-web目前官方推荐使用Thymeleaf模板引擎。笔者也是对这个thymeleaf不是非常熟悉,也是仅仅会用而已。不过应该已经够用了,讲解Thymeleaf不是本文的重点我也是简简单单的说一说。

当然我们当需要使用Thymeleaf的时候第一反应是需要添加一个viewResolver。但是重磅消息是,Spring已经帮我们完成了这个任务。

也许你会问我们不需要去配置资源文件或者模板的路径吗?真的不用配置,Spring在默认情况下所有静态资源一律映射到resources目录下的static目录。而模板一律映射到resources目录下的templates目录当中。所以实际上我们不需要配置任何的静态资源路径映射和thymeleaf的viewResolver。当然我们还是可以 配置一下(在application.properties上进行配置):

  1. #Thymeleaf配置
  2. spring.thymeleaf.prefix=classpath:/templates/
  3. spring.thymeleaf.suffix=.html

在controller当中还是老规矩:

  1. @RequestMapping("/userList.html")
  2. public ModelAndView userList(){
  3. ModelAndView modelAndView = new ModelAndView("userList");
  4. modelAndView.addObject("users",getUserList());
  5. return modelAndView;
  6. }

然后在templates目录下创建userList.html的模板文件:

  1. <!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml"
  3. xmlns:th="http://www.thymeleaf.org">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  6. <title>Title</title>
  7. </head>
  8. <body>
  9. <table>
  10. <tr th:each="user_item : ${users}">
  11. <td th:text="${user_item.userId}"></td>
  12. <td th:text="${user_item.username}"></td>
  13. <td th:text="${user_item.userpwd}"></td>
  14. </tr>
  15. </table>
  16. </body>
  17. </html>

四、SpringMVC配置

SpringMVC在之前的笔记当中已经用了比较大的篇幅去介绍,事实上在SpringBoot当中也基本上一致。当然SpringBoot也是帮我们已经配置好常用的配置了。还记得我们以前说的WebMvcConfigurerAdapter吗?不记得就回忆一下:SpringBoot系列(3)—-无配置文件SpringMVC

同理在SpringBoot当中也是继承WebMvcConfigurerAdapter然后对相应的方法进行重写来对SpringMVC进行配置,我们可以直接在配置类当中继承WebMvcConfigurerAdapter也可以另外创建一个配置类对SpringMVC进行配置,但是需要添加@Configuration的annotation。

  1. @Configuration
  2. public class MyWebConfig extends WebMvcConfigurerAdapter {
  3. @Autowired
  4. private HttpMessageConverters httpMessageConverters;
  5. @Override
  6. public void addViewControllers(ViewControllerRegistry registry) {
  7. super.addViewControllers(registry);
  8. }
  9. @Override
  10. public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  11. super.configureMessageConverters(httpMessageConverters.getConverters());
  12. }
  13. }

虽然我什么都没有配,就打个样而已。但是需要注意的是,我们通过这种方式去配置是在SpringBoot自动配置的基础上进行配置,如果我们想去除SpringBoot的默认配置需要添加@EnableWebMvc,但是一般情况下没有这个必要。

五、静态资源

刚刚在thymeleaf讲解的时候已经说过,SpringBoot会自动映射静态资源,以下就是会映射的目录:

classpath:/META-INF/resources/index.html

classpath:/resources/index.html

classpath:/static/index.html

classpath:/public/index.html

六、Servlet\Filter\ServletListener配置

Servlet和Filter、ServletListener 就没有什么好说的,按护理画瓢吧 兄弟们~~ ServletListener我就没有测试了,自己动手丰衣足食!

  1. // @Bean
  2. // public ServletListenerRegistrationBean listenerRegistrationBean(){
  3. // return new ServletListenerRegistrationBean();
  4. // }
  5. @Bean
  6. public FilterRegistrationBean myFilter(){
  7. FilterRegistrationBean registrationBean = new FilterRegistrationBean(new MyFilter());
  8. registrationBean.addUrlPatterns("/index");
  9. return registrationBean;
  10. }
  11. @Bean
  12. public ServletRegistrationBean myServlet(){
  13. return new ServletRegistrationBean(new MyServlet(),"/myServlet");
  14. }

七、Tomcat和Servlet容器 配置

由于SpringBoot的Servlet容器是内嵌在Jar包当中的,所以我们可以通过两种手段去进行配置,第一通过application.properties 第二通过实现EmbeddedServletContainerCustomizer接口。

1、通过application.properties:

  1. #Tomcat 配置
  2. server.tomcat.uri-encoding=utf-8

我看了一下没有什么好配置的SpringBoot默认的值已经配好了,我只是做个演示因为SpringBoot默认的encoding也是配置为UTF-8。

如果是通过intellij 进行开发的可以有提示,server.tomcat开头就有提示了,按照自己需要进行相关的配置。

2、通过代码配置

以下是通用Servlet容器的配置

  1. @Component
  2. public class CustomServletContainer implements EmbeddedServletContainerCustomizer {
  3. @Override
  4. public void customize(ConfigurableEmbeddedServletContainer container) {
  5. container.setPort(8888);
  6. container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,"/error_404.html"));
  7. container.setSessionTimeout(3, TimeUnit.HOURS);
  8. }
  9. }

Tomcat特定配置需要创建特定containerFactory的bean,在配置类创建bean:

  1. @Bean
  2. public EmbeddedServletContainerFactory servletContainerFactory(){
  3. TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
  4. factory.setPort(8888);
  5. factory.setUriEncoding(Charset.forName("utf-8"));
  6. return factory;
  7. }

一般情况我们通过application.properties 已经能够满足大部分的配置了,如果有特殊的配置可以通过代码的方式进行定义。

八、启用其他WEB容器替换TOMCAT

这个也是没有什么难度改改maven就好

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-tomcat</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-jetty</artifactId>
  14. </dependency>

九、SSL配置

首先创建一个证书

keytool -genkey -alias TONY -keyalg RSA -keystore ./server.keystore

【需要注意的是,一定要指定keyalg RSA 否则会出现ERR_SSL_VERSION_OR_CIPHER_MISMATCH 错误 导致无法访问】

application.properties配置如下:

  1. #SSL
  2. server.ssl.key-store=server.keystore
  3. server.ssl.key-store-password=123456
  4. server.ssl.key-store-type=JKS
  5. server.ssl.key-alias=TONY
  6. server.ssl.enabled=true

注意:证书文件一定要放在项目的根目录下,即和你的pom.xml文件的同级目录。

一般情况下用户不会指定访问https,所以做跳转基本上是配置SSL的标配。现在就说说这个“标配”应该怎样配。

  1. @SpringBootApplication
  2. public class DemoApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(DemoApplication.class, args);
  5. }
  6. @Bean
  7. public Connector httpConnector(){
  8. Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
  9. connector.setScheme("http");
  10. connector.setPort(8080);
  11. connector.setSecure(false);
  12. connector.setRedirectPort(8443);
  13. return connector;
  14. }
  15. @Bean
  16. public EmbeddedServletContainerFactory servletContainerFactory(){
  17. TomcatEmbeddedServletContainerFactory containerFactory = new TomcatEmbeddedServletContainerFactory(){
  18. @Override
  19. protected void postProcessContext(Context context) {
  20. super.postProcessContext(context);
  21. SecurityConstraint constraint = new SecurityConstraint();
  22. constraint.setUserConstraint("CONFIDENTIAL");
  23. SecurityCollection collection = new SecurityCollection();
  24. collection.addPattern("/*");
  25. constraint.addCollection(collection);
  26. context.addConstraint(constraint);
  27. }
  28. };
  29. containerFactory.addAdditionalTomcatConnectors(httpConnector());
  30. return containerFactory;
  31. }
  32. }

可以看到我们创建了一个connector 端口为8080,并重定向到8443端口。这样就能完成http跳转到https,这样对于用户HTTPS来说是透明的,不需要用户手动指定。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tony308001970/article/details/74923345

发表评论

表情:
评论列表 (有 0 条评论,260人围观)

还没有评论,来说两句吧...

相关阅读

    相关 【JavaWeb】SpringBootWeb案例下篇

    文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们发微博、发微信朋友圈都用到了文件上传功能。前端页面三要素。