1 问题描述
最近在进行EL表达式的学习时,发现了一个问题,那就是在一个同时有java类和EL表达式的jsp页面中,通过EL表达式无法得到类的属性值,源码如下:
在jsp页面中通过java脚本段里编写了一个Admin类,并new了一个admin对象,对admin的name属性赋值为wang,并且将admin的属性存储在admin这个session对象中,最后通过EL表达式获admin的name属性的值,执行以上程序,最后得到的结果如下:
其错误信息为:在类型上找不到属性name,为什么会出现找不到属性的问题?明明我们已经定义了变量name,是Amdin类的问题还是EL表达式书写错误,下面我们就这两点进行分析。
2 问题分析
一般来说当我们遇到一些bug时一般都会有一些固定的思路去尝试解决问题,常用的解决思路是从语法错误和逻辑错误来进行分析,因此我们从这两个方面入手,进行了以下一些猜想分析。
猜想一
因为我们在页面使用的EL表达式来获取对象的属性,所以首先想到的就是会不会是EL表达式语法的错误导致了问题的出现。 我们了解到EL表达式要访问一个对象的属性的是有两种方法,就上面要访问admin的name属性来说,第一种为${sessionScope.admin.name},另一种为${sessionScope.admin[“name”]},于是我们将获取属性值的方法替换为第二种,调试运行,发现还是出现一样的错误,因此基本上可以排除是EL表达式语法的错误导致问题的出现。
猜想二
在Admin这个类中我们发现这个类只有对应的属性值却没有其对应的set和get方法,会不会是缺少set和get方法导致的问题。我们给Admin类添加set和get方法。
添加后再进行测试,结果无效,还是会出现一样的错误。 正当一筹莫展时,发现了一个不起眼的关于EL表达式的“.”运算符的描述, 原文如下: “.”运算符一般情况下获取Map对象的一个键值或JavaBean对象的某一个属性值。 于是我猜想会不会这个Admin类会不会不是一个JavaBean对象,因此导致的错误,那么什么是JavaBean对象呢?如何去编写一个JavaBean对象,因此我们就产生了猜想三。
猜想三
由于Admin类不是一个JavaBean对象,因此导致问题出错。 Sun公司对JavaBean的定义为:JavaBean是一个能在IDE可视化编程工具中使用的可重用的软件组件。实质上JavaBean组件是用过Java代码封装的Java类,通过封装属性和方法成为具有某种功能或者处理某个业务的对象,简单来说一个javaBean就是一个封装类,了解之后,我们开始编写代码。 我们在src文件下建立一个bean包,在包下面建立Admin类:
将Admin类进行封装:
修改jsp中的代码:
调试运行:
可以得到正确的结果,问题解决,当我以为问题解决时新的问题又出现了。我们在jsp页面的java脚本里面将Admin类写成一个javabean测试:
调试运行:
虽然java脚本段里的Admin类也具有set和get方法,但依然无法得到正确的结果,其错误信息依旧为:在类型上找不到属性name。
3 总结
本文主要解决了在一个同时有java类和EL表达式的jsp页面中,通过EL表达式无法得到类的属性值的问题,其具体解决方法为:在src包下新建一个包,然后将此类进行封装,最后在jsp页面中引用此类,通过EL表达式得到属性值。
思考:
- EL表达式是如何得到属性的值,是否与类中的set和get方法有关。
- 为什么在jsp页面的java脚本段中将类进行封装,通过EL表达式无法得到正确的结果?
- EL表达式中的变量是否只能获取page、request、session和application范围内定义的变量,为什么?