SpringMVC其他技术

接受异步请求参数

@Controller("userController")
public class UserController {

    @RequestMapping("/testAjax")
    //@RequestBody 请求正文的信息会赋值给 name
    public String testAjax(@RequestBody String name) {
        System.out.println("testAjax 运行了");
        System.out.println(name);
        return "page";
    }

    @RequestMapping("/testAjax02")
    //@RequestBody 将请求中的数据封装到User对象中去
    public String testAjax02(@RequestBody User user) {
        System.out.println("testAjax02 运行了");
        System.out.println(user);
        return "page";
    }

    @RequestMapping("/testAjax03") 
    //@RequestBody JSON字符串用 @RequestBody
    public String testAjax03(@RequestBody List<User> list) {
        System.out.println("testAjax03 运行了");
        System.out.println(list);
        return "page";
    }
}

@RequestBody 形参注解。

将异步提交数据组织成标准请求参数格式,并赋值给形参。

注意:

1、@RequestBody 注解使用时,要求前台的请求必须是POST请求。

2、异步请求所发送的数据必须是 json 字符串,才能使用 @RequestBody 注解解析。

异步请求接收响应数据
@Controller("userController")
public class UserController {

	@RequestMapping("/testAjax04")
    @ResponseBody
    public String testAjax04() {
        System.out.println("testAjax04 运行了");
        return "page";
    }

    @RequestMapping("/testAjax05")
    @ResponseBody
    public User testAjax05() {
        System.out.println("testAjax05 运行了");
        User user = new User();
        user.setName("王五");
        user.setAge(22);
        user.setSex("男");
        return user;
    }

    @RequestMapping("/testAjax06")
    @ResponseBody
    public List testAjax06() {
        System.out.println("testAjax06 运行了");
        User user1 = new User("老狗", 17, "男");
        User user2 = new User("安然", 17, "女");
        ArrayList<User> list = new ArrayList<>();
        list.add(user1);
        list.add(user2);
        return list;
    }
}

SpringMVC的拦截器

概述

拦截器是一种动态拦截方法调用的机制。

作用:

  • 在指定的方法调用前后执行预先设定好的代码。
  • 阻止原始方法的执行。

原理:AOP思想。

拦截器VS过滤器
  • 归属不同: Filter属于Servlet技术,Interceptor属于SpringMVC技术。
  • 拦截内容不同: Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强 。
拦截器使用
配置拦截器

在SpringMVC配置文件中添加以下配置

<!--配置拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--拦截的路径-->
        <mvc:mapping path="/handleRun"/>
        <!--指定具体的拦截器类-->
        <bean class="com.itheima.interceptor.MyInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

定义要拦截的方法路径

@Controller
public class InterceptorController {

    @RequestMapping("/handleRun")
    public String handleRun(){
        System.out.println("业务处理器运行...");
        return "page";
    }
}

定义一个拦截器类

/**
 * 定义拦截器类
 */
public class MyInterceptor implements HandlerInterceptor {

    /**
     * 前置
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("前置运行");
        //返回 true 表示放行,返回 false 表示不放行
        return true;
    }

    /**
     * 后置
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("后置运行");
    }

    /**
     * 最终
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("最终完成运行");
    }
}
SpringMVC异常处理机制
异常处理两种方式
  • 简单异常处理器SimpleMappingExceptionResolver
  • 自定义自己的异常处理器,实现HandlerExceptionResolver接口
<!--配置简单映射异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <!--默认错误视图-->
    <property name="defaultErrorView" value="forward:/error/errorMsg.jsp"/>       
    <property name="exceptionMappings">
        <map>
            <!--除零异常视图-->
            <entry key="ArithmeticException" value="forward:/error/arithmetic.jsp"/>  
            <!--类型转换异常视图-->
            <entry key="ClassCastException" value="forward:/error/classCast.jsp"/>       
        </map>
    </property>
</bean>
  • 自定义异常处理器
  • 定义一个类,实现HandlerExceptionResolver接口,重写方法
public class MyExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView modelAndView = new ModelAndView();
        //判断出现的异常是什么异常
        if (ex instanceof ArithmeticException){
            //如果是除零异常
            //跳转到"forward:/error/arithmetic.jsp"
            modelAndView.setViewName("forward:/error/arithmetic.jsp");
        }else if (ex instanceof ClassCastException){
            //如果类型转换异常
            //跳转到"forward:/error/classCast.jspp"
            modelAndView.setViewName("forward:/error/classCast.jsp");
        }else{
            //其他异常
            //就跳转到exceptionPage页面
            modelAndView.setViewName("forward:/error/exceptionPage.jsp");
        }

        return modelAndView;
    }
}
<bean id="exceptionResolver" class="com.itheima.exception.MyExceptionResolver"/>
注解开发异常处理器

定义一个异常处理器类

@Component
@ControllerAdvice	//设置当前类为异常处理器类
public class ExceptionAdvice {
}  

定义异常处理方案(方法)

@Component
@ControllerAdvice	//设置当前类为异常处理器类
public class ExceptionAdvice {
    
    //当发生NullPointerException异常时,执行这里,该方法的书写和运行规则类似于Controller
    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public String doNullPointerException(Exception ex){
        return "NullPointerException";
    }  
    
    //当发生ArithmeticException异常时,执行这里
    @ExceptionHandler(ArithmeticException.class)
    public String doArithmeticException(Exception ex, Model m){
        m.addAttribute("msg",m.getMessage());
        return "error.jsp";
    }  
    
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public String doOtherException(Exception ex){
        return "Exception";
    }    
}  
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页