栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【SpringMVC】03:异常处理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【SpringMVC】03:异常处理

第三章:SpringMVC拦截器

OVERVIEW
  • 第三章:SpringMVC拦截器
      • 一、SpringMVC拦截器
        • 1.自定义拦截器:
        • 2.拦截器实现登录
          • (1)用户在没有登录的情况下:
          • (2)用户登录进行登录操作:
      • 二、SpringMVC异常处理
        • 1.异常处理的思路:
        • 2.异常处理的方式:
          • (1)SimpleMappingExceptionResolver
          • (2)HandlerExceptionResolver接口实现

一、SpringMVC拦截器

SpringMVC中的拦截器类似于Srevlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。

将拦截器按照一定的顺序连接成一条链,称为拦截器链(Interceptor Chain),拦截器也是AOP思想的具体实现。

1.自定义拦截器:
  1. 创建拦截器类实现HandlerInterceptor接口
  2. 在spring-mvc.xml中配置拦截器
  3. 拦截效果测试

package com.itcast.interceptor;

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

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

public class MyInterceptor1 implements HandlerInterceptor {
    //1.在目标方法执行之前执行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandler......");
        String param = request.getParameter("param");
        if ("param".equals("yes")) {
            return true;
        } else {
            request.getRequestDispatcher("/jsp/error.jsp").forward(request, response);
            return false;
        }
    }

    //2.在目标方法执行只有、视图对象返回之前执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle......");
    }

    //3.在整个流程都执行完毕之后 执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion......");
    }
}


    
    
    
        contextConfigLocation
        classpath:applicationContext.xml
    
    
    
        org.springframework.web.context.ContextLoaderListener
    
    
    
    
        DispatcherServlet
        org.springframework.web.servlet.DispatcherServlet
        
        
            contextConfigLocation
            classpath:spring-mvc.xml
        
    
    
        DispatcherServlet
        /
    



    
    
    
    
        
        
    
    
    
    
    

    
    
        
            
            
            
        
    

2.拦截器实现登录 (1)用户在没有登录的情况下:

用户在没有登录的情况下不能对后台菜单进行访问操作,如果访问任何页面则将强制跳转到登录页面。

package com.itcast.interceptor;

import com.itcast.domain.User;
import org.springframework.web.servlet.HandlerInterceptor;

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

public class PrivilegeInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判断用户是否登录 session中有没有user信息
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("user");
        if (user == null) {
            response.sendRedirect(request.getContextPath() + "/login.jsp");
            return false;
        }
        return true;//放行访问目标资源
    }
}


    
    
    
    
        
        
    
    
    
    
    
    
    
        
            
            
            
            
            
        
    

(2)用户登录进行登录操作:

只有用户登录成功后才能对后台功能进行操作:


@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public String login(String username, String password, HttpSession session) {
        User user = userService.login(username, password);
        if (user != null) {
            //登录成功将user存储到session中
            session.setAttribute("user", user);
            return "redirect:/index.jsp";
        }
        return "redirect:/login.jsp";
    }
}
public class UserServiceImpl implements UserService {
    //userDao依赖注入
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public User login(String username, String password) {
        User user = userDao.findByUsernameAndPassword(username, password);
        return user;
    }
}
public class UserDaoImpl implements UserDao {
    //注入jdbc模板
    private JdbcTemplate jdbcTemplate;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public User findByUsernameAndPassword(String username, String password) {
        User user = jdbcTemplate.queryForObject("select * from sys_user where username = ? and password = ?", new BeanPropertyRowMapper(User.class), username, password);
        return user;
    }
}

二、SpringMVC异常处理 1.异常处理的思路:

系统中异常包括两类:预期异常和运行时异常RuntimeException,

前者通过捕获异常从而获取异常信息,后者通过规范代码开发、测试等手段减少运行时异常的发生。

系统的Dao、Service、Controller层出现都通过throwsException向上抛出异常,最后通过SpringMVC前端控制器交给异常处理器处理:

2.异常处理的方式: (1)SimpleMappingExceptionResolver

使用SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver进行异常处理,

SpringMVC已经定义了该类型转换器,在使用时可以根据项目情况进行相应异常与视图的映射配置:

(2)HandlerExceptionResolver接口实现

实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器,

  1. 创建异常处理器类实现HandlerExceptionResolver
  2. 配置异常处理器
  3. 编写异常页面
  4. 测试
public class MyExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();
        if (e instanceof MyException) {
             modelAndView.addObject("infor", "自定义异常");
        } else if (e instanceof ClassCastException) {
            modelAndView.addObject("infor", "类型转换异常");
        }
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/891614.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号