Spring Boot 探索之旅(五)——Web支持
目录
一、常规MVC配置
/**
* 主要WebMvc配置
* @author sunyiran
* @date 2018-09-29
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 注册自定义拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
}
/**
* 注册视图映射
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
}
/**
* 注册资源映射
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
}
/**
*注册类型格式
* @param registry
*/
@Override
public void addFormatters(FormatterRegistry registry) {
}
/**
* 配置转化器
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}
/**
* 配置异常处理器
* @param exceptionResolvers
*/
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
}
/**
* 配置跨域请求
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
}
}
1.1 注册视图映射
目标:输入localhost:8082时,访问非默认首页first.html
第一步、编写视图映射注册器(ViewController访问相对路径,ViewName视图名称)
/**
* 注册视图映射
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
/*访问相对路径为/时,映射至first,结合模版前后缀,跳转值/templates/first.html*/
registry.addViewController("/").setViewName("first");
}
第二步、运行项目测试
1.2 注册拦截器
目标:访问healthy方法是,返回“Bad”(正常为OK)
第一步、编写拦截器HealthyIntercepor
/**
* @author sunyiran
* @date 2018-09-29
*/
public class HealthyInterceptor implements HandlerInterceptor {
/**
* 调用前拦截
* @param request
* @param response
* @param handler
* @return false:直接返回,不进入目标方法
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setHeader("Content-Type","text/html");
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("<html><body>Bad</body></html>".getBytes());
outputStream.close();
return false;
}
/**
* 调用后拦截
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
}
第二步、注册拦截器
/**
* 注册自定义拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册healthy拦截器,匹配路径为正则表达
registry.addInterceptor(new HealthyInterceptor()).addPathPatterns("/healthy");
}
第三步、运行测试
1.3 注册静态资源映射
目标:输入localhost:8082/file/test.jpg 能访问到file目录中的test.jpg
第一步、注册资源映射
/**
* 注册资源映射
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/file/**").addResourceLocations("classpath:/file/");
}
第二步、运行测试
1.4 注册对象格式器
目标:传入yyyy/MM-dd HH:ss:mm格式的字符串能自动解析为日期对象
第一步、编写格式器(实现对象文本与对象实体的相互转换)
/**
* @author sunyiran
* @date 2018-09-29
*/
public class DateFormatter implements Formatter<Date> {
private SimpleDateFormat format = new SimpleDateFormat("yyyy/MM-dd HH:ss:mm");
@Override
public Date parse(String s, Locale locale) throws ParseException {
return format.parse(s);
}
@Override
public String print(Date date, Locale locale) {
return format.format(date);
}
}
第二步、注册格式器
/**
*注册类型格式
* @param registry
*/
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new DateFormatter());
}
第三步、运行测试
1.5 注册对象转换器
目标:传入yyyy/MM-dd HH:ss:mm格式的字符串能自动解析为日期对象
第一步、编写格式转换器
/**
* @author sunyiran
* @date 2018-09-29
*/
public class DateConvert implements Converter<String ,Date> {
private SimpleDateFormat format = new SimpleDateFormat("yyyy/MM-dd HH:ss:mm");
@Override
public Date convert(String source) {
try {
return format.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
第二步、注册转化器
/**
*注册类型格式转换
* @param registry
*/
@Override
public void addFormatters(FormatterRegistry registry) {
//registry.addFormatter(new DateFormatter());
registry.addConverter(new DateConvert());
}
第三步、运行测试
********formatter和convert都可以直接用@component纳入容器,自动注册
二、注册Servlet、Filter、Listener
必要条件:在项目主类上添加@ServletComponentScan开启对@WebFilter等注解扫描
2.1 Servlet
目标:输入localhost:8082/ts ,输出this is a servlet
第一步、编写servlet
/**
* @author sunyiran
* @date 2018-09-29
*/
@WebServlet(urlPatterns = "/ts")
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
servletResponse.getOutputStream().write("this is a servlet".getBytes());
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
第二步、运行测试
2.2 Filter
目标:访问localhost:8082/test ,打印 healthyFilter执行
第一步、编写filter
/**
* @author sunyiran
* @date 2018-09-29
*/
@WebFilter(urlPatterns = "/test")
public class HealthFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("healthyFilter执行");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
第二步、运行测试
2.3 Listener
目标:访问任意资源,打印监听开始
第一步、编写监听器
/**
* @author sunyiran
* @date 2018-09-29
*/
@WebListener
public class MyListner implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("监听开始");
}
}
第二步、运行测试