在JSP中使用JavaBean时遇到的问题

Q1

The value for the XXX class attribute is invalid

解决

网上对问题出现的原因这么说:

  1. 在编译 JSP 时,指定的 Bean 类没找到
  2. Bean 虽然找到了,但是该类不是 public 的,或者找到的 class 文件是 interface 或抽象类
  3. Bean 类中没有 public 的无参数构建函数

然而!!! 即使上面三条都满足了,也还是出现了这个错误!
原来是因为我少了解了一个知识点:

JavaBean文件必须要手动编译,且编译好的.class文件要手动放在WEB-INF文件夹下的classes文件夹下面!!!(一个疑问:为什么要手动编译、手动放入指定位置呢?这多麻烦啊。。。是不是我还有什么简便的方法没有了解到???)


  • 手动操作具体讲解:
  1. 打开命令行,进入.java文件所在的文件夹下,使用javac命令进行编译
    在这里插入图片描述
  2. 编译好的.class文件与.java文件位于同一个目录下。然后就手动把这个.class文件放到WEB-INF文件夹下的classes文件夹下面。如果没有classes文件夹,就自己创建一个,注意文件名必须是classes。
    在这里插入图片描述
    如果classes文件夹下直接放的.class文件,则:
    <jsp:useBean id="user" scope="session" class="_6_6_show"/>
    如果classes文件夹下还有文件夹,然后把.class放在了这个文件夹下,则上面一行语句中的class属性的值就要把这个路径写全。比如classes文件夹下新建了beans文件夹,然后.class放在了beans文件夹下,则:
    <jsp:useBean id="user" scope="session" class="beans._6_6_show"/>

Q2

java.lang.UnsupportedClassVersionError: XXX : Unsupported major.minor version 54.0 (unable to load class XXX)

解决

网上对问题出现的原因这么说:

出现这个错误是因为编译的JDK版本,跟运行时所用的JDK版本不一致所导致的:低版本的jvm无法加载高版本的class文件造成的

于是我搜索了一下jdk版本与major.minor version版本的对应关系:
在这里插入图片描述
然后发现我的错误提示 “major.minor version 54.0”与jdk10.X对应,而我确实用的是jdk10.X啊。怎么还提示不对应呢。

然后又了解到Servlet与Tomcat有对应关系(但这个对应关系是厂家配置好了的)——不同版本的Servlet和JSP规范可使用不同版本的Apache Tomcat。规范与相应的Apache Tomcat版本之间的映射 为:
在这里插入图片描述
我的Tomcat是7.0版本,对应的Servlet是3.0版本,这个对应关系是固定的,下载的7.0版本的Tomcat就包含的是3.0版本的Servlet。

可以手动查看:进入Tomcat根目录下的lib,找到servlet-api.jar/jsp-api.jar。把这个jar包随便导入到一个java文件中的
里。然后找到META-INF\MANIFEST.MF文件,其中便包含了其版本信息:
在这里插入图片描述

我的Servlet版本信息

Manifest-Version: 1.0 Ant-Version: Apache Ant 1.8.4 Created-By:
1.6.0_39-b04 (Sun Microsystems Inc.) X-Compile-Source-JDK: 1.6 X-Compile-Target-JDK: 1.6

Name: javax/servlet/ Specification-Title: Java API for Servlets
Specification-Version: 3.0    								//表明了servlet版本
Specification-Vendor: Sun Microsystems, Inc. Implementation-Title:
javax.servlet Implementation-Version: 3.0.FR Implementation-Vendor:
Apache Software Foundation

我的Jsp版本信息

Manifest-Version: 1.0 Ant-Version: Apache Ant 1.8.4 Created-By:
1.6.0_39-b04 (Sun Microsystems Inc.) X-Compile-Source-JDK: 1.6 X-Compile-Target-JDK: 1.6

Name: javax/servlet/jsp/ Specification-Title: Java API for JavaServer
Pages Specification-Version: 2.2    						//表明了jsp版本
Specification-Vendor: Sun Microsystems, Inc. Implementation-Title:
javax.servlet.jsp Implementation-Version: 2.2.FR
Implementation-Vendor: Apache Software Foundation ```

Tomcat7.0对应6.X及更高版本的java。我的Java版本是10.X。所以也是匹配的!那怎么还出错???
在这里插入图片描述

然而。。。应该是必须Tomcat版本要比jdk高啊。网上这么说的:

  • 总结如下:
    tomcat v7.0-------support-------->Java EE 5 and 6
    tomcat v8.0-------support-------->Java EE 5,6 and 7
    tomcat v8.5-------support-------->Java EE 5,6 and 7
    tomcat v9.0-------support-------->Java EE 5,6,7 and 8
  • tomcat7只支持jdk1.7及以下,若是jdk1.8则需要用tomcat8及以上

按照上面所说进行了查看。也都正确。。。可还是出现了那个错误。

真正的改正!!!—— 可能刚开始确实版本不匹配,然后在版本不匹配的情况下编译出来的.class文件也和它们不匹配。所以一直都是错的。然后我把涉及到版本的地方全都进行了修改比如:

  • 环境变量那里配置的jdk(哎,我的电脑上下载了两个版本的jdk,都搞到环境变量上了,当时啥也不太懂。这次进行了清除,保留了需要的那个)
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述

以上都修改成1.6后,重新编译出了.class文件(我之所以都修改成1.6,是因为我的Tomcat是7.X版本,所以jdk选择1.6是匹配的)。另外,我编译的时候还特别的指出了使用的jdk的版本:
在这里插入图片描述
然后这个问题确实解决了。但是又出现了下面的这个问题。。。

Q3

java.lang.ClassNotFoundException: org.apache.jsp._6_005f06_005fshowInfo_jsp

什么玩意。。。上面全都白瞎了。只要重新建个程序写它们就好了。呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜
或许我不应该懒省事,我觉得再新建程序还要再进行一些配置太麻烦了,于是就都写在了一个项目下。哎。

发布了53 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/jy_z11121/article/details/103158937