完整的项目案例: springmvc.zip

目录

实例

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

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

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"> <!-- 请求总控器 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcher-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> </web-app>

配置dispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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"> <context:component-scan base-package="edu.nf.ch09"/> <mvc:annotation-driven/> <mvc:default-servlet-handler/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean> </beans>

Controller (UserController)

package edu.nf.ch09.controller;

import edu.nf.ch09.controller.vo.ResponseVO;
import edu.nf.ch09.entity.Users;
import edu.nf.ch09.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpSession; /**
* @author wangl
* @date 2018/11/5
*/
@Controller
public class UserController { @Autowired
private UserService userService; /**
* 局部异常处理方法
*
* @ExceptionHandler标注的方法用于专门处理请求方法抛出的异常
* value属性指定异常的Class对象(是一个数组,可以指定多个class),
* 表示捕获什么样的异常对象,最后在标注的方法中传入一个异常参数,就可以得到相应的异常对象
* 注意:@ExceptionHandler标注的方法只在当前的Controller类中有效,
* 在其他类中必须重新编写相关的Handler异常处理方法,
* 如果希望让所有的Controller都共享一个Handler异常处理,那么可以配置为全局异常处理
*
* @return
*/
/*@ExceptionHandler(UserException.class)
public ResponseVO handlerException(RuntimeException e){
ResponseVO vo = new ResponseVO();
vo.setCode(401);
vo.setMessage(e.getMessage());
return vo;
}*/ /**
* 用户登陆
* @param user
* @param session
* @return
*/
@PostMapping("/userLogin")
@ResponseBody
public ResponseVO login(Users user, HttpSession session){
ResponseVO vo = new ResponseVO();
//如果login方法引发了异常,则会执行上面的handlerLoginException异常处理方法
user = userService.login(user);
session.setAttribute("user", user);
vo.setValue("index.html");
return vo;
} @PostMapping("/addUser")
@ResponseBody
public ResponseVO addUser(Users user){
userService.addUser(user);
return new ResponseVO();
}
}

ExceptionAdvice(全局的异常处理类)

package edu.nf.ch09.controller.advice;

import edu.nf.ch09.controller.vo.ResponseVO;
import edu.nf.ch09.service.exception.DataAccessException;
import edu.nf.ch09.service.exception.UserException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; /**
* @author wangl
* @date 2018/11/5
* 定义一个全局的异常处理类(类似一个切面)
* 这个类中定义的所有方法都是异常处理方法,
* 也可以理解为是全局的异常通知
* value属性指定对哪些控制器进行切入拦截
*/
@ControllerAdvice("edu.nf.ch09.controller")
public class ExceptionAdvice { /**
* 全局异常处理方法
* 用于处理用户登陆异常
* @param e
* @return
*/
@ExceptionHandler(UserException.class)
@ResponseBody
public ResponseVO handlerLoginException(RuntimeException e){
ResponseVO vo = new ResponseVO();
vo.setCode(401);
vo.setMessage(e.getMessage());
return vo;
} /**
* 全局异常处理方法
* 用于处理crud操作
* @param e
* @return
*/
@ExceptionHandler(DataAccessException.class)
@ResponseBody
public ResponseVO handlerDataAccessException(RuntimeException e){
ResponseVO vo = new ResponseVO();
vo.setCode(500);
vo.setMessage(e.getMessage());
return vo;
}
}

持久层引发的异常

package edu.nf.ch09.dao.impl;

import edu.nf.ch09.dao.UserDao;
import edu.nf.ch09.entity.Users;
import edu.nf.ch09.service.exception.DataAccessException;
import org.springframework.stereotype.Repository; /**
* @author wangl
* @date 2018/11/5
*/
@Repository
public class UserDaoImpl implements UserDao { @Override
public Users getUserByName(String userName) {
Users user = null;
if("user1".equals(userName)){
user = new Users();
user.setUserName("user1");
user.setPassword("123456");
}
return user;
} @Override
public void saveUser(Users user) {
System.out.println("insert into user_info values ...");
throw new DataAccessException("添加失败");
}
}

业务逻辑层引发的异常

package edu.nf.ch09.service.impl;

import edu.nf.ch09.dao.UserDao;
import edu.nf.ch09.entity.Users;
import edu.nf.ch09.service.UserService;
import edu.nf.ch09.service.exception.UserException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; /**
* @author wangl
* @date 2018/11/5
*/
@Service
public class UserServiceImpl implements UserService { @Autowired
private UserDao userDao; @Override
public Users login(Users user) {
Users newUser = userDao.getUserByName(user.getUserName());
if(newUser == null){
throw new UserException("用户不存在");
}
if(!user.getPassword().equals(newUser.getPassword())){
throw new UserException("密码错误");
}
return newUser;
} @Override
public void addUser(Users user) {
userDao.saveUser(user);
}
}

页面收到异常消息

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. 【干货】利用MVC5+EF6搭建博客系统(一)EF Code frist、实现泛型数据仓储以及业务逻辑

    习MVC有一段时间了,决定自己写一套Demo了,写完源码再共享. PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.框架搭建 二.创建数据库 1.创建一个空的EF code fr ...

  2. MySQL SQL语句执行顺序

    MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来 ...

  3. 项目实战1—LNMP的搭建、nginx的ssl加密、身份验证的实现

    总项目流程图,详见 http://www.cnblogs.com/along21/p/8000812.html 实战一:搭建lnmp及类小米等商业网站的实现 环境:关闭防火墙,selinux 1.安装 ...

  4. 翻译:SET子句(已提交到MariaDB官方手册)

    本文为mariadb官方手册:SET的译文. 原文:https://mariadb.com/kb/en/set/我提交到MariaDB官方手册的译文:https://mariadb.com/kb/zh ...

  5. Linux使用mailx发送邮件--技术流ken

    前言   最近想要监控系统服务运行情况并实现自动发送邮件报警,zabbix虽然也可以实现这样的功能,但是这里使用一个非常简单的办法就可以实现.需要安装mailx工具,mailx是一个小型的邮件发送程序 ...

  6. VUE组件汇总

    内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 UI组件 element ★13489 - 饿了么出品的Vue2的web UI工具套件 Vux ★8133 - 基于Vue和 ...

  7. .net里的ref、out、params参数。

    1.ref參數 class Program    {        static void Main(string[] args)        {            int a = 10;    ...

  8. C#通过虚方法实现方法重写—多态。

    class Program { //希望person存的是哪个类的对象就调用哪个类的方法 //第一步 将父类中对应方法家virtual关键字 变为虚方法(子类可重写) //子类中方法用override ...

  9. 35.QT-多线程

    程序和进程的区别 进程是动态的,程序是静态的,进程是程序运行时的实例,是占用系统运行资源的程序 进程是暂时的,程序是永久的, 进程是通过程序运行时得到的 程序是一个数据文件,进程是内存中动态的运行实体 ...

  10. MyEclipse中jsp编码设置

    window->preference->Myeclipse->files and editors->jsp,设置编码为utf-8 2.window->preference ...