Unable to compile class

[nobr]I'm in the process of teaching myself how to use JSPs and JavaBeans, and I'm running into a problem that I can't figure out. I'm following a tutorial in which I use a simple bean (UserData) to collect and retrieve simple user data.

However, I continue to get this error from the Tomcat Server:

org.apache.jasper.JasperException: Unable to compile class for JSP

An error occurred at line: 9 in the jsp file: /saveName.jsp

Generated servlet error:

C:\jakarta-tomcat-5.0.28\work\Catalina\localhost\_\org\apache\jsp\saveName_jsp.java:51: cannot access myPackage.UserData

An error occurred at line: 9 in the jsp file: /saveName.jsp

Generated servlet error:

bad class file: C:\jakarta-tomcat-5.0.28\webapps\Root\WEB-INF\classes\myPackage\UserData.class

class file contains wrong class: UserData

Please remove or make sure it appears in the correct subdirectory of the classpath.

UserData user = null;

^

1 error

org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)

org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:332)

org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:412)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:472)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)

org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

And here is the code for the 4 files involved:

1. getName.html

<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN" http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>Getting Your Name</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

</head>

<body>

<form method="post" action="saveName.jsp">

What's your name?

<input type="text" name="username" size="20">

<br />

What's your e-mail address?

<input type="text" name="email" size="20">

<br />

What's your age?

<input type="text" name="age" size="4">

<br /><br />

<input type="submit">

</form>

</body>

</html>

2. saveName.jsp

<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="myPackage.*" errorPage="" %>

<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>Untitled Document</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

</head>

<jsp:useBean id="user" type="UserData" scope="session" />

<jsp:setProperty name="user" property="*" />

<body>

<a href="nextPage.jsp">Continue</a>

</body>

</html>

3. nextPage.jsp

<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="myPackage.*" errorPage="" %>

<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>Untitled Document</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

</head>

<jsp:useBean id="user" type="UserData" scope="session" />

<body>

Hello, <%= user.getUsername() %>! (e-mail: <%= user.getEmail() %>)<br />

You are <%= user.getAge() %> years old.<br />

Your age rating is

<%

int age = user.getAge();

if (age < 0) out.println("impossible!");

elseif (age < 30) out.println("young.");

elseif (age < 50) out.println("old.");

else out.println("ancient!");

%>

</body>

</html>

4. UserData.java

// Java Document

package myPackage;

publicclass UserData{

String username;

String email;

int age;

publicvoid setUsername(String value){

username = value;

}

publicvoid setEmail(String value){

email = value;

}

publicvoid setAge(int value){

age = value;

}

public String getUsername(){

return username;

}

public String getEmail(){

return email;

}

publicint getAge(){

return age;

}

}

The JSP and HTML files are in the Root directory; the class file for UserData is in Root\WEB-INF\classes\myPackage

And here is the environment information: the server is running Windows 98, Jakarta Tomcat ver. 5.0.28, and Java 2 Standard Edition ver. 1.4.2_06. The files have been written in Macromedia Dreamweaver MX 2004

Any suggestions?[/nobr]

[7772 byte] By [rainmongera] at [2007-10-2 14:24:00]
# 1

Here is the 411. The jsp:usebean tag has a class attribute. If you don't specify it, then who knows where it'll look? right? So user

<jsp:useBean id="user" type="UserData" scope="session" class="mypackage.UserData"/>

In the other error, I suspect you have a java file that is named differently than the class declared within that file. But it's hard to know for sure. This could also just be a side effect of the problem I mentioned above.

queperknucklea at 2007-7-13 12:43:01 > top of Java-index,Enterprise & Remote Computing,Web Tier APIs...
# 2

Actually, you know what. Just change that to

<jsp:useBean id="user" type="mypackage.UserData" scope="session" />

which will solve both problems. if type doesn't work, get rid of it and use class. but it should.

queperknucklea at 2007-7-13 12:43:01 > top of Java-index,Enterprise & Remote Computing,Web Tier APIs...
# 3

OK, that didn't work. It should know where to find UserData because I put myPackage in the import statement at the top. Here's what I got when I put in type="myPackage.UserData"

org.apache.jasper.JasperException: Unable to compile class for JSP

An error occurred at line: 9 in the jsp file: /learning/saveName.jsp

Generated servlet error:

C:\jakarta-tomcat-5.0.28\work\Catalina\localhost\_\org\apache\jsp\learning\saveName_jsp.java:51: cannot access myPackage.UserData

An error occurred at line: 9 in the jsp file: /learning/saveName.jsp

Generated servlet error:

bad class file: C:\jakarta-tomcat-5.0.28\webapps\Root\WEB-INF\classes\myPackage\UserData.class

class file contains wrong class: UserData

Please remove or make sure it appears in the correct subdirectory of the classpath.

myPackage.UserData user = null;

^

1 error

org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)

org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:332)

org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:412)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:472)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)

org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

And here's what I get when I use class="myPackage.UserData"

(I also get this when I try using both type="UserData"

and class="myPackage.UserData"

):

javax.servlet.ServletException: myPackage/UserData (wrong name: UserData)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:244)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

java.lang.NoClassDefFoundError: myPackage/UserData (wrong name: UserData)

java.lang.ClassLoader.defineClass0(Native Method)

java.lang.ClassLoader.defineClass(ClassLoader.java:539)

java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)

org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1634)

org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:860)

org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1307)

org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1189)

org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1214)

org.apache.jasper.compiler.Node$UseBean.accept(Node.java:1116)

org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2163)

org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2213)

org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2219)

org.apache.jasper.compiler.Node$Root.accept(Node.java:456)

org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2163)

org.apache.jasper.compiler.Generator.generate(Generator.java:3272)

org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:244)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:470)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)

org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

AND... here's what I get when I try using just class="UserData'

org.apache.jasper.JasperException: /learning/saveName.jsp(9,0) The value for the useBean class attribute UserData is invalid.

org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:39)

org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:409)

org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:150)

org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1227)

org.apache.jasper.compiler.Node$UseBean.accept(Node.java:1116)

org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2163)

org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2213)

org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2219)

org.apache.jasper.compiler.Node$Root.accept(Node.java:456)

org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2163)

org.apache.jasper.compiler.Generator.generate(Generator.java:3272)

org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:244)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:470)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)

org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)

org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

rainmongera at 2007-7-13 12:43:01 > top of Java-index,Enterprise & Remote Computing,Web Tier APIs...
# 4

What does your UserData class look like?

It should start with

package myPackage

public class UserData

The error messages seem to indicate that it is just the class UserData, and not in any package.

"bad class file: C:\jakarta-tomcat-5.0.28\webapps\Root\WEB-INF\classes\myPackage\UserData.class

class file contains wrong class: UserData"

Cheers,

evnafets

evnafetsa at 2007-7-13 12:43:01 > top of Java-index,Enterprise & Remote Computing,Web Tier APIs...
# 5
If you look at the original post, there is a copy of my UserData.java file. It has both of those lines.I know Java; I used to teach it. JSPs are another matter entirely...
rainmongera at 2007-7-13 12:43:01 > top of Java-index,Enterprise & Remote Computing,Web Tier APIs...
# 6
rainmonger, I am learning from the same tutorial and having exactly the same problems that you have. Have you found a solution yet? If so, Please post it here.
midpj2mea at 2007-7-13 12:43:01 > top of Java-index,Enterprise & Remote Computing,Web Tier APIs...
# 7
the bean class we r using should be put in package then it wil work.and also change in both jsps i.e., SaveName.jsp n NextPage.jsp the bean tag attribute class="package.classname"Hope this wil help u....
Soneea at 2007-7-13 12:43:01 > top of Java-index,Enterprise & Remote Computing,Web Tier APIs...
# 8
Actually, if you're using Tomcat 6, there is a predefined place where Tomcat expects the classes to be and that's $CATALINA_HOME/webapps/ROOT/WEB-INF/classes. Any other place is just not good enough.
giulixa at 2007-7-13 12:43:01 > top of Java-index,Enterprise & Remote Computing,Web Tier APIs...