The value for the useBean class attribute com.wrox.errors.User is invalid
编译Beginning JSP WEB Development 里面的源代码出现这个问题,按英文意思,看了半天没找到什么问题,百度了下,把结果汇总下,好让自己分析
搜集完,发现刷新下又没问题了,真够奇怪的....
关于Tomcat: The value for the useBean class attribute is invalid 错误提示的解决方案
文件夹结构(Note下有两个子文件夹):
E:/javaStudy/Note/Note_DAO
E:/javaStudy/Note/Note_jdbc
而在Tomcat的service.xml中虚拟目标设置情况:
path="/note"
docBase="e:/javastudy/note"
我在Note_DAO建立了一个项目,文件夹下有几个*.java的类文件(类文件包名称都以mingal.为前缀),还有jsp页面文件。
在cmd下,进入E:/javaStudy/Note/Note_DAO下使用javac -d . *.java进行编译,编译成功,并且在E:/javaStudy/Note/Note_DAO中生成了类文件夹(mingal)
在IE中运行时,老是提示“The value for the useBean class attribute is invalid”的错误提示。后来,也将在E:/javaStudy/Note/Note_DAO下建立了WEB-INF/classes文件夹,同时将编译后生成的mingal文件夹移进去。IE执行,还是提示相同错误。
后来看了一下http://blog.csdn.net/3cts/archive/2006/05/31/764770.aspx的文章,文章没有看懂。
最后,我把E:/javaStudy/Note/Note_DAO下的WEB-INF文件夹拷贝到service.xml中指定的:docBase="e:/javastudy/note"目录中,运行成功!
个人想法,可能Tomcat只认或者只找虚拟目录下WEB-INF中的类。
-------------------------------------------------------------------------------------------------
从这排查: 1.你使用了的tomcat版本,如果是5.5以上的有这种情况发生. 2.你是否在你web的根目录下创建了新的目录,这个jsp页面放在新目录中,那么解决方法就是移出jsp到根目录下,或是把根目录下的WEB-INF拷贝一份到新目录下,就OK了. 由于tomcat的新版本中,估计是加强了安全性,所以在查找一些类时,出现了这种情况. 希望对你有所帮助. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------把类文件放到tomcat/common/classes目录下才可以用,在虚拟目录的web-inf中不起作用 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------字母大小写出现问题,你intVar的getter方法写错了,下面要读取的时候找不到对应方法自然就出现异常。 一般getter和setter可以使用IDE生成,避免手写可能发生的错误。 ------------------------------------------------------------------------------------------------------------------------------------------The value for the useBean class attribute XXX is invalid 问题详解
可见错误可能的原因包括:
1. 在编译 JSP 时(不是运行时),指定的 Bean 类没找到
2. Bean 虽然找到了,但是它不是 public 的,或者找到的 class 文件是 interface 或抽象类
3. Bean 类中没有 public 的默认构建函数
第二点很明显,不用多解释,最经常发生的情况是 Bean 类忘了声明为 public 。
第三点中需要注意的是,如果你的 Bean 类没有提供任何构造函数,将自动生成一个默认构建函数,这没有问题。但是,如果你有构造函数,则不会自动生成该默认构造函数。经常被忽略的问题是写了默认构造函数却不是 public 的。
第一点看起来简单,不过却最令人头痛,尤其是在开发环境里。这里需要注意的是,"在编译 JSP 时",意味着引用 Bean 的 JSP 是新的,或者刚刚更新过,或者 TOMCAT_HOME/work 中的编译结果被清除了。此时,Tomcat 将自动(重新)编译该 JSP,此时如果发现 Bean 没找到,就会报这个错。情况因为 JSP 或者 Bean 类正在开发而变得复杂,一一列举所有情况没有意义,这里我举一些典型例子,借此应该可以举一反三:
如果 JSP 编译结果存在,且 JSP 没有更新,Tomcat 不会重新编译 JSP,同时默认情况也不会自动重新加载更新过的 Bean 类(参考 http://jakarta.apache.org/tomcat/tomcat-5.5-doc/config/context.html 中的 reloadable)。所以,你会发现此时即使删除了 Bean 类都没有问题,当然,更新 Bean 类也不会有什么用。如果在 JSP 编译产生之后,我们重起了服务器,由于 JSP 文件编译的结果存在,所以,可以仍然访问 JSP 页面,而不必重新编译。可是如果访问前,删掉了 Bean 类,就会报过 ClassNotFoundException 而不是上述错误。关键在于 JSP 是否经过编译,没有编译则没有找到类报告题目中的编译错误 ,编译过则是 ClassNotFoundException 运行时实例化错误。
还有一个更为特殊的例子。如果 Web 应用在启动时, WEB-INF/classes 目录不存在,则在启动应用后,新建 classes 目录,动态添加新的类进去是没有用的,会报告同样的错误。原因是此时的 Tomcat 不会去检查该目录,也就不会找到你需要的类。对 WEB-INF/lib 目录也是同样。
-------------------------------------------------------------------------------------------------
说实话,的确很详细,但是实际问题比不是这个样子;
什么找不到 class了,目录只类的问题发生的几率是非常小的
因为jsp最基础的的开发环境是Tomcat+myeclipse
上述问题在myeclipse里面基本不会发生 就算发生只要删除服务起里面的目录再
导入,操作十分简便
我要说的是另外的问题,
这个问题还要从N天说起,我们刚开始学jsp老师让写一个简单的购物网站,
一切都很顺利,可是今天在做注册页面的时候发生了上述问题,
<code>------------------
<%@ page import="file.User_info"%>
1.<jsp:useBean id="Con_Db" scope="page" class="file.Con_Db"></jsp:useBean>
2.<jsp:useBean id="user_info" scope="page" class="User_info">
3.<jsp:setProperty name="user_info" property="*"/>
</jsp:useBean>
提示2.里面的User_info有问题
在所有的途径都测试后,真的让人崩溃呀.么有办法,就去baidu了
一看-------晕倒,千篇一律--------------怀疑------------
Tomcat的目录我都看了好多遍了,决度没有问题,就当世界仿佛都离我而去的时候我发现了一个问题---------------
<jsp:useBean id="user_info" scope="page" class="User_info">
class=后面我是第一次这样写,因为,在我写file.回车后myeclipse自己生成了上述语句,以前我总是觉得都page指令中加太多的import很影响美观,所以总是把路径写在上面,而这次,小小的情绪改变了很多,
将上述代码改为
<code>----------------------------
<jsp:useBean id="user_info" scope="page" class="file.User_info">
<code>--------------------
写上路径------------
测试通过,
我想这只是一种技巧,在理论上不可能出错的地方出了错,不排除是myeclipse在本次处理的过程中发生了一点小小的问题,因为在这种地方出现问题简直是天方夜谈
=============================
再此我感叹一下:
细节真的可以影响大局,特别是在编程方面,一点小小的问题都可能造成巨大的影响,大到你都不会怀疑到出错的是那个本以为百分百正确的地方