SpringMVC的拓展

Posted cgblpx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC的拓展相关的知识,希望对你有一定的参考价值。

响应

是指传值到页面的方式

利用Model

方式1:model.addAttribute(“personList”, ps.list()); 推荐,清晰

方式2:model.addAttribute(ps.list());

@RequestMapping(value="/home")
	public String goHome(Model model){
		String message = "springMVC new home!";
		model.addAttribute("message", message);
		
		return "index";
	}

Model实际上是一个map,在网页调用时,通过视图解析器提交页面前,将map的内容设置到新产生的请求request流中。

返回json

@RequestMapping("/json")
	@ResponseBody
	public List<Person> person(){
		List<Person> list = new ArrayList<Person>();
		for(int i=0;i<5;i++){
			Person p = new Person();
			p.setId(i);
			p.setName("chen"+i);
			
			list.add(p);
		}
		return list;
	}

拦截器

概述

Springmvc提供的, 主要用于拦截用户请求并在方法执行前后添加功能.本质上也是AOP的思想. SpringMVC框架自动将配置的拦截器注入到所有的mapping中.

应用场景:

1、日志记录:可以记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等等。

2、权限检查:如登陆检测,进入处理器检测是否登陆,如果没有直接返回到登陆页面。

3、性能监控:可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间;

4、事务控制:对事务的提交回滚等,与业务无关的代码

PreHandle  //方法执行前被调用
	Method  //要执行的方法
PostHandle //方法执行后被调用
AfterCompletion //完全执行完后被调用(如:释放资源)

创建拦截器

创建拦截器,必须实现接口HandlerInterceptor,并重写三个方法,添加业务

package cn.tedu.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//自定义拦截器:在方法执行前后添加与业务无关的功能
@Component//交给spring管理bean的ioc di
public class MyInterceptor implements HandlerInterceptor{
    long start ;
    long end ;
    @Override //在方法执行前调用
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        start = System.currentTimeMillis();
        System.out.println("方法要被执行啦~");
        return true;//放行
    }
    @Override //在方法执行后调用
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        end = System.currentTimeMillis();
        System.out.println("方法执行完啦~");
    }
    @Override //都完成后调用
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("都干完啦~耗时: "+(end-start)+"ms");
    }
}

注册拦截器

注册拦截器,必须实现接口WebMvcConfigure,通知spring容器管理这个类

package cn.tedu.interceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration//告诉spring容器,我是一个配置类
public class RegistInterceptor implements WebMvcConfigurer {

    @Autowired//自动装配
    private MyInterceptor a ;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //把自定义的拦截器,放入容器中
        registry.addInterceptor(a);
    }
}

使用拦截器

打开浏览器,访问所有Controller中的任何方法,都会触发拦截器,执行拦截器的功能

package cn.tedu.interceptor;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/in")
public class InController {

    @RequestMapping("/get")
    public void get(){
        System.out.println(111);
    }
    @RequestMapping("/save")
    public void save(){
        for (int i = 0; i < 1000; i++) {
            System.out.print(i);
        }
    }
}

测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WEBw9I5G-1623044111737)(RackMultipart20210607-4-13lyxac_html_bac99ffe57bb22fb.png)]

以上是关于SpringMVC的拓展的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC的拓展

Spring MVC 3.2 Thymeleaf Ajax 片段

每个 Python 开发者必备的5款 VScode 拓展工具包!

Spring+SpringMVC+MyBatis+Maven框架整合

前端开发必备!Emmet使用手册

springmvc 分页查询的简单实现