SSM整合详细教学(下)

在这里插入图片描述

五、SSM整合页面开发

1 准备工作

为了确保静态资源能够被访问到,需要设置静态资源过滤

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    
    
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    
    
        registry.addResourceHandler("/pages/**")
            .addResourceLocations("/pages/");
        registry.addResourceHandler("/css/**")
            .addResourceLocations("/css/");
        registry.addResourceHandler("/js/**")
            .addResourceLocations("/js/");
        registry.addResourceHandler("/plugins/**")
            .addResourceLocations("/plugins/");
    }
}

2 列表查询功能

  • 前端代码
//列表
getAll() {
    
    
    //发送ajax请求
    axios.get("/books").then((res)=>{
    
    
        this.dataList = res.data.data;
    });
}

3 添加功能

  • 前端代码
//弹出添加窗口
handleCreate() {
    
    
    this.dialogFormVisible = true;
    this.resetForm();
},
//重置表单
resetForm() {
    
    
    this.formData = {
    
    };
},
//添加
handleAdd () {
    
    
    //发送ajax请求
    axios.post("/books",this.formData).then((res)=>{
    
    
        console.log(res.data);
        //如果操作成功,关闭弹层,显示数据
        if(res.data.code == 20011){
    
    
            this.dialogFormVisible = false;
            this.$message.success("添加成功");
        }else if(res.data.code == 20010){
    
    
            this.$message.error("添加失败");
        }else{
    
    
            this.$message.error(res.data.msg);
        }
    }).finally(()=>{
    
    
        this.getAll();
    });
},
  • 后台代码改进
@Service
public class BookServiceImpl implements BookService {
    
    
    @Autowired
    private BookDao bookDao;
	//增删改的方法判断了影响的行数是否大于0,而不是固定返回true
    public boolean save(Book book) {
    
    
        return bookDao.save(book) > 0;
    }
	//增删改的方法判断了影响的行数是否大于0,而不是固定返回true
    public boolean update(Book book) {
    
    
        return bookDao.update(book) > 0;
    }
	//增删改的方法判断了影响的行数是否大于0,而不是固定返回true
    public boolean delete(Integer id) {
    
    
        return bookDao.delete(id) > 0;
    }

    public Book getById(Integer id) {
    
    
        if(id < 0){
    
    
            throw new BusinessException(Code.BUSINESS_ERR,"请不要使用你的技术挑战我的耐性!");
            return bookDao.getById(id);
        }
    }
    public List<Book> getAll() {
    
    
        return bookDao.getAll();
    }
}

4 修改功能

  • 显示弹出框查询图书信息
//弹出编辑窗口
handleUpdate(row) {
    
    
    // console.log(row);   //row.id 查询条件
    //查询数据,根据id查询
    axios.get("/books/"+row.id).then((res)=>{
    
    
        // console.log(res.data.data);
        if(res.data.code == 20041){
    
    
            //展示弹层,加载数据
            this.formData = res.data.data;
            this.dialogFormVisible4Edit = true;
        }else{
    
    
            this.$message.error(res.data.msg);
        }
    });
}
  • 保存修改后的图书信息
//编辑
handleEdit() {
    
    
    //发送ajax请求
    axios.put("/books",this.formData).then((res)=>{
    
    
        //如果操作成功,关闭弹层,显示数据
        if(res.data.code == 20031){
    
    
            this.dialogFormVisible4Edit = false;
            this.$message.success("修改成功");
        }else if(res.data.code == 20030){
    
    
            this.$message.error("修改失败");
        }else{
    
    
            this.$message.error(res.data.msg);
        }
    }).finally(()=>{
    
    
        this.getAll();
    });
}

5 删除功能

// 删除
handleDelete(row) {
    
    
    //1.弹出提示框
    this.$confirm("此操作永久删除当前数据,是否继续?","提示",{
    
    
        type:'info'
    }).then(()=>{
    
    
        //2.做删除业务
        axios.delete("/books/"+row.id).then((res)=>{
    
    
            if(res.data.code == 20021){
    
    
                this.$message.success("删除成功");
            }else{
    
    
                this.$message.error("删除失败");
            }
        }).finally(()=>{
    
    
            this.getAll();
        });
    }).catch(()=>{
    
    
        //3.取消删除
        this.$message.info("取消删除操作");
    });
}

六、拦截器

1 拦截器简介

问题导入

问题1:拦截器拦截的对象是谁?

问题2:拦截器和过滤器有什么区别?

1.1 拦截器概念和作用

image-20210805175445422

  • 拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
  • 作用:
    1. 在指定的方法调用前后执行预先设定的代码
    2. 阻止原始方法的执行
    3. 总结:增强
  • 核心原理:AOP思想

1.2 拦截器和过滤器的区别

  • 归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
  • 拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强

image-20210805175539717

2 入门案例

问题导入

定义拦截器需要实现什么接口?

2.1 拦截器代码实现

【第一步】定义拦截器

做法:定义一个类,实现HandlerInterceptor接口即可

@Component //注意当前类必须受Spring容器控制
//定义拦截器类,实现HandlerInterceptor接口
public class ProjectInterceptor implements HandlerInterceptor {
    
    
    @Override
    //原始方法调用前执行的内容
    //返回值类型可以拦截控制的执行,true放行,false终止
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("preHandle..."+contentType);
        return true;
    }

    @Override
    //原始方法调用后执行的内容
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        System.out.println("postHandle...");
    }

    @Override
    //原始方法调用完成后执行的内容
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        System.out.println("afterCompletion...");
    }
}
【第二步】配置加载拦截器
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    
    
    @Autowired
    private ProjectInterceptor projectInterceptor;

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
    
    
        //配置拦截器
        registry.addInterceptor(projectInterceptor)
            .addPathPatterns("/books","/books/*");
    }
}

使用标准接口WebMvcConfigurer简化开发(注意:侵入式较强)

@Configuration
@ComponentScan({
    
    "com.sun.controller"})
@EnableWebMvc
//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {
    
    
    @Autowired
    private ProjectInterceptor projectInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
    
        //配置多拦截器
        registry.addInterceptor(projectInterceptor)
            .addPathPatterns("/books","/books/*");
    }
}

2.2 拦截器流程分析

image-20210805180846313

3 拦截器参数

问题导入

postHandle()和afterCompletion()方法都是处理器方法执行之后执行,有什么区别?

3.1 前置处理

//原始方法调用前执行的内容
//返回值类型可以拦截控制的执行,true放行,false终止
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
    System.out.println("preHandle..."+contentType);
    return true;
}
  • 参数

    1. request:请求对象
    2. response:响应对象
    3. handler:被调用的处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了再包装
  • 返回值
    返回值为false,被拦截的处理器将不执行。

3.2 后置处理

//原始方法调用后执行的内容
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
    System.out.println("postHandle...");
}
  • 参数
    modelAndView:如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行跳转

注意:如果处理器方法出现异常了,该方法不会执行

3.3 完成后处理

//原始方法调用完成后执行的内容
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
    System.out.println("afterCompletion...");
}
  • 参数
    ex:如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理

注意:无论处理器方法内部是否出现异常,该方法都会执行。

4 拦截器链配置

问题导入

什么是拦截器链?

4.1 多个拦截器配置

  • 定义第二个拦截器
@Component
public class ProjectInterceptor2 implements HandlerInterceptor {
    
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("preHandle...222");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        System.out.println("postHandle...222");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        System.out.println("afterCompletion...222");
    }
}
  • 配置第二个拦截器
@Configuration
@ComponentScan({
    
    "com.itheima.controller"})
@EnableWebMvc
//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {
    
    
    @Autowired
    private ProjectInterceptor projectInterceptor;
    @Autowired
    private ProjectInterceptor2 projectInterceptor2;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
    
        //配置多拦截器
        registry.addInterceptor(projectInterceptor)
            .addPathPatterns("/books","/books/*");
        registry.addInterceptor(projectInterceptor2)
            .addPathPatterns("/books","/books/*");
    }
}

4.2 多个连接器工作流程分析

  • 当配置多个拦截器时,形成拦截器链
  • 拦截器链的运行顺序参照拦截器添加顺序为准
  • 当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行
  • 当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作

image-20210805181537718

猜你喜欢

转载自blog.csdn.net/qq_51808107/article/details/130540939