【尚筹网IDEA版】04-异常处理、ajax请求等

先前的记录

【尚筹网IDEA版】01-基本环境空间搭建

【尚筹网IDEA版】02-数据库创建、Mybatis逆向、Spring整合Mybatis

【尚筹网IDEA版】03-SSM整合测试

代码下载

git clone https://github.com/YuanbaoQiang/atcrowdfunding.git

Spring-MVC下的ajax请求

基本流程

前端代码

$("#btn4").click(function () {
    // 准备要发送的数据
    var student = {
        "stuId":10,
        "stuName":"tom",
        "address":{
            "province":"湖南",
            "city":"长沙",
            "street":"岳麓"
        },
        "subjectList":[
            {
                "subjectName":"JavaSE",
                "subjectScore":99
            },
            {
                "subjectName":"SSM",
                "subjectScore":98
            }
        ],
        "map":{
            "key1":"v1",
            "key2":"v2"
        }
    };


    // 将jason对象转换为json字字符串
    let requestBody = JSON.stringify(student);
    // 发送ajax请求
    $.ajax({
        "url": "send/compose/object.json",
        "type":"post",
        "data":requestBody,
        "contentType":"application/json;charset=UTF-8",
        "dataType":"json",
        "success":function (response) {
            console.log(response);
        },
        "error":function (response) {
            console.log(response);
        }
    });
});

Handler方法处理

@ResponseBody
@RequestMapping("/send/compose/object.json")
public ResultEntity<Student> testReceiveComposeObject(@RequestBody Student student, HttpServletRequest request){
    boolean judgeResult = CrowdUtil.judgeRequestType(request);
    logger.info("judgeResult="+judgeResult);
    logger.info(student.toString());
    // 将查询到的student对象封装到resultEntity返回
    ResultEntity<Student> resultEntity = ResultEntity.successWithData(student);
    String a = null;
    System.out.println(a.length());
    return resultEntity;
}

控制台打印

日志输出

[15:17:49.147] [INFO ] [http-nio-8080-exec-6] [com.yuanbaoqiang.crowd.mvc.handler.TestHandler] [Student(stuId=10, stuName=tom, address=Address(province=湖南, city=长沙, street=岳麓), subjectList=[subject(subjectName=JavaSE, subjectScore=99), subject(subjectName=SSM, subjectScore=98)], map={key1=v1, key2=v2})]

注意:如果日志乱码,在encoder 标签中增加一行 <charset>UTF-8</charset>即可。

异常映射

使用异常映射机制将整个项目的异常和错误提示进行统一管理。

基于XML的异常处理

spring-web-mvc.xml的配置

<!--    配置基于XML的异常映射-->
    <bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--        配置异常的类型和具体的视图页面的对应关系-->
        <property name="exceptionMappings">
            <props>
<!--                key属性指定异常的全类名-->
<!--                标签体中写对应的视图(这个值要拼前后缀得到具体路径)-->
                <prop key="java.lang.Exception">system-error</prop>
            </props>
        </property>
    </bean>

注意

1.exceptionMappingsSimpleMappingExceptionResolver的一个成员属性。

2.prop中的system-error会经过视图解析器处理,所以如果发生java.lang.Exception异常就会跳转到system-error.jsp页面

补充

对于简单的handler方法,完全可以用view-controller替代,直接吧请求地址和视图名称关联起来,不必配置handler方法

@RequestMapping("/admin/to/login/page.html")
public String toLoginPage(){
    return "admin-login";
}

等同于

<mvc:view-controller path="/admin/to/login/page.html" view-name="admin-login"/>

基于注解的异常处理

基于注解的方式主要涉及到两个注解

@ControllerAdvice:这个注解就是增强型控制器,作用是将对于控制器的全局配置放在同一个位置(类)。

@ExceptionHandler:将一个具体的异常类型和一个方法关联起来

创建具体的类CrowdExceptionResolver,统一管理异常。

package com.yuanbaoqiang.crowd.mvc.config;

import com.google.gson.Gson;
import com.yuanbaoqiang.crrowd.constant.CrowdConstant;
import com.yuanbaoqiang.crrowd.util.CrowdUtil;
import com.yuanbaoqiang.crrowd.util.ResultEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @description:
 * @author: YuanbaoQiang
 * @time: 2020/11/4 19:13
 */
// @ControllerAdvice 表示当前类是一个基于注解的异常处理器类
@ControllerAdvice
public class CrowdExceptionResolver {

    @ExceptionHandler(value = ArithmeticException.class)
    public ModelAndView resolveMathException(ArithmeticException exception, HttpServletRequest request, HttpServletResponse response
    ) throws IOException {
        String viewName = "system-error";
        return commonResolve(viewName,exception,request,response);
    }

    // @ExceptionHandler将一个具体的异常类型和一个方法关联起来
    @ExceptionHandler(value = NullPointerException.class)
    public ModelAndView resolveNullPonintException(NullPointerException exception, HttpServletRequest request, HttpServletResponse response) throws IOException {
        String viewName = "system-error";
        return commonResolve(viewName,exception,request,response);
    }

    /*
     * @description: 一个通用的异常处理方法
     * @param viewName
     * @param exception
     * @param request
     * @param response
     * @return: org.springframework.web.servlet.ModelAndView
     * @author: YuanbaoQiang
     * @time: 2020/11/4 19:55
     */
    private ModelAndView commonResolve(
            String viewName, // 异常处理完成后跳转的页面
            Exception exception,  // 实际捕获到的异常类型
            HttpServletRequest request,  // 请求
            HttpServletResponse response // 响应
    ) throws IOException {

        // 1. 判断当前请求的类型
        boolean judgrResult = CrowdUtil.judgeRequestType(request);
        // 2. 如果时ajax请求
        if(judgrResult){
            // 3. 创建一个resultEntity
            ResultEntity<Object> resultEntity = ResultEntity.failed(exception.getMessage());
            // 4. 创建Gson对象
            Gson gson = new Gson();
            // 5. 将ResultEntity对象转换为JSON字符串
            String json = gson.toJson(resultEntity);
            // 6. 将json对象作为响应体返回给浏览器
            response.getWriter().write(json);
            // 7. 由于上面已经通过原生的response对象返回了响应,所以不提供ModelAndView对象
            return null;
        }
        // 8. 如果不是ajax请求,则创建ModelAndView对象
        ModelAndView modelAndView = new ModelAndView();
        // 9. 将Exception对象存入模型
        modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION,exception);
        // 10. 设置对应的视图名称
        modelAndView.setViewName(viewName);
        // 11. 返回ModelAndView对象
        return modelAndView;
    }
}

工具类的创建

CrowdConstant:用于统一管理常量,防止再开发过程中因为书写错误而导致的报错!

package com.yuanbaoqiang.crrowd.constant;

/**
 * @description: 统一管理常量
 * @author: YuanbaoQiang
 * @time: 2020/11/4 20:03
 */
public class CrowdConstant {

    public static final String MESSAGE_LOGIN_FAILED = "抱歉!账号密码错误!请重新输入";
    public static final String MESSAGE_LOGIN_ACCT_ALREADY_IN_USE = "抱歉!这个账号已经被使用了!";
    public static final String MESSAGE_ACCESS_FORBIDEN = "请登录以后再访问!";
    public static final String ATTR_NAME_EXCEPTION = "exception";
}

CrowdUtil:判断当前的请求是否为Ajax请求(可以在浏览器的请求头查看是否有以下参数!)

package com.yuanbaoqiang.crrowd.util;

import javax.servlet.http.HttpServletRequest;

/**
 * @description:
 * @author: YuanbaoQiang
 * @time: 2020/11/4 18:53
 */
public class CrowdUtil {
    /*
     * @description: 判断当前的请求是否为Ajax请求
     * @param request
     * @return: boolean
     * @author: YuanbaoQiang
     * @time: 2020/11/4 19:11
     */
    public static boolean judgeRequestType(HttpServletRequest request){
        // 1. 获取请求消息头
        String acceptHeader = request.getHeader("Accept");
        String xRequestHeader = request.getHeader("X-Requested-With");

        // 2. 判断当前请求是否为ajax请求
        return (acceptHeader != null && acceptHeader.contains("application/json"))||
                (xRequestHeader != null && xRequestHeader.equals("XMLHttpRequest"));
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
目录: 1.无法添加依赖 2.执行逆向生成操作的 Maven 命令 命令:mybatis-generator:generate。 报错执行不了 3. The import org.springframework.test cannot be resolved 无法导包 4. 运行Junit测试报错java.io.FileNotFoundException: class path resource [mybatis-config.xml] cannot be opened because it:java.io.FileNotFoundException: class path resource [mybatis-config.xml] cannot be opened because it 5.B站看视频如果声音嘈杂,不清楚,小。右键,点击清澈人声。有时候弹幕真牛逼。 6. 看视频第30集,日志系统操作,测试日志时候添加类报错:LoggerFactory cannot be resolved 7,查错需要看控制台的Caused by:后边的内容。 8,测试testTx()报错3,是因为,缺少1这句话。 9. Eclipse如何还原和重置窗口布局复位是reset 10.idea缺少maven导航条 11.idea运行项目,报错404,基本都是Tomcat配置那里两个路劲配置不一致导致的。 12.问题未解决!!!45集测试ssm环境整合,跑不起来 报错: 13 将项目转移到idea中运行,并且进行一些配置修改,将以上12问题解决! 14.更改配置文件,或者有其他更改,最好要在build那里rebuild一下,要不然可能会出一些莫名其妙的错误,这是在用renrenfast框架时候,增加学生,教师等模块,界面一致装,不能正常显示,梦圆教我的。Rebuild后,再重启,即可解决问题。 15.idea加载一个新项目,第一需要调出右侧maven导航条,更新下maven,第二需要在artifact那边的lib里增加maven依赖。这样才能保证依赖和包齐全,项目才能正常运行。这是狂神教的 16.eclipse里边的project相当于idea里边的module。 17. idea 光标变粗如何恢复 18.出现问题:视频63集,无法做出和他一样的页面,HTML变红报错,网页没有按钮 19. 69集管理员登录测试,报400错误 20 问题19的启发,看视频遇到问题的话,那就载看一遍,很有可能是哪里敲错了,导致了问题的出现,好好再检查一遍流程,很多问题基本能够解决。 21 IDEa中Ctrl+f 是在当前这个页面搜索任何想找的代码 22. 70集管理员登录,重定向,报错404 23.最开始这边的弹框弹不出来 24.视频82集,页面显示主体数据,运行项目后,等录出错,出现空白页,控制台也有报错 25.点击用户维护,不想老师那样,出现tom相关信息,button按钮也有问题 26.第87集分页导航条查询有问题 27,95集新增功能,点击页面的新增报404错误 28.视频132,单条删除,无法删除,查看前端代码有报错 29.报500错误,说utf-8啥的, 30.给管理员添角色,左侧未添加列表为空,然而,视频中的却不为空 31. 177集admin分配role,点击向右添加,保存后报错: 32.jsp文件明明定义了某个函数,但是页面显示不出来,查看console,报错说没有这个函数,这是因为浏览器有缓存的原因,按ctrl+f5强制刷新,然以后在重启服务器即可解决问题。 33.感觉debug自己还不会,这是一项必备的技能,后边有必要在B站上搜索下debug教程看看。 34.在pom中加入依赖,在web.xml中增加配置后,需要在右侧maven导航条刷新,在上方artifact那边添加library,类里边如果导包不成功,那么重启idea就好了 35. p247运行项目直接报错: 36.老师讲要会看异常,后台框架里的异常,一般是后一个异常导致了前一个异常,所以看异常要最先看最后一个causeby:往往最后这个能解决99%问题。还有1%是xml文件写错了。 37. 252集测试2,我的roleOperator无法显示内容 38. 285集yml文件读取,测试test遇到找不到类异常 以下为解决办法: 39 288集spring整合mybaitis报错 40.项目看到290集,需要用到Redis,所以暂停项目学习,转入Redis学习。 41.Idea如何同时运行多个项目:点击edit configuration,然后如下图,报错即可,只要端口号不重复,就可以运行多个项目。 42. 重要错误parent的本号对不上报错:Cann

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuanbaoQiang

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值