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

来源:互联网 发布:java轻量级javaee开发 编辑:程序博客网 时间:2024/05/16 07:23

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

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



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


一、SpringBoot Web 小试牛刀

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

<dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-web</artifactId></dependency>
<dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
显然我是一个Web项目,所以Spring已经自动帮我们配置上了SpringMVC的支持,而且我们连最基本的ComponentScan都不用配,Spring都为我们办妥了。

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

@Controllerpublic class TestController {    @RequestMapping("/")    public @ResponseBody String index(){        return "test";    }}

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

#Servlet容器配置server.port=8080server.context-path=/bootserver.session.timeout=10800#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禁用:

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

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

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

application-dev.properties

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

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

spring.profiles.active=dev


3、用户自定义配置

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

myprperties.developer.name=tony
然后在我们的bean中配置:

@Controllerpublic class TestController {    @Value("${myprperties.developer.name}")    private String developerName;


4、日志配置

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

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


5、配置文件导入

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

@ImportResource({"classpath:application.xml"})@SpringBootApplicationpublic class DemoApplication extends WebMvcConfigurerAdapter {

6、favicon配置

favicon就是浏览器标签页的icon

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

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上进行配置):

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

在controller当中还是老规矩:

@RequestMapping("/userList.html")public ModelAndView userList(){    ModelAndView modelAndView = new ModelAndView("userList");    modelAndView.addObject("users",getUserList());    return modelAndView;}

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

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd"><html xmlns="http://www.w3.org/1999/xhtml"      xmlns:th="http://www.thymeleaf.org"><head>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>    <title>Title</title></head><body>    <table>        <tr th:each="user_item : ${users}">            <td th:text="${user_item.userId}"></td>            <td th:text="${user_item.username}"></td>            <td th:text="${user_item.userpwd}"></td>        </tr>    </table></body></html>


四、SpringMVC配置

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

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

@Configurationpublic class MyWebConfig extends WebMvcConfigurerAdapter {    @Autowired    private HttpMessageConverters httpMessageConverters;    @Override    public void addViewControllers(ViewControllerRegistry registry) {        super.addViewControllers(registry);    }    @Override    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {        super.configureMessageConverters(httpMessageConverters.getConverters());    }}
虽然我什么都没有配,就打个样而已。但是需要注意的是,我们通过这种方式去配置是在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我就没有测试了,自己动手丰衣足食!

//  @Bean// public ServletListenerRegistrationBean listenerRegistrationBean(){//    return new ServletListenerRegistrationBean();// }   @Bean   public FilterRegistrationBean myFilter(){      FilterRegistrationBean registrationBean = new FilterRegistrationBean(new MyFilter());      registrationBean.addUrlPatterns("/index");      return registrationBean;   }   @Bean   public ServletRegistrationBean myServlet(){      return new ServletRegistrationBean(new MyServlet(),"/myServlet");   }


七、Tomcat和Servlet容器 配置

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

1、通过application.properties:

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

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


2、通过代码配置

以下是通用Servlet容器的配置

@Componentpublic class CustomServletContainer implements EmbeddedServletContainerCustomizer {    @Override    public void customize(ConfigurableEmbeddedServletContainer container) {        container.setPort(8888);        container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,"/error_404.html"));        container.setSessionTimeout(3, TimeUnit.HOURS);    }}

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

@Beanpublic EmbeddedServletContainerFactory servletContainerFactory(){   TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();   factory.setPort(8888);   factory.setUriEncoding(Charset.forName("utf-8"));   return factory;}

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


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

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

<dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-web</artifactId>   <exclusions>      <exclusion>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-tomcat</artifactId>      </exclusion>   </exclusions></dependency><dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-jetty</artifactId></dependency>

九、SSL配置

首先创建一个证书

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

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

application.properties配置如下:

#SSLserver.ssl.key-store=server.keystoreserver.ssl.key-store-password=123456server.ssl.key-store-type=JKSserver.ssl.key-alias=TONYserver.ssl.enabled=true
注意:证书文件一定要放在项目的根目录下,即和你的pom.xml文件的同级目录。

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

@SpringBootApplicationpublic class DemoApplication {   public static void main(String[] args) {      SpringApplication.run(DemoApplication.class, args);   }   @Bean   public Connector httpConnector(){      Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");      connector.setScheme("http");      connector.setPort(8080);      connector.setSecure(false);      connector.setRedirectPort(8443);      return connector;   }   @Bean   public EmbeddedServletContainerFactory servletContainerFactory(){      TomcatEmbeddedServletContainerFactory containerFactory = new TomcatEmbeddedServletContainerFactory(){         @Override         protected void postProcessContext(Context context) {            super.postProcessContext(context);            SecurityConstraint constraint = new SecurityConstraint();            constraint.setUserConstraint("CONFIDENTIAL");            SecurityCollection collection = new SecurityCollection();            collection.addPattern("/*");            constraint.addCollection(collection);            context.addConstraint(constraint);         }      };      containerFactory.addAdditionalTomcatConnectors(httpConnector());      return containerFactory;   }}

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


原创粉丝点击