SpringMVC(四、异常处理和综合练习)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后 者主要通过规范代码开发、测试等手段减少运行时异常的发生。

1、异常处理机制


异常类有两个主要的子类:IOException 类和 RuntimeException 类。


image-20220803092501728.png



1、异常处理的思路


     系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后 者主要通过规范代码开发、测试等手段减少运行时异常的发生。


     系统的Dao、Service、Controller出现都通过throws Exception向上抛出,最后由SpringMVC前端控制器交 由异常处理器进行异常处理,如下图:


image-20220803092526310.png



2、异常处理两种方式


1、使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver


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


<!--配置异常处理器--><beanclass="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">&lt;!&ndash;<propertyname="defaultErrorView"value="error"/>&ndash;&gt;
<propertyname="exceptionMappings"><map><entrykey="java.lang.ClassCastException"value="error1"/><entrykey="com.xmp.exception.MyException"value="error2"/></map></property></bean>


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


① 创建异常处理器类实现HandlerExceptionResolver


publicclassMyExceptionResolverimplementsHandlerExceptionResolver {
@OverridepublicModelAndViewresolveException(HttpServletRequestrequest, 
HttpServletResponseresponse, Objecthandler, Exceptionex) {
//处理异常的代码实现//创建ModelAndView对象ModelAndViewmodelAndView=newModelAndView();
modelAndView.setViewName("exceptionPage");
returnmodelAndView;
    }
}


② 配置异常处理器



<bean id="exceptionResolver" class="com.xmp.exception.MyExceptionResolver"/>



③ 编写异常页面


<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>Title</title></head><body>这是一个最终异常的显示页面</body></html>



④ 测试异常跳转


@RequestMapping("/quick22")
@ResponseBodypublicvoidquickMethod22() throwsIOException, ParseException {
SimpleDateFormatsimpleDateFormat=newSimpleDateFormat("yyyy-MM-dd");
simpleDateFormat.parse("abcde");
}



2、Spring练习Demo


1、Spring练习环境搭建


① 创建工程(Project&Module)


image-20220802130124370.png



② 导入静态页面


放到文章最后,主要学习Spring,没有注重前端页面的编写。


③ 导入需要坐标

<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>xmp</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version></dependency><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.2.1</version><scope>provided</scope></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.0</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.3</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.7</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency></dependencies></project>


④ 创建包结构(controller、service、dao、domain、utils等)


image-20220802130454473.png

⑤ 导入数据库脚本


image-20220802130804871.png


⑥ 创建POJO类


packagecom.xmp.pojo;
importjava.util.List;
publicclassUser {
privateLongid;
privateStringusername;
privateStringemail;
privateStringpassword;
privateStringphoneNum;
//当前用户具备哪些角色privateList<Role>roles;
publicList<Role>getRoles() {
returnroles;
    }
publicvoidsetRoles(List<Role>roles) {
this.roles=roles;
    }
publicLonggetId() {
returnid;
    }
publicvoidsetId(Longid) {
this.id=id;
    }
publicStringgetUsername() {
returnusername;
    }
publicvoidsetUsername(Stringusername) {
this.username=username;
    }
publicStringgetEmail() {
returnemail;
    }
publicvoidsetEmail(Stringemail) {
this.email=email;
    }
publicStringgetPassword() {
returnpassword;
    }
publicvoidsetPassword(Stringpassword) {
this.password=password;
    }
publicStringgetPhoneNum() {
returnphoneNum;
    }
publicvoidsetPhoneNum(StringphoneNum) {
this.phoneNum=phoneNum;
    }
@OverridepublicStringtoString() {
return"User{"+"id="+id+", username='"+username+'\''+", email='"+email+'\''+", passwords='"+passwords+'\''+", phoneNum='"+phoneNum+'\''+'}';
    }
}
packagecom.xmp.pojo;
publicclassRole {
privateLongid;
privateStringroleName;
privateStringroleDesc;
publicLonggetId() {
returnid;
    }
publicvoidsetId(Longid) {
this.id=id;
    }
publicStringgetRoleName() {
returnroleName;
    }
publicvoidsetRoleName(StringroleName) {
this.roleName=roleName;
    }
publicStringgetRoleDesc() {
returnroleDesc;
    }
publicvoidsetRoleDesc(StringroleDesc) {
this.roleDesc=roleDesc;
    }
@OverridepublicStringtoString() {
return"Role{"+"id="+id+", roleName='"+roleName+'\''+", roleDesc='"+roleDesc+'\''+'}';
    }
}



⑦ 创建配置文件(applicationContext.xml、spring-mvc.xml、jdbc.properties、log4j.properties)


jdbc.properties


jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/testjdbc.username=rootjdbc.password=your_password


log4j.properties


###directlogmessagestostdout###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p%c{1}:%L-%m%n###directmessagestofilemyLog.log###log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=F:/myLog.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p%c{1}:%L-%m%n###setloglevels-formoreverboseloggingchange'info'to'debug'###log4j.rootLogger=info, stdout


spring-mvc.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd

     http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd

     http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd

">


   <!--1、mvc注解驱动-->

   <mvc:annotation-driven/>


   <!--2、配置视图解析器-->

   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

       <property name="prefix" value="/pages/"/>

       <property name="suffix" value=".jsp"/>

   </bean>


   <!--3、静态资源权限开放-->

   <mvc:default-servlet-handler/>


   <!--4、组件扫描  扫描Controller-->

   <context:component-scan base-package="com.xmp.controller"/>


</beans>



<?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:context="http://www.springframework.org/schema/context"

      xsi:schemaLocation="

     http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd

     http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd

">



   <!--1、加载jdbc.properties-->

   <context:property-placeholder location="classpath:jdbc.properties"/>


   <!--2、配置数据源对象-->

   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

       <property name="driverClass" value="${jdbc.driver}"/>

       <property name="jdbcUrl" value="${jdbc.url}"/>

       <property name="user" value="${jdbc.username}"/>

       <property name="password" value="${jdbc.password}"/>

   </bean>


   <!--3、配置JdbcTemplate对象-->

   <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

       <property name="dataSource" ref="dataSource"></property>

   </bean>


   <!--配置RoleService-->

   <bean id="roleService" class="com.xmp.service.impl.RoleServiceImpl">

       <property name="roleDao" ref="roleDao"/>

   </bean>


   <!--配置RoleDao-->

   <bean id="roleDao" class="com.xmp.dao.impl.RoleDaoImpl">

       <property name="jdbcTemplate" ref="jdbcTemplate"/>

   </bean>


   <!--配置UserService-->

   <bean id="userService" class="com.xmp.service.impl.UserServiceImpl">

       <property name="userDao" ref="userDao"/>

       <property name="roleDao" ref="roleDao"/>

   </bean>


   <!--配置UserDao-->

   <bean id="userDao" class="com.xmp.dao.impl.UserDaoImpl">

       <property name="jdbcTemplate" ref="jdbcTemplate"/>

   </bean>



</beans>



2、用户和角色的关系


image-20220802131348012.png


3、角色列表的展示和添加操作


  • 角色列表的展示步骤分析


① 点击角色管理菜单发送请求到服务器端(修改角色管理菜单的url地址)


② 创建RoleController和showList()方法


③ 创建RoleService和showList()方法


④ 创建RoleDao和findAll()方法


⑤ 使用JdbcTemplate完成查询操作


⑥ 将查询数据存储到Model中


⑦ 转发到role-list.jsp页面进行展示


  • 角色添加的步骤分析


① 点击列表页面新建按钮跳转到角色添加页面


② 输入角色信息,点击保存按钮,表单数据提交服务器


③ 编写RoleController的save()方法


④ 编写RoleService的save()方法


⑤ 编写RoleDao的save()方法


⑥ 使用JdbcTemplate保存Role数据到sys_role


⑦ 跳转回角色列表页面


4、用户列表的展示和添加操作


  • 用户列表的展示步骤分析


① 点击用户管理菜单发送请求到服务器端(修改用户管理菜单的url地址)


② 创建RoleController和showList()方法


③ 创建RoleService和showList()方法


④ 创建RoleDao和findAll()方法


⑤ 使用JdbcTemplate完成查询操作


⑥ 将查询数据存储到Model中


⑦ 转发到user-list.jsp页面进行展示


  • 用户列表的添加步骤分析


① 点击列表页面新建按钮跳转到角色添加页面


② 输入角色信息,点击保存按钮,表单数据提交服务器


③ 编写RoleController的save()方法


④ 编写RoleService的save()方法


⑤ 编写RoleDao的save()方法


⑥ 使用JdbcTemplate保存Role数据到sys_role


⑦ 跳转回角色列表页面


5、删除用户操作


① 点击用户列表的删除按钮,发送请求到服务器端


② 编写UserController的deleteById()方法


③ 编写UserService的deleteById()方法


④ 编写UserDao的deleteById()方法


⑤ 编写UserDao的deleteRelByUid()方法


⑥ 跳回当前用户列表页面

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
2天前
|
云安全 人工智能
2025,阿里云安全的“年度报告”
拥抱AI时代,阿里云安全为你护航~
1439 1
|
9天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1417 10
|
9天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
1333 7
|
10天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
1220 15
|
4天前
|
人工智能 前端开发 API
Google发布50页AI Agent白皮书,老金帮你提炼10个核心要点
老金分享Google最新AI Agent指南:让AI从“动嘴”到“动手”。Agent=大脑(模型)+手(工具)+协调系统,可自主完成任务。通过ReAct模式、多Agent协作与RAG等技术,实现真正自动化。入门推荐LangChain,文末附开源知识库链接。
460 118
|
2天前
|
机器学习/深度学习 测试技术 数据中心
九坤量化开源IQuest-Coder-V1,代码大模型进入“流式”训练时代
2026年首日,九坤创始团队成立的至知创新研究院开源IQuest-Coder-V1系列代码大模型,涵盖7B至40B参数,支持128K上下文与GQA架构,提供Base、Instruct、Thinking及Loop版本。采用创新Code-Flow训练范式,模拟代码演化全过程,提升复杂任务推理能力,在SWE-Bench、LiveCodeBench等基准领先。全阶段checkpoint开放,支持本地部署与微调,助力研究与应用落地。
345 1
|
7天前
|
存储 缓存 NoSQL
阿里云经济型e实例(ecs.e-c1m4.large)2核8G云服务器优惠活动价格及性能测评
阿里云经济型e实例(ecs.e-c1m4.large)2核8G配置,支持按使用流量或按固定带宽两种公网计费方式,搭配20G起ESSD Entry云盘,是主打高性价比的内存优化型入门选择。其核心特点是8G大内存适配轻量内存密集场景,计费模式灵活可控,既能满足个人开发者的复杂测试项目需求,也能支撑小微企业的基础业务运行,无需为闲置资源过度付费。以下从优惠活动价格、性能表现、适用场景及避坑要点四方面,用通俗语言详细解析。
233 153
|
4天前
|
机器学习/深度学习 人工智能 算法
炎鹊「Nexus Agent V1.0」:垂直领域AI应用的原生能力引擎
炎鹊AI「Nexus Agent V1.0」是垂直行业专属AI原生引擎,融合大模型、AIGA决策大脑、行业知识图谱与专属模型,打造“感知-决策-执行”闭环。支持21个行业低代码构建工具型、员工型、决策型AI应用,实现技术到业务价值的高效转化,推动AI从实验走向规模化落地。(239字)
254 1

热门文章

最新文章