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