SpringBoot-Web和SpringBoot基础
SpringBoot系列(5)—-SpringBoot-Web和SpringBoot基础
笔者所参考的书籍是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的混合体,可以这样理解)
@Controller
public 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=8080
server.context-path=/boot
server.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=80
server.context-path=/
application-dev.properties
server.port=8080
server.context-path=/boot
最后按照当前我们的实际环境在application.properties中配置profile的值:
spring.profiles.active=dev
3、用户自定义配置
我们还可以在application.properties配置文件当中配置我们自定义的属性,然后通过@value注入到我们的bean或者是controller当中。
myprperties.developer.name=tony
然后在我们的bean中配置:
@Controller
public class TestController {
@Value("${myprperties.developer.name}")
private String developerName;
4、日志配置
SpringBoot 支持多种日志框架,默认情况下SpringBoot使用LogBack作为日志框架,配置SpringBoot 日志级别和日志文件位置,可以通过application.properties进行如下配置:
#日志配置
logging.file=/Users/yanzhichao/Desktop/log.log
logging.level.org.springframework.web=DEBUG
5、配置文件导入
SpringBoot是不提倡使用xml配置文件的,当然如果你必要去使用xml配置文件也是允许的通过@ImportResource导入所需的xml配置文件,但是笔者并没有进行相关的测试,没有别的,就因为Spring不推荐我就不测这个功能了。有事件的同学可以测测然后在评论说下测试结果,看看能不能用。
@ImportResource({
"classpath:application.xml"})
@SpringBootApplication
public 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。
@Configuration
public 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容器的配置
@Component
public 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:
@Bean
public 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配置如下:
#SSL
server.ssl.key-store=server.keystore
server.ssl.key-store-password=123456
server.ssl.key-store-type=JKS
server.ssl.key-alias=TONY
server.ssl.enabled=true
注意:证书文件一定要放在项目的根目录下,即和你的pom.xml文件的同级目录。
一般情况下用户不会指定访问https,所以做跳转基本上是配置SSL的标配。现在就说说这个“标配”应该怎样配。
@SpringBootApplication
public 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来说是透明的,不需要用户手动指定。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tony308001970/article/details/74923345
还没有评论,来说两句吧...