SSM整合详细教学(下)

简介: 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 拦截器概念和作用


3c2df0f7b8ca9e833f9ca52aca9e3578_5ac92bbd9b6b7cb0d20d0270be7b66d9.png


拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行

作用:

在指定的方法调用前后执行预先设定的代码

阻止原始方法的执行

总结:增强

核心原理:AOP思想


1.2 拦截器和过滤器的区别


归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术

拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强


62ade3ce9b9239b52fdc952c706fc834_0c78dba98b0b5446de586a3ae3bd0924.png


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 拦截器流程分析


ff755fbc9e08b594855f7192f26a658a_d78bccba34c98766d60e9299c6f6c384.png


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;
}


参数


request:请求对象

response:响应对象

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操作


b07535ee6eb525ff5a28f02abf470a1f_161b7fafa361fbd529432ec0e0228b97.png

相关文章
|
3月前
|
前端开发 JavaScript Java
毕业设计论文|基于SSM的网络教学系统设计与实现
毕业设计论文|基于SSM的网络教学系统设计与实现
|
9月前
|
Java 关系型数据库 MySQL
基于SSM的教学管理系统(有报告)。Javaee项目。
基于SSM的教学管理系统(有报告)。Javaee项目。
|
9月前
|
Java 关系型数据库 MySQL
基于SSM的教学课程评价管理系统(有报告)。Javaee项目。
基于SSM的教学课程评价管理系统(有报告)。Javaee项目。
|
2月前
|
小程序 前端开发 测试技术
微信小程序|ssm基于微信小程序的高校课堂教学管理系统
微信小程序|ssm基于微信小程序的高校课堂教学管理系统
|
2月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的大学多媒体教学管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的大学多媒体教学管理系统附带文章和源代码部署视频讲解等
32 7
|
2月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的数据库课程在线教学附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的数据库课程在线教学附带文章和源代码部署视频讲解等
33 4
|
2月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的景海中学教学管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的景海中学教学管理系统附带文章和源代码部署视频讲解等
25 5
|
3月前
|
JavaScript Java 测试技术
基于ssm+vue.js的计算机公共基础课程mooc教学平台附带文章和源代码设计说明文档ppt
基于ssm+vue.js的计算机公共基础课程mooc教学平台附带文章和源代码设计说明文档ppt
18 1
|
3月前
|
JavaScript Java 测试技术
基于ssm+vue.js的网络教学平台附带文章和源代码设计说明文档ppt
基于ssm+vue.js的网络教学平台附带文章和源代码设计说明文档ppt
31 1
|
2月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的高校教学业绩信息管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的高校教学业绩信息管理系统附带文章和源代码部署视频讲解等
15 0