SpringMVC提供了一个DispatcherServlet来开发WEB应用。在servlet2.5及以下的时候只要在web.xml中配置<servlet>元素即可。但使用servlet3.0+无web.xml配置的方式,在springMVC里实现WebApplicationInInitializer接口便可等同于web.xml配置。
SpringMVC的常用注解:
- @Controller:注解在类上,表明这个类是SpringMVC里的controller,将其声明为spring的一个Bean,DispatcherServlet会自动扫描注解了此注解的类,并将web请求映射到注解了@RequestMapping的方法上。注意在声明Bean的时候,使用@Service、@Repository、@Component和@Controller是一样的,因为@Service、@Repository、@Controller都组合了、@Component,但是SpringMVC声明控制器Bean时只能使用@Controller。
- @RequestMapping:注解在类或方法上,用来映射web请求(访问路径和参数)处理类和方法的。
- @RequestBody:允许request的参数在request体中,注解放在参数前。
- @ResponseBody:将返回值放在response体内,注解方法返回值前、类或方法上。
- @PathVariable:用来接收路径参数,如/test/1,可接收1作为参数,注解放在参数前。
- @RestController:此注解是@Controller和@ResponseBody的组合。
SpringMVC的基本配置:SpringMVC的定制配置,需要我们的配置类继承一个WebMvcConfigurerAdapter类,这样我们就可以重写这个类的方法,完成我们的常用配置。简单的配置如下:
package com.xiaobai.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Configuration
public class MyWebMvcConfig extends WebMvcConfigurerAdapter {
/**
* 静态资源映射
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//addResourceHandler指的是对外暴露的访问路径,addResourceLocations指的是文件放置的目录
registry.addResourceHandler("/views/**").addResourceLocations("classpath:/META-INF/resources/views/");
}
/**
* 拦截器配置
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
/**
* 1.addInterceptor注册拦截器
* 2.正常应该自定义拦截器,继承HandlerInterceptorAdapter类,重写preHandle方法和postHandle方法
* preHandle方法在请求发生前执行
* postHandle在请求完成后执行
* 3.addPathPatterns添加拦截路径
*/
registry.addInterceptor(new HandlerInterceptorAdapter() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
long startTime = (Long) request.getAttribute("startTime");
request.removeAttribute("startTime");
long endTime = System.currentTimeMillis();
System.out.println("本次请求时间为:" + new Long(endTime - startTime) + "ms");
request.setAttribute("handingTime", endTime - startTime);
}
}).addPathPatterns("/**");
}
/**
* 项目中会遇到类似下面这种没有业务处理,只是简单的页面转向
* @RequestMapping("/index")
* public String hello() {
* return "index";
* }
* 使用下面的配置就可以简化写法
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("/index");
registry.addViewController("/error").setViewName("/error");
}
/**
* 路径匹配参数配置
* 如我们访问的路径是http://localhost/xx.yy
* 那么.后面的yy会被忽略,使用下面配置不会被忽略
* @param configurer
*/
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
}
}
@ControllerAdvice:使用@ControllerAdvice我们可以将对于控制器的配置放在同一位置,注解了@Controller的类的方法可使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上,这对所有注解了@RequestMapping的控制器内的方法有效。
- @ExceptionHandler:用于全局处理控制器里的异常,通过value的属性值可过滤拦截的条件。
- @InitBinder:用来设置WebDateBinder,WebDateBinder用来自动绑定前台请求参数到Model中。
- @ModelAttribute:将键值对添加到全局。
HttpMessageConverter:HttpMessageConverter是用来处理request和response里的数据的。Spring内置了很多HttpMessageConverter,比如MappingJackson2HttpMessageConverter,StringHttpMessageConverter等。使用HttpMessageConverter分为两个步骤:1.自定义HttpMessageConverter,2.注册这个HttpMessageConverter到SpringMVC。注册自定义的HttpMessageConverter有两个方法:
- configureMessageConverters:重载会覆盖掉SpringNVC默认注册的多个HttpMessageConverter。
- extendMessageConverters:仅添加一个HttpMessageConverter,不会覆盖掉默认注册的HttpMessageConverter。
服务器端推送技术:
- 基于SSE(server send event服务端发送事件)的服务器端推送,需要新式浏览器的支持。
- Servlet3.0+的异步方法特性,可以跨浏览器。