完整的项目案例: springmvc.zip

目录

实例

除了依赖spring-webmvc还需要依赖jackson-databind(用于转换json数据格式)

  1. <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.6</version>
    </dependency>
  2.  
  3. 项目结构:

配置web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6.  
  7. <!-- 请求总控器 -->
  8. <servlet>
  9. <servlet-name>dispatcher</servlet-name>
  10. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  11. <init-param>
  12. <param-name>contextConfigLocation</param-name>
  13. <param-value>classpath:dispatcher-servlet.xml</param-value>
  14. </init-param>
  15. </servlet>
  16. <servlet-mapping>
  17. <servlet-name>dispatcher</servlet-name>
  18. <url-pattern>/</url-pattern>
  19. </servlet-mapping>
  20.  
  21. </web-app>

配置dispatcher-servlet.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  6.  
  7. <context:component-scan base-package="edu.nf.ch09"/>
  8.  
  9. <mvc:annotation-driven/>
  10.  
  11. <mvc:default-servlet-handler/>
  12.  
  13. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  14. <property name="prefix" value="/WEB-INF/jsp/"/>
  15. <property name="suffix" value=".jsp"/>
  16. </bean>
  17.  
  18. </beans>

Controller (UserController)

  1. package edu.nf.ch09.controller;
  2.  
  3. import edu.nf.ch09.controller.vo.ResponseVO;
  4. import edu.nf.ch09.entity.Users;
  5. import edu.nf.ch09.service.UserService;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Controller;
  8. import org.springframework.web.bind.annotation.PostMapping;
  9. import org.springframework.web.bind.annotation.ResponseBody;
  10.  
  11. import javax.servlet.http.HttpSession;
  12.  
  13. /**
  14. * @author wangl
  15. * @date 2018/11/5
  16. */
  17. @Controller
  18. public class UserController {
  19.  
  20. @Autowired
  21. private UserService userService;
  22.  
  23. /**
  24. * 局部异常处理方法
  25. *
  26. * @ExceptionHandler标注的方法用于专门处理请求方法抛出的异常
  27. * value属性指定异常的Class对象(是一个数组,可以指定多个class),
  28. * 表示捕获什么样的异常对象,最后在标注的方法中传入一个异常参数,就可以得到相应的异常对象
  29. * 注意:@ExceptionHandler标注的方法只在当前的Controller类中有效,
  30. * 在其他类中必须重新编写相关的Handler异常处理方法,
  31. * 如果希望让所有的Controller都共享一个Handler异常处理,那么可以配置为全局异常处理
  32. *
  33. * @return
  34. */
  35. /*@ExceptionHandler(UserException.class)
  36. public ResponseVO handlerException(RuntimeException e){
  37. ResponseVO vo = new ResponseVO();
  38. vo.setCode(401);
  39. vo.setMessage(e.getMessage());
  40. return vo;
  41. }*/
  42.  
  43. /**
  44. * 用户登陆
  45. * @param user
  46. * @param session
  47. * @return
  48. */
  49. @PostMapping("/userLogin")
  50. @ResponseBody
  51. public ResponseVO login(Users user, HttpSession session){
  52. ResponseVO vo = new ResponseVO();
  53. //如果login方法引发了异常,则会执行上面的handlerLoginException异常处理方法
  54. user = userService.login(user);
  55. session.setAttribute("user", user);
  56. vo.setValue("index.html");
  57. return vo;
  58. }
  59.  
  60. @PostMapping("/addUser")
  61. @ResponseBody
  62. public ResponseVO addUser(Users user){
  63. userService.addUser(user);
  64. return new ResponseVO();
  65. }
  66. }

ExceptionAdvice(全局的异常处理类)

  1. package edu.nf.ch09.controller.advice;
  2.  
  3. import edu.nf.ch09.controller.vo.ResponseVO;
  4. import edu.nf.ch09.service.exception.DataAccessException;
  5. import edu.nf.ch09.service.exception.UserException;
  6. import org.springframework.web.bind.annotation.ControllerAdvice;
  7. import org.springframework.web.bind.annotation.ExceptionHandler;
  8. import org.springframework.web.bind.annotation.ResponseBody;
  9.  
  10. /**
  11. * @author wangl
  12. * @date 2018/11/5
  13. * 定义一个全局的异常处理类(类似一个切面)
  14. * 这个类中定义的所有方法都是异常处理方法,
  15. * 也可以理解为是全局的异常通知
  16. * value属性指定对哪些控制器进行切入拦截
  17. */
  18. @ControllerAdvice("edu.nf.ch09.controller")
  19. public class ExceptionAdvice {
  20.  
  21. /**
  22. * 全局异常处理方法
  23. * 用于处理用户登陆异常
  24. * @param e
  25. * @return
  26. */
  27. @ExceptionHandler(UserException.class)
  28. @ResponseBody
  29. public ResponseVO handlerLoginException(RuntimeException e){
  30. ResponseVO vo = new ResponseVO();
  31. vo.setCode(401);
  32. vo.setMessage(e.getMessage());
  33. return vo;
  34. }
  35.  
  36. /**
  37. * 全局异常处理方法
  38. * 用于处理crud操作
  39. * @param e
  40. * @return
  41. */
  42. @ExceptionHandler(DataAccessException.class)
  43. @ResponseBody
  44. public ResponseVO handlerDataAccessException(RuntimeException e){
  45. ResponseVO vo = new ResponseVO();
  46. vo.setCode(500);
  47. vo.setMessage(e.getMessage());
  48. return vo;
  49. }
  50. }

持久层引发的异常

  1. package edu.nf.ch09.dao.impl;
  2.  
  3. import edu.nf.ch09.dao.UserDao;
  4. import edu.nf.ch09.entity.Users;
  5. import edu.nf.ch09.service.exception.DataAccessException;
  6. import org.springframework.stereotype.Repository;
  7.  
  8. /**
  9. * @author wangl
  10. * @date 2018/11/5
  11. */
  12. @Repository
  13. public class UserDaoImpl implements UserDao {
  14.  
  15. @Override
  16. public Users getUserByName(String userName) {
  17. Users user = null;
  18. if("user1".equals(userName)){
  19. user = new Users();
  20. user.setUserName("user1");
  21. user.setPassword("123456");
  22. }
  23. return user;
  24. }
  25.  
  26. @Override
  27. public void saveUser(Users user) {
  28. System.out.println("insert into user_info values ...");
  29. throw new DataAccessException("添加失败");
  30. }
  31. }

业务逻辑层引发的异常

  1. package edu.nf.ch09.service.impl;
  2.  
  3. import edu.nf.ch09.dao.UserDao;
  4. import edu.nf.ch09.entity.Users;
  5. import edu.nf.ch09.service.UserService;
  6. import edu.nf.ch09.service.exception.UserException;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Service;
  9.  
  10. /**
  11. * @author wangl
  12. * @date 2018/11/5
  13. */
  14. @Service
  15. public class UserServiceImpl implements UserService {
  16.  
  17. @Autowired
  18. private UserDao userDao;
  19.  
  20. @Override
  21. public Users login(Users user) {
  22. Users newUser = userDao.getUserByName(user.getUserName());
  23. if(newUser == null){
  24. throw new UserException("用户不存在");
  25. }
  26. if(!user.getPassword().equals(newUser.getPassword())){
  27. throw new UserException("密码错误");
  28. }
  29. return newUser;
  30. }
  31.  
  32. @Override
  33. public void addUser(Users user) {
  34. userDao.saveUser(user);
  35. }
  36. }

页面收到异常消息

Spring MVC 异常处理 (九)的更多相关文章

  1. Spring MVC异常处理SimpleMappingExceptionResolver

    Spring MVC异常处理SimpleMappingExceptionResolver[转] (2012-12-07 13:45:33) 转载▼ 标签: 杂谈 分类: 技术分享 Spring3.0中 ...

  2. Spring MVC异常处理代码完整实例

    Spring MVC异常处理流程: 提供构造方法传值: 配置异常处理器的bean

  3. Spring MVC异常处理详解

    Spring MVC中异常处理的类体系结构 下图中,我画出了Spring MVC中,跟异常处理相关的主要类和接口. 在Spring MVC中,所有用于处理在请求映射和请求处理过程中抛出的异常的类,都要 ...

  4. Spring MVC异常处理

    Spring Mvc 中异常处理,一般有两种解决办法: 一.利用org.springframework.web.servlet.handler.SimpleMappingExceptionResolv ...

  5. Spring MVC异常处理详解(转)

    下图中,我画出了Spring MVC中,跟异常处理相关的主要类和接口. 在Spring MVC中,所有用于处理在请求映射和请求处理过程中抛出的异常的类,都要实现HandlerExceptionReso ...

  6. Spring系列(七) Spring MVC 异常处理

    Servlet传统异常处理 Servlet规范规定了当web应用发生异常时必须能够指明, 并确定了该如何处理, 规定了错误信息应该包含的内容和展示页面的方式.(详细可以参考servlet规范文档) 处 ...

  7. Spring MVC异常处理详解 ExceptionHandler good

    @ControllerAdvice(basePackageClasses = AcmeController.class) public class AcmeControllerAdvice exten ...

  8. Spring MVC异常处理实例

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/mvc-framework/spring-exception-handling-example.ht ...

  9. Spring MVC异常处理 和 重定向传递数据

    1.异常处理介绍 Spring在web项目中,如果在请求处理时出现异常,那输出会是Servlet响应.这时异常需要以某种方式转换为响应. Spring将异常转换为响应的方式: a.特定的Spring异 ...

随机推荐

  1. Struts2体系介绍

    回顾Struts2,在会用基础上重看的理解. Struts 2框架架构流程 一个请求在Struts 2框架中的处理大概分为以下几个步骤. (1) 客户端提交一个HttpServletRequest请求 ...

  2. Hadoop学习笔记(二):简单操作

    1. 启动namenode和datanode,在master上输入命令hdsf dfsadmin -report查看整个集群的运行情况(记得关闭防火墙) 2. 输入命令查看hadoop监听的端口,ne ...

  3. 五分钟轻松了解Hbase面向列的存储

    说明:从严格的列式存储的定义来看,Hbase并不属于列式存储,有人称它为面向列的存储,请各位看官注意这一点. 行式存储 传统的数据库是关系型的,且是按行来存储的.如下图: 其中只有张三把一行数据填满了 ...

  4. Android AIDL 实例

    为使应用程序之间能够彼此通信,Android提供了IPC (Inter Process Communication,进程间通信)的一种独特实现: AIDL (Android Interface Def ...

  5. 【Go】优雅的读取http请求或响应的数据-续

    原文链接:https://blog.thinkeridea.com/201902/go/you_ya_de_du_qu_http_qing_qiu_huo_xiang_ying_de_shu_ju_2 ...

  6. 使用MySQL组复制的限制和局限性

    本节列出和解释了组复制相关的要求和限制. 1.组复制的要求 要使用组复制,每个MySQL节点必须满足以下条件: 1.1 基本要求 InnoDB存储引擎:数据必须存储在事务型的InnoDB存储引擎中.事 ...

  7. YARN集群的mapreduce测试(五)

    将user表计算后的结果分区存储 测试准备: 首先同步时间,然后master先开启hdfs集群,再开启yarn集群:用jps查看: master上: 先有NameNode.SecondaryNameN ...

  8. [JavaScript] promise概述

    promise promise 是 es6 提出的一个异步解决方案,比传统回调事件的写法更加合理更加强大,主要还是优雅 promise 有 pending(等待中),fulfilled(已成功),re ...

  9. SQL语句害死人

    最近在弄Android的SQLite,觉得其语法是在难搞~ 在这里把一些正确规范的实例贴出来,供参考 ';

  10. .net敏捷开发框架 力软敏捷开发(learun) 让开发变的更简单

    版本:6.1.6.2 体验地址:www.fishcmonkey.com 联系QQ:6539471