springboot之使用java代码配置springmvc

话说,在我们想要将后台数据再页面展示的时候,那么我们就需要使用视图解析器。但是如何展示呢,那么我们就需要配置视图解析器,在这里主要讲解spring mvc的解析器。

静态资源的访问

访问静态资源(html,jsp,js,png等等)的时时候,我们需要继承WebMvcConfigurerAdapter里面的一些方法,已实现对静态资源的访问。

具体代码块如下

@Configuration
//开启Spring MVC支持,若无此句,重写WebMvcConfigurerAdapter方法无效
@EnableWebMvc   
@ComponentScan
//继承WebMvcConfigurerAdapter类,重写其方法可对Spring MVC进行配置
public class MyMvcConfig extends WebMvcConfigurerAdapter{
    // 页面设置参数配置
    @Bean
    public InternalResourceViewResolver viewResolver(){
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        // 设置视图的存放路径
        viewResolver.setPrefix("/WEB-INF/classes/views/");
        // 页面后缀
        viewResolver.setSuffix(".jsp");
        viewResolver.setViewClass(JstlView.class);
        return  viewResolver;
    }

     // 对图片、js等直接访问资源的路径
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
           //addResourceHandler指的是对外暴露的访问路径,addResourceLocations指的是文件放置的目录     
           registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");
    }

    /**
     * 重写addInterceptors方法,注册拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //super.addInterceptors(registry);
        // DemoInterceptor()的将在后面展示出来
        registry.addInterceptor(new DemoInterceptor());
    }
}

拦截器

在对资源访问的时候,需要对请求进行拦截,这时候就要用到拦截器这个资源了。拦截器主要重写addInterceptors方法,向里面注册自定义拦截器,自定义拦截器需要继承HandlerInterceptorAdapter重写一些方法。

具体代码块如下

//继承HandlerInterceptorAdapter类来实现自定义拦截器
public class DemoInterceptor extends HandlerInterceptorAdapter{
    /**
     * 重写preHandle方法,在请求发生之前执行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //return super.preHandle(request, response, handler);
        long startTime = System.currentTimeMillis();
        request.setAttribute("startTime",startTime);
        return true;
    }

    /**
     * 重写postHandle方法,在请求完成之后执行
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //super.postHandle(request, response, handler, modelAndView);
        long startTime = (long) request.getAttribute("startTime");
        request.removeAttribute("startTime");
        long endTime = System.currentTimeMillis();
        System.out.println("本次请求处理时间为:"+new Long(endTime-startTime)+"ms");
        request.setAttribute("handlingTime",endTime-startTime);
    }
}

自定义异常处理

在想对异常进行统一处理,这时候就需要使用@ControllerAdvice注解,可使用@ExceptionHandler,@InitBinder,@ModelAttribute注解到方法上,这对所有注解了@RequestMapping的控制器内的方法有效。

 @ExceptionHandler:用于全局处理控制器的异常
 @InitBinder:用来设置WebDataBinder,WebDataBinder用来自动绑定前台请求参数到Model中。
 @ModelAttribute:@ModelAttribute本来的作用是绑定键值对到Model里,此处是让全局的@RequestMapping都能获得此处设置的键值对。

具体代码块如下

@ControllerAdvice
public class ExceptionHandlerAdvice {
    /**
     * @ExceptionHandler在此处定义全局处理,通过@ExceptionHandler的value属性可过滤拦截的条件,
     * 再此我们可以看出我们拦截所有的Exception
     * @param exception
     * @param request
     * @return
     */
    @SuppressWarnings("rawtypes")
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public BaseResult handle(Exception e) {
        if (e instanceof OperateSysException) {
            OperateSysException exception = (OperateSysException) e;
            return ResultUtil.throwSysException(exception);
        } else if (e instanceof DataException) {
            logger.error("[系统异常]{}", e);
            CodeUtils.DATA_ERROR.setMessage(e.getMessage());
            return ResultUtil.SysError(CodeUtils.ERROR);
        } else if (e instanceof BindException){
            logger.error("[系统异常]{}", e);
            CodeUtils.VAILID_ERROR.setMessage(((BindException) e).getFieldError().getDefaultMessage());
            return ResultUtil.SysError(CodeUtils.VAILID_ERROR);
        } else {
            logger.error("[系统异常]{}", e);
            return ResultUtil.SysError(CodeUtils.ERROR);
        }
    }


    /**
     * 此处使用@ModelAttribute注解将键值对添加到全局,所有注解了@RequestMapping的方法可获得此键值对
     * @param model
     */
    @ModelAttribute
    public void addAttributes(Model model){
        model.addAttribute("msg", "额外信息");
    }

    /**
     * 通过@InitBinder注解定制WebDataBinder
     * @param webDataBinder
     */
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder){
        //此处演示忽略request参数的id
        webDataBinder.setDisallowedFields("id");
    }

}

控制器演示

@Controller
public class AdviceController {
    @RequestMapping("/advice")
    public String getSomething(@ModelAttribute("msg") String msg, DemoObj obj){
        throw new IllegalArgumentException("非常抱歉,参数有误/" + "来自@ModelAttribute:" + msg);
    }
}

来源

参考1:https://blog.csdn.net/j903829182/article/details/75890258/

猜你喜欢

转载自blog.csdn.net/hfc189933/article/details/81977785