使用EL表达式时,PropertyNotFoundException异常的解决过程

news2024/11/26 6:18:00

一. 业务场景

最近,杨哥的一个班级正在做基于JSP+JSTL/EL + Servlet + JavaBean +JDBC +MySQL技术方案的阶段项目。其中有一个需求是根据多条件动态搜索商品信息,最终分页显示出商品列表。这个功能可以在dao层采用多分支条件组合,显示页面使用JSTL/EL中的c:forEach标签 ,再配合EL表达式显示商品的属性信息。

结果在开发实践中,有个学生的商品列表页信息却无法显示出来,服务器控制台直接爆出了一个异常!但他又不知道这个异常该怎么解决,于是就跑来问杨哥。我们在学习的时候,有很多初学者因技术运用不熟练,都会导致一些令人头疼的问题,其实遇到了问题不要怕,我们解决掉就好啦。

那么接下来,杨哥就以此项目中的这个常见异常为例,来带着大家分析项目开发过程中出现异常之后,该如何快速地解决问题。这样以后再遇到类似的问题时,大家就知道该怎么解决了。

二. 异常信息

我们先来看看这个异常是什么。

严重: Servlet.service() for servlet jsp threw exception
javax.el.PropertyNotFoundException: Property 'gname' not readable on type com.qf.pojo.Goods
    at javax.el.BeanELResolver$BeanProperty.read(BeanELResolver.java:297)

很多同学在项目开发时,可能都遇到过此类异常。有些同学一看到密密麻麻的英文单词,几乎都不认识,脑袋嗡一下子就炸了。到底哪里出错了?出了什么错?两眼一抹黑,啥也不知道,反正就知道报错了,一下子就不知所措了。

杨哥在这里告诉大家,遇到问题千万不要紧张。如果你的单词量不行,可以使用有道翻译对照查看错误,慢慢积累单词就记住了。其实Java里的常用单词就那么几个,天天看起码知道啥意思,我们也不需要你背写单词对吧。

上面的异常,咱们根据字面意思来理解,就是在使用EL表达式时没有发现Goods类的gname属性的getter方法.......既然现在已经知道了这个错误,那就继续往下看该怎么解决吧!

三.EL表达式使用基本规则

在解决异常之前,杨哥先带领小伙伴们复习一下EL的使用规则。

  • EL表达式的作用是为了使jsp写起来更加简单,使代码简化;

  • 语法结构:${experssion};

  • EL表达式一般操作的都是域对象中的数据,但操作不了局部变量;

  • 域对象在jsp中分别是:pageContent,requset,session,application,这可比用page、requset、session、application去获取对象简单太多了;

  • 操作JavaBean对象:直接调用所定义类的方法和属性名,但要注意,必须在类中实现get方法

四. 原因排查

1.常见原因分析

我们在上面复习了EL表达式的基本使用规则之后,尤其是明白了bean对象的使用要求,你现在是否已经知道上面异常的产生原因是什么了吗?其实控制台里的信息已经把异常原因说的很清楚了:

Property 'gname' not readable on type com.qf.pojo.Goods

这里表示Goods类中的’gname‘属性不能获取。所以杨哥的第一反应就是,这个小伙伴可能忘了给‘gname’属性加getter方法了。于是杨哥直接查看了他的Goods类代码,结果发现类里面setter、getter方法都有:

另外该学员在排查异常时还做了查询结果输出,控制台显示查询的数据也完全正确,没有一点问题。于是,杨哥又在debug模式下打断点运行,也验证了数据响应并没有异常发生。

2. 真正原因所在

那么问题到底出在哪里呢

于是杨哥再次打开Goods类的源码,仔细阅读了起来。结果发现代码中的getGname方法名称颜色显示发灰。仔细一看,杨哥立刻就明白这家伙错在哪里了。原来,在写实体时,方法都是手动编写的,在写这个getGname()方法时多设置一个形参。我们知道,getter()方法是不需要带参数的!导致在运行时,系统把这个方法当成了普通方法,也就是说,实际上他并没有真正地’gname‘属性实现其对应的getter()方法。而EL表达式在显示对象属性时,其本质就是调用其getter方法

就是这样一个很小的细节,因为学生的粗心导致了上面的绑定错误!

也就是说,上面的异常其实是由一个很小的失误引发的错误!是不是太不应该出现这种错误了呢?而我们很多人在刚开始学习编程时所犯的错误,绝大多数都是因为马虎造成的!

五. 解决办法

其实解决办法很简单,只需要将多余的形参去掉就好了!

六. 总结与反思

本案例中的异常,是因粗心大意导致类的属性没有getter方法引起的错误,这不仅仅引发了PropertyNotFoundException异常,同时也暴露了很多人在学习时存在的一些缺点:

1). 对封装的理解不够深入;2). EL表达式的本质理解较浅;3). debug能力需要提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/42687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022王道OS 1.3 操作系统运行环境

2022王道OS 1.3 操作系统运行环境 文章目录2022王道OS 1.3 操作系统运行环境1.3_1 操作系统的运行机制知识总览知识点预备知识:程序是如何运行的?两种程序:内核程序 VS 应用程序两种指令:特权指令 VS 非特权指令两种状态&#xff…

二、【React脚手架】组件化编码(TodoList案例)

文章目录1、组件化编码流程(通用)2、样式覆盖问题3、DEMO3.1、需要实现的效果3.2、前期须知3.3、项目结构3.4、CODE3.4.1、App.js3.4.2、App.css3.4.3、Header3.4.4、List3.4.5、Item3.4.6、Footer1、组件化编码流程(通用) 拆分组…

Python 面向对象简介

什么是面向对象? 面向对象是一种编程思想,在开发过程中关注的不是解决问题的步骤和过程,而是参与解决问题的对象和它们具备的行为。 01 面向过程和面向对象的区别 1、面向过程 面向过程在开发过程中关注的是解决问题的步骤和过程&#xf…

《计算机体系结构量化研究方法第六版》1.6 成本趋势

1.6.1 时间、产量和大众化的影响 即便没有技术进步,计算机组件的制造成本也会随着时间的推移而降低。这背后有着学习曲线的因素。 【学习曲线(from百度)】 学习曲线的定义为"在一定时间内获得的技能或知识的速率",又称…

2022王道OS 1.4 操作系统的体系结构 chap1回顾

2022王道OS 1.4 操作系统的体系结构 & chap1回顾 操作系统的体系结构 知识总览 操作系统的内核 时钟管理:利用时钟中断实现计时功能 原语:一种特殊的程序,具有原子性(一气呵成,不可被中断) 内核是操…

人工智能开启甲骨文整理研究新范式

编者按:在甲骨学研究中,甲骨“校重”整理是一项费事费力但又极其重要的基础性研究工作。微软亚洲研究院与首都师范大学甲骨文研究中心莫伯峰教授团队合作开发的甲骨文校重助手Diviner,第一次将自监督AI模型引入到甲骨文“校重”工作中&#x…

【Mysql】数据库的基本操作和表的基本操作

本章内容是,用sql语言实现对数据库的基本操作和表的基本操作 文章目录前言1. 数据库的基本操作1.1 创建数据库1.2 查看数据库1.3 选中数据库1.4 删除数据库2. 数据库基本数据类型3. 表的基本操作3.1 创建表3.2 显示数据库中的表3.3 查看表的构造3.4 删表4. 表的增删改查4.1 增加…

使用synchronized 加锁你加对了么?

本文讲解使用synchronized只是对synchronized的使用,底层原理将在后续文章 目录 从实际中理解共享带来的问题 Java代码实现共享带来的问题进行分析 临界区(Critical Section) 与 竞态条件(Race Condition) 临界区 竞态条件 synchronized解决方案 怎么理解synchronized中…

【web前端期末大作业】基于HTML+CSS+JavaScript实现代理商销售管理系统后台(8页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

mathtype在word内的简单使用

一、简单使用 1、快捷键 快捷键说明ctrlaltQ行内公式altshiftQ右编号(行间公式)\ ;{空格、大括号都需要转义ALTF4关闭mathtype窗口 2、小技巧 \left与\right 一定要配对使用,且对于对称的符号(如(), {}等)来说&…

【Linux】---进程控制(创建、终止、等待、替换)

文章目录进程创建fork()进程退出进程退出场景进程退出方法退出码exit、_exit进程等待进程等待的方法waitwaitpid阻塞和非阻塞进程替换替换的原理替换所用到的函数execlexeclpexecle简易的shell进程创建 fork() fork函数在之前的文章中也已经提到过了。其主要作用是从已存在的…

excel提示stdole32.tlb的解决方法

大家在使用excel时有遇到stdole32.tlb错误提示吗?出现这个问题直接导致excel无法启动,非常影响用户的工作效率。为了顺利解决问题,小编给大家带来了详细的解决办法,希望可以帮到你。 win7系统打开excel提示stdole32.tlb的解决方法…

Nosql inject注入

0x00 Nosql inject 最近主要在看那个 YApi 的注入漏洞,也是一个 mongodb的注入 所以来写一下这个东西,其实现在越来越常见的Nosql注入 感觉很多分布式和一些新的系统已经大量使用这种nosql数据库,这个注入和传统的关系型数据库有一点点不同…

【Hack The Box】linux练习-- Meta

HTB 学习笔记 【Hack The Box】linux练习-- Meta 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月27日🌴 &#x1f36d…

[附源码]计算机毕业设计springboot“科教兴国”支教门户网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

复旦MBA项目GNW海外课程|连线全球顶尖商学院,跨时空学习精彩无限!

10月下旬,复旦MBA为期一周的GNW海外课程落下帷幕,复旦在职MBA的同学们通过云端连线,走进全球多所顶级商学院,与深谙商道、学术造诣深厚的教授学者,以及来自不同地域不同文化背景的精英学生取经论道。      复旦MBA…

深入理解死锁问题

死锁问题🏞️1. 死锁概念🌁2. 为什么发生死锁🌠3. 产生死锁的条件🌁4. 如何避免死锁📖4.1 循环等待📖4.2 持有并等待📖4.3 非抢占📖4.4 互斥🌿5. 通过调度避免死锁&#…

【Python开发】一文详解Flask-Login

一文详解Flask-LoginFlask-Login 为 Flask 提供用户会话管理。它处理登录、注销和长时间记住用户会话等常见任务。 Flask-Login 不绑定到任何特定的数据库系统或权限模型。唯一的要求是您的 用户对象实现一些方法,并且您向能够 从用户 ID 加载用户 的扩展提供回调。…

Kotlin 开发Android app(十二):Android布局FrameLayout和ViewPager2控件实现滚动广告栏

在上一节中我们简单的介绍了RecyclerView 的使用,他是整个开发的重点控件,这一节我们来看看FrameLayout 布局结合ViewPager2,开发一个广告控件。 新模块banner 先创建一个新的模块,取名为banner,用来创建我们的滚动广…

Spring Boot自定义Namespace

Spring Boot 自定义Namespace 在学些Spring Boot 自定义Namespace之前,先来看一个简单的案例。在Spring Boot出现之前,所有的bean都是在XML文件的格式 中定义。为了管理方便,一些大型复杂的应用系统,通常定个多个xml文件来共同满…