SpringBoot是很是适合开发Web应用的,由于他内嵌有Tomcat、Jetty、Undertow或者Netty。大部分的应用能够经过加载spring-boot-starter-web模块可以快速的建立并启动一个Web应用。html
SpringMVC是一个“model view controller”的Web级的框架。SpringMVC可以用@Controller或者@RestController注解在Bean中拦截相应的HTTP请求。具体请求方法是在用@Controller或者@RestController进行注解的类中的方法里面。方法用@RequestMapping进行注解。下面的例子展现了典型的@RestController的使用方法。java
@RestController
@RequestMapping(value="/users")
public class MyRestController {
@RequestMapping(value="/{user}", method=RequestMethod.GET)
public User getUser(@PathVariable Long user) {
// ...
}
@RequestMapping(value="/{user}/customers", method=RequestMethod.GET)
List<Customer> getUserCustomers(@PathVariable Long user) {
// ...
}
@RequestMapping(value="/{user}", method=RequestMethod.DELETE)
public User deleteUser(@PathVariable Long user) {
// ...
}
}
复制代码
Spring MVC是Spring框架的一部分,详细的信息能够看SpringMVC官方文档git
SpringMVC不用再像以前同样用许多的配置文件来开启各类功能,SpringBoot已经将其许多的功能进行了自动配置化。下面就是SpringBoot针对SpringMVC的自动配置的一些功能:github
若是你想保持上面的功能不变,可是想要额外的添加一些功能。可以使用@Configuration注解进行配置不能加上@EnableWebMvc,若是你不想要上面的功能,想彻底本身定义SpringMVC的功能,那么就加上@EnableWebMvc。若是想要拥有定制化的RequestMappingHandlerMapping、RequestMappingHandlerAdapter或者ExceptionHandlerExceptionResolver,声明一个WebMvcRegistrationsAdapter实例提供相应的内容。web
SpringMVC使用HttpMessageConverter去转换从HTTP发出来的请求及响应的内容。HTTP的请求其实都会封装在ServletInputStream流中,而响应则会封装在ServletOutputStream流中。而从流中读取的数据都是原始的字符串的报文,此时就须要将报文进行转换。而基本上都是字符串和java对象进行互转的过程。因此SpringMVC用到了HttpMessageConverter来进行解决的。spring
例如如今有一个实体类User,我直接返回页面UserDao对象。浏览器
@RequestMapping("/user")
UserDao getUser(){
return new UserDao("不学无数",23,"HeNan","1111111");
}
复制代码
此时在访问的时候就会在页面发现对象被转换成了Json字符串bash
若是须要本身定制转化器的话,能够在SpringBoot使用HttpMessageConverters进行配置,以下所示:cookie
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.*;
import org.springframework.http.converter.*;
@Configuration
public class MyConfiguration {
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter<?> additional = ...
HttpMessageConverter<?> another = ...
return new HttpMessageConverters(additional, another);
}
}
复制代码
若是使用Jackson去序列化和反序列化JSON数据的话,可能须要本身定制JsonSerializer和JsonDeserializer的类。SpringBoot提供了@JsonComponent注解能够直接很是容易的将你写的定制化解析JSON的类注册在Spring中。网络
也可使用@JsonComponent直接注解在JsonSerializer和JsonDeserializer的实现上。也能够注解在类上,类中包含了JsonSerializer和JsonDeserializer的实现.以下所示:
import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import org.springframework.boot.jackson.*;
@JsonComponent
public class Example {
public static class Serializer extends JsonSerializer<SomeObject> {
// ...
}
public static class Deserializer extends JsonDeserializer<SomeObject> {
// ...
}
}
复制代码
默认状况下,SpringBoot会将放在/static、/public、/resources或者/META-INF/resources目录下的文件称为静态资源。由于SpringBoot默认配置的映射地址为/**。例如咱们在项目中resources中建立一下两个文件夹,而且将静态的图片资源放入,分别起名为a和b。
此时咱们若是将项目启动起来,而后在浏览器中分别访问一下地址
http://localhost:8080/a.png
http://localhost:8080/b.png
复制代码
都可以正常访问到相应的图片资源。所以能够知道SpringBoot在访问静态资源的时候会从/static、/public、/resources或者/META-INF/resources目录下进行寻找文件,若是找到的话便直接返回。
若是默认的静态资源访问路径不符合需求的话,也能够进行自定义静态资源的访问路径配置。第一种的配置方式就是经过spring.mvc.static-path-pattern元素的配置。此时若是以下配置
##这里表示在页面的访问路径中为/resources/**的时候才会处理请求
spring.mvc.static-path-pattern=/resources/**
复制代码
那么仍是以前的静态资源存放路径的状况下,浏览器得以下访问才能访问到文件。
http://localhost:8080/resources/a.png
http://localhost:8080/resources/b.png
复制代码
若是此时是想更改静态资源文件的存放路径,那么能够经过spring.resources.static-locations元素进行配置
##默认状况下SpringBoot会在如下的文件夹中寻找静态文件
spring.resources.static-locations=classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources
复制代码
因此“spring.mvc.static-path-pattern”用于阐述HTTP请求地址,而“spring.resources.static-locations”则用于描述静态资源的存放位置。
第二种方式是经过@Configure注解而后继承WebMvcConfigurerAdapter重写addResourceHandlers方法。
/**
* @program: FirstSpringBoot
* @description: 配置静态资源的映射
* @author: hu_pf@suixingpay.com
* @create: 2018-07-27 14:37
**/
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/");
}
}
复制代码
在网络传输中,想要提高效率,第一个是提高网络带宽,第二个就是在有限的带宽下传输更少的东西,而模板文件就是这样。一般在用户第一次访问网站的时候,若是一些不变的内容能够在用户本机生成一个模板文件,而后第二次访问或者刷新的时候只传输动态的内容便可。
SpringBoot支持下列的模板技术的自动配置:
若是使用SpringBoot的默认配置的话,那么模板文件将会自动扫描放在src/main/resources/templates的文件做为模板文件。
若是使用IDEA进行项目的开发的话,因为IDEA扫描路径的方式不一样。因此若是使用IDE进行main方法的启动和使用gradle或者maven进行jar包的启动的话,扫描路径也是不一样的。这有可能形成SpringBoot在classpath中去找不到templates文件。若是有这种问题的话,可使用IDEA中的配置资源文件配置一下,或者在配置文件中配置classpath*:/templates/便可。
一般在开发过程当中,在Controller中每一个方法或许都得写一个异常处理的代码。例以下面这个例子:
@RequestMapping(value = "/query", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> queryCondition() {
try {
//业务代码省略
return setResult(list, count);
} catch (Exception e) {
return setFailure("查询失败");
}
}
@RequestMapping(value = "/getDetail", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> getByKey() {
try {
//业务代码省略
return map;
} catch (Exception e) {
return setFailure("查询失败");
}
}
复制代码
代码中存在着许多的try-catch 并且处理的还都是一个异常,返回的信息也是同样的,因此这时代码就会显得难看并且臃肿。SpringBoot提供了全局的异常处理方法。例以下面例子
/**
* @program: FirstSpringBoot
* @description: 全局Controller层异常处理
* @author: hu_pf@suixingpay.com
* @create: 2018-07-27 16:54
**/
@ControllerAdvice
public class GlobExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public String handleException(Exception e){
return "Exception BuXueWuShu "+e.toString();
}
}
复制代码
其中@ControllerAdvice注解是将所写的类注册到Spring容器中,@ControllerAdvice有个参数basePackageClasses,若是写了的话那么他就会处理所写的那个类所传出来的异常。若是不写的话,那么默认处理全部传出来的异常。另外@ExceptionHandler注解里面加上了异常的种类的话,那么此方法就单独的处理所写的异常,若是没写的话,就默认处理全部的异常。这时候在Controller层中全部的try-catch就能够去掉了。
在网站中,若是没有找到某个资源的话就会返回404的错误,默认的404界面有点丑,不够美观。若是想要自定义错误页面的话,那么就在静态资源文件夹下建立一个error文件夹,error文件夹下放想要处理状态码的文件,其中文件名为状态码。下面为状态码为404的例子:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
+- <other public assets>
复制代码
固然你也能够和上一节相结合,将错误信息返回到错误页面中,而后运用模板技术将错误信息拼接返回给用户。
通用的Servlet的配置能够经过Spring的环境变量来设置,通常都是讲配置写在application.properties中的。
常见的配置以下:
ServerProperties 更加详细的配置属性
若是想要程序化配置内嵌的Servlet容器的话,须要在Spring中注册实现了WebServerFactoryCustomizer接口的Bean。WebServerFactoryCustomizer提供了ConfigurableServletWebServerFactory。而ConfigurableServletWebServerFactory提供了许多的set方法进行设置属性。例子以下:
@Component
public class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
@Override
public void customize(ConfigurableServletWebServerFactory server) {
server.setPort(9000);
}
}
复制代码
若是上面的例子还不知足的话,那么能够直接在Spring容器中注册TomcatServletWebServerFactory、JettyServletWebServerFactory或者UndertowServletWebServerFactory
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.setPort(9000);
factory.setSessionTimeout(10, TimeUnit.MINUTES);
factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html"));
return factory;
}
复制代码
SpringBoot是不推荐在项目中使用JSP的,由于JSP在SpringBoot有如下的缺点:
这有一个JSP Sample教你如何在SpringBoot配置JSP