Springboot构建spring mvc的web应用

14 篇文章 3 订阅
1 篇文章 0 订阅

springBoot非常适合web应用程序开发, 你可以轻松地创建一个独立的使用嵌入式HTTP服务器TomcatJetty,Undertow,大多数web应用程序将使用spring-boot-starter-web模块快速地启动和运行

 

Spring Web MVC框架(通常被称为“Spring MVC”)是一个富有的模型-视图-控制器”Web框架,Spring MVC允许您创建特殊@ controller@RestController bean来处理传入的HTTP请求。在你的控制器方法映射到HTTP使用@RequestMapping注解,这是一个典型的例子@RestControllerJSON数据:

@RestController

@RequestMapping(value="/users")

publicclass 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) {

       // ...

   }

 

}

SpringMVC 自动配置

Spring bootSpring MVC提供了自动配置在大多数应用程序运作良好,spring的自动配置上添加以下特性的缺省值:

·      包括ContentNegotiatingViewResolverBeanNameViewResolver实例.

·      支持静态资源服务, 包括支持WebJars (看下面).

·      自动注册 Converter, GenericConverter, Formatter beans.

·      支持HttpMessageConverters (看下面).

·      自动注册MessageCodesResolver (看下面).

·      静态index.html支持.

·      支持自定义Favicon

·      自动使用ConfigurableWebBindingInitializer对象.

如果你想保持springboot MVC功能,你只是想添加额外的MVC配置(拦截器,格式器,视图控制器等, 您可以添加自己的@ configurationWebMvcConfigurerAdapter类型,但没有@EnableWebMvc。如果您希望提供自定义的实例RequestMappingHandlerMapping,RequestMappingHandlerAdapter或者ExceptionHandlerExceptionResolver你可以声明一个WebMvcRegistrationsAdapter提供此类组件实例。你想要完全控制Spring MVC,您可以添加您自己的@ configuration @EnableWebMvc注释

 

 HttpMessageConverters

Spring MVC利用HttpMessageConverter接口convert HTTP 请求和响应,合理的默认值都包含开箱即用的, 例如对象可以被自动转换成JSON(使用杰克逊库)XML(使用杰克逊XML扩展如果可用,否则使用JAXB),字符串是默认使用utf - 8编码。如果你需要添加或自定义转换器可以使用SpringbootHttpMessageConverters:

@Configuration

publicclass MyConfiguration {

 

    @Bean

    publicHttpMessageConverters customConverters() {

       HttpMessageConverter<?> additional = ...

       HttpMessageConverter<?> another = ...

       returnnewHttpMessageConverters(additional, another);

   }

 

}

任何HttpMessageConverter存在bean上下文将被添加到列表的转换器。你也可以覆盖默认的转换器。

自定义JSON序列化器和反序列化器

如果你使用json进行序列化和反序列化JSON数据如果你使用杰克逊进行序列化和反序列化JSON数据,you might want to write your own JsonSerializer and JsonDeserializer classes自定义序列化器通常是通过一个模块注册json. spring boot提供了另一种@JsonComponent注释使它容易直接注册Spring bean,你可以直接使用@JsonComponent JsonSerializerJsonDeserializer实现,您还可以使用它作为内部类包含序列化器/反序列化器类。例如:

 

 

 

@JsonComponent

publicclass Example {

 

    publicstaticclass Serializer extendsJsonSerializer<SomeObject> {

       // ...

   }

 

    publicstaticclass Deserializer extendsJsonDeserializer<SomeObject> {

       // ...

   }

 

}

 

所有@JsonComponent bean ApplicationContext将自动注册为json, 由于@JsonComponent meta-annotated @ component,常见的组件扫描规则适用。

 

 

MessageCodesResolver

 

Spring MVC有策略根据绑定的错误为发生的错码误rendering错误信息:MessageCodesResolverspring boot将为您创建一个如果你设置spring.mvc.message-codes-resolver属性PREFIX_ERROR_CODE or POSTFIX_ERROR_CODE

 

StaticContent

默认情况下springboot将为静态内容提供服务从一个目录名为/静态(/公共或资源或/ meta - inf /资源)在类路径中或者从ServletContext的根源,它使用Spring MVCResourceHttpRequestHandler可以修改行为通过添加自己的WebMvcConfigurerAdapter和覆盖addResourceHandlers方法。

以前写spring MVC的时候,要添加一个新页面访问总是要新增一个Controller或者在已有的一个Controller中新增一个方法,然后再跳转到设置的页面上去。考虑到大部分应用场景中View和后台都会有数据交互,这样的处理也无可厚非,不过我们肯定也有只是想通过一个URL Mapping然后不经过Controller处理直接跳转到页面上的需求!今天在做Spring Security相关配置的时候偶然发现了Spring也为我们提供了一个办法!那就是 WebMvcConfigurerAdapter !废话不多说了,直接看代码:

1.  ;  

2.    

3.  @Configuration  

4.  public class MVCConfiguration extends WebMvcConfigurerAdapter {  

5.        

6.      @Override  

7.      public void addViewControllers(ViewControllerRegistry registry){  

8.          registry.addViewController("/login").setViewName("login");  

9.      }  

10.

默认情况下,资源映射/通过spring.mvc.static-path-pattern * *,但您可以调整,例如,将所有资源/资源/ * *可以实现如下:

spring.mvc.static-path-pattern=/resources/**

您还可以自定义静态资源位置使用spring.resources.static-locations(替换默认值的列表目录位置)。如果你这样做默认欢迎页面检测将切换到您的自定义的位置,如果有index.html在任何地点在启动时,它将应用程序的主页。除了上面的标准的静态资源的位置, 一种特殊情况是由Webjars内容, 任何资源的路径/ webjars / * *将从jar文件打包在webjars格式。springboot也支持由Spring MVC提供高级资源处理功能, 允许缓存静态资源破坏等用例或使用版本为Webjars不可知论者的url,使用版本无关的url Webjars,只需添加webjars-locator依赖,Then declare your Webjar, taking jQuery for example, as "/webjars/jquery/dist/jquery.min.js" which results in "/webjars/jquery/x.y.z/dist/jquery.min.js" where x.y.z is the Webjar version,

使用缓存戳穿,以下配置将配置缓存破坏所有静态资源的解决方案,有效地添加内容哈希在url,比如<链接的href = " / css /spring-2a2d595e6ed9a0b24f027f2b63b134d6.css " / >:

spring.resources.chain.strategy.content.enabled=true

spring.resources.chain.strategy.content.paths=/**

在运行时链接资源是重写的模板, 由于ResourceUrlEncodingFilter, auto-configured for Thymeleaf and FreeMarker,你应该手动声明这个过滤器在使用jsp

现在其他模板引擎不支持自动,但可以使用自定义模板宏/帮手和ResourceUrlProvider的使用。

当加载资源动态,例如,一个JavaScript模块加载器,重命名文件不是一个选择,这就是为什么其他策略也支持,可以结合。“fixed”策略将添加一个静态URL中的版本字符串,而不改变文件名.

spring.resources.chain.strategy.content.enabled=true

spring.resources.chain.strategy.content.paths=/**

spring.resources.chain.strategy.fixed.enabled=true

spring.resources.chain.strategy.fixed.paths=/js/lib/

spring.resources.chain.strategy.fixed.version=v12

With this configuration,JavaScript modules located under "/js/lib/" will use a fixed versioning strategy "/v12/js/lib/mymodule.js" while other resources will still use the content one <linkhref="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>.

 

ConfigurableWebBindingInitializer

Spring MVC使用WebBindingInitializer来初始化一个WebDataBinder为特定请求服务,If you create your own ConfigurableWebBindingInitializer@Bean, Spring Boot will automatically configure Spring MVC to use it.

 

Templateengines

REST web服务,您还可以使用Spring MVC为动态HTML控制服务,Spring MVC支持各种模板技术包括Thymeleaf FreeMarkerjsp,许多其他模板引擎与Spring MVC的集成,springboot包括自动配置支持以下模板引擎:

jsp应该避免如果可能的话,有几个已知的限制在使用嵌入servlet容器,当你使用上面的其中一个模板引擎并使用默认配置时,你的模板将自动从src/main/resource/templates里读取。

IntelliJ IDEA放置的类路径不同取决于你如何运行您的应用程序,当你用IDE通过Main方法运行你的应用程序时会得到不同的路径与你通过maven或者Gradle的打包jar。如果你受到这个问题你可以重新排序类路径在IDE中先把模块的类和资源,或者,您可以配置模板搜索类路径上的每个模板目录前缀:classpath *:/ /模板。

 

ErrorHandling

springboot提供了一个默认/错误映射,以合理的方式处理所有错误,并注册为“global”servlet容器的错误页面,为机器的客户端将生成JSON响应的细节错误,HTTP状态和异常消息,为浏览器的客户端有一个“whitelabel”错误view,HTML格式显示相同的数据。替换默认的行为完全可以实现ErrorController和注册一个bean定义的类型,或简单地添加一个类型的bean ErrorAttributes使用现有机制但替换内容。您还可以定义一个@ControllerAdvice定制特定控制器返回的JSON文档和/或异常类型。

@ControllerAdvice(basePackageClasses =FooController.class)

publicclassFooControllerAdvice extendsResponseEntityExceptionHandler {

 

    @ExceptionHandler(YourException.class)

    @ResponseBody

   ResponseEntity<?> handleControllerException(HttpServletRequestrequest, Throwable ex) {

       HttpStatus status = getStatus(request);

       returnnewResponseEntity<>(newCustomErrorType(status.value(), ex.getMessage()), status);

   }

 

    private HttpStatusgetStatus(HttpServletRequest request) {

       Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");

       if (statusCode == null) {

           returnHttpStatus.INTERNAL_SERVER_ERROR;

       }

       return HttpStatus.valueOf(statusCode);

   }

 

}

在上面的示例中,如果YourException抛出同一个包中定义的一个控制器FooController,CustomerErrorType POJOjson表示将使用而不是ErrorAttributes表示。

Custom errorpages

 

如果你想显示自定义HTML错误页面对于给定的状态代码,添加一个文件到一个文件夹/错误,错误页面可以是静态HTML(即添加在任何静态资源文件夹)或使用模板,文件的名称应准确的状态代码或一系列的面具,例如,404年映射到一个静态的HTML文件,文件夹结构是这样的:

src/

 +-main/

    +- java/

    |   + <source code>

    +- resources/

        +- public/

             +- error/

             |  +- 404.html

             +- <other publicassets>

 

映射所有5 xx错误使用FreeMarker模板,你会有一个这样的结构:

src/

 +-main/

    +- java/

    |   + <source code>

    +- resources/

        +- templates/

             +- error/

             |  +- 5xx.ftl

             +- <othertemplates>

 

对于更复杂的映射还可以添加bean实现ErrorViewResolver接口。

publicclass MyErrorViewResolver implements ErrorViewResolver{

 

    @Override

    public ModelAndView resolveErrorView(HttpServletRequest request,

           HttpStatus status, Map<String, Object> model) {

       // Use the request or status tooptionally return a ModelAndView

       return ...

   }

 

}

 

您还可以使用常规的Spring MVC功能@ExceptionHandler方法和@ControllerAdviceErrorController会捡起任何未处理的异常。

 

Mappingerror pages outside of Spring MVC

对于不使用Spring MVC的应用程序,您可以使用直接注册ErrorPages ErrorPageRegistrar接口,这种抽象工作直接与底层嵌入式servlet容器和将工作,即使你没有一个Spring MVC

@Bean

publicErrorPageRegistrar errorPageRegistrar(){

    returnnewMyErrorPageRegistrar();

}

 

// ...

 

privatestaticclassMyErrorPageRegistrar implementsErrorPageRegistrar {

 

    @Override

    publicvoidregisterErrorPages(ErrorPageRegistry registry) {

       registry.addErrorPages(newErrorPage(HttpStatus.BAD_REQUEST, "/400"));

   }

 

}

 

注意:如果你注册一个ErrorPage路径,最终将由一个过滤器(如常见的一些non-Spring web框架,jerseyWicket), 然后过滤器必须明确注册为一个错误调度程序,例如:

@Bean

publicFilterRegistrationBean myFilter() {

   FilterRegistrationBean registration = newFilterRegistrationBean();

   registration.setFilter(new MyFilter());

   ...

   registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));

    return registration;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值