Spring MVC

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+的异步方法特性,可以跨浏览器。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值