JSP常见异常之PropertyNotFoundException

简介: JSP常见异常之PropertyNotFoundException

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表达式得到属性值。

思考:

  1. EL表达式是如何得到属性的值,是否与类中的set和get方法有关。
  2. 为什么在jsp页面的java脚本段中将类进行封装,通过EL表达式无法得到正确的结果?
  3. EL表达式中的变量是否只能获取page、request、session和application范围内定义的变量,为什么?


目录
相关文章
|
缓存 Java
严重: Servlet[jsp]的Servlet.service()抛出异常 java.lang.IllegalStateException: 当前响应已经调用了方法getOutputStream()
严重: Servlet[jsp]的Servlet.service()抛出异常 java.lang.IllegalStateException: 当前响应已经调用了方法getOutputStream()
605 0
jsp页面出现异常
这样的错误,就应该把把包含页面与被包含页面的@page指令里面的contentType写成一致,一定要一致
|
Java 应用服务中间件
JSP 加上 <%@ taglib prefix=“c“ uri=“http://java.sun.com/jsp/jstl/core“ %> 运行产生异常
笔者使用 Tomcat 10 版本,在使用 JSTL 的过程中,JSP 页面中一旦加上 <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %> 标准库标签,运行就会产生异常,应该是 jar 包的问题,可能冲突或者版本不匹配什么的,尝试了无数种方法,各种导入 jar 包终无果。
JSP 加上 <%@ taglib prefix=“c“ uri=“http://java.sun.com/jsp/jstl/core“ %> 运行产生异常
|
Java Maven Spring
spring boot jsp之Intellij异常
spring boot jsp之Intellij异常
107 0
|
Java 前端开发
JSP-使用JSTL-out、set、remove、catch捕捉异常、条件判断、流程控制、字符截取
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/75804793 使用JSTL 在MyEclipse2014中,使用JSTL只要在文件开始加上一句 prefix表示前缀,用于区分其他标签,可以自定义前缀。
925 0
|
Java Maven 应用服务中间件
【错误解决】[Maven]使用Maven配置Jstl出现异常:The absolute uri: http://java.sun.com/jsp/jstl/core cannot...
转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自【大学之旅_谙忆的博客】 也就是出现如下错误: 严重: Servlet.service() for servlet jsp threw exception org.
1833 0
|
Java
jsp出现getOutputStream() has already been called for this response异常的原因和解决方法
jsp出现getOutputStream() has already been called for this response异常的原因和解决方法 在tomcat5下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有妥善处理好的原因。具体的原因就是在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletReque
1458 0
|
1月前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
62 0