Solved

Can't use beans and servlet at the same time

Posted on 2003-10-22
36
305 Views
Last Modified: 2010-04-01
Well, first I'm pretty new to JSP so if I make any really stupid mistakes, forgive me.

At the moment, this is the architecture for my website.  I've got main page where you can click on a picture which takes you to a jsp page.  This jsp page uses a bean to get a bunch of data out of a database and then display it on the screen.  Now, this part works.

 Next, I added a login.html page which uses a servlet to verify a username and password. I added the servlet and mapping stuff to the web.xml file.  The log on page works fine.  But since I changed the web.xml file, the jsp page that uses the bean isn't working.  I don't get any errors but it seems like the beans don't seem to be working.  

Now, the one thing I can think of that I'm doing that it might not like is that fact that none of my classes are in packages.  I've just put them all in the WEB-INF/classes directory?  Does this matter?

Any help would be great!!!

0
Comment
Question by:MegaNasty
  • 20
  • 10
  • +3
36 Comments
 
LVL 3

Expert Comment

by:applekanna
Comment Utility
you are right all classess ned to be in WEB-INF/classes dir.

Can you post your web.xml ?
0
 

Author Comment

by:MegaNasty
Comment Utility
Here's the web.xml file

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
    "http://java.sun.com/dtd/web-app_2_2.dtd">
     
<web-app>
      <servlet>
            <servlet-name>Login</servlet-name>
            <description> handles the logging in </description>
            <servlet-class>LoginServlet</servlet-class>
      </servlet>

      <servlet-mapping>
            <servlet-name>Login</servlet-name>
            <url-pattern>/Login</url-pattern>  
      </servlet-mapping>

</web-app>
0
 
LVL 19

Expert Comment

by:Kuldeepchaturvedi
Comment Utility
change your web.xml like
<servlet-mapping>
         <servlet-name>Login</servlet-name>
         <url-pattern>servlet/Login</url-pattern>  
    </servlet-mapping>

and then try it out..
now one more thing that you will have to take care is that your HTML should be submitted to
/servlet/LoginServlet instead of /LoginServlet.

If you are using Tomcat 4.1 or greater than it will need you to put your bean inside a package.... this package shd exist in your web-inf/classes.

Regards
0
 

Author Comment

by:MegaNasty
Comment Utility
Awesome.  I'll give that a go and tell you what happens.
0
 

Author Comment

by:MegaNasty
Comment Utility
Didn't change anything.  Still not getting anything out of the beans...

The login works with my web.xml but the beans don't work when the servlet is including in the xml file.

Anymore suggestions guys?


0
 
LVL 2

Accepted Solution

by:
Karaa earned 44 total points
Comment Utility
it is better to put ur classes in a package and in ur jsp call this class with that package.
If u don't use servlet then can u access that bean?
0
 

Author Comment

by:MegaNasty
Comment Utility
I'm really stumped here guys?

I'm trying to work out what I'm doing wrong.

This is an exert from the jsp file.
-------------------------------------------------------------------------------.
.
.
      String passtype = request.getParameter("part");

      PartTitleBean partTitleBean = new PartTitleBean();
      List titles = partTitleBean.getParts();
      PartsBean currentPart;
   %>
.
.
.
     <%
           
           // store titles in session for further use
      session.setAttribute( "partTitles", titles );

      // obtain an Iterator to the set of keys in the List
      Iterator iterator = titles.iterator();

      while ( iterator.hasNext() ) {
           etc....
-------------------------------------------------------------------------------

The problem is that the iterator.hasNext() returns false...


Thought this might help... probably not though
0
 

Author Comment

by:MegaNasty
Comment Utility
yes, if I don't include the servlet in the web site, the beans work.
0
 
LVL 15

Expert Comment

by:jimmack
Comment Utility
Is this a problem with the ordering of the tags in your web.xml file?

Beans (EJBs) must be declared as the last part of the web.xml.

See the section "Deployment Descriptor" on the following page to check your ordering:

http://www.microps.com/mps/3254.html
0
 

Author Comment

by:MegaNasty
Comment Utility
The beans are basically interacting with an Access DB to return some data which is to be displayed with the jsp page.  

I've included my web.xml page above.  Do I need to include anything else in the web.xml file?  Something to do with the beans??
0
 

Author Comment

by:MegaNasty
Comment Utility
desperation is creeping here cos I can't do anymore til this is fixed
0
 
LVL 15

Expert Comment

by:jimmack
Comment Utility
Sorry.  It seems that this is (as you said) a JavaBean, not an EJB.  Apologies if my previous comment confused the issue.

Can you add a debug line in the bean (eg. System.out.println("got here...");)

This should then appear in the catalina.out file in the logs directory.

Also, are there any messages in the catalina.out, or other logs that might indicate a problem?
0
 

Author Comment

by:MegaNasty
Comment Utility
well, I've added all my classes (beans and servlets) to a package :- classes.store

Ok.  This seemed to help a little bit.  Help  I mean, I get a different problem :(

Now, I get an error when it loads the .jsp file.  I'm getting an error saying
"Method getCategory() not found in class PartsBean"  But I'm positive that it is in there.  I've checked and recompile many times to check this problem... but it can't seem to access the getCategory() method.  

The weirdest thing is the only thing I've changed in the PartsBean.java file is the package name when reflecting the directory structure and if it was a problem with this line, then I would get an error saying it couldn't access the bean,right?

HELP ME!!! ARG!
0
 

Author Comment

by:MegaNasty
Comment Utility
These are the relevant lines (I think)

These lines are from my PartsBean.java file
---------------------------------------------------------------------------------
package classes.store;
.
.
public class PartsBean implements Serializable {
     private String Name, Category, Description;
.
.
public String getCategory()
      {
            return Category;
      }
.
.
.
---------------------------------------------------------------------------------

These lines are in my .jsp file
---------------------------------------------------------------------------------
import = "java.util.*, classes.store.*"
.
.
PartsBean currentPart;

String parttype = currentPart.getCategory();  \\this is were I get the error
.
.
---------------------------------------------------------------------------------
0
 
LVL 15

Expert Comment

by:jimmack
Comment Utility
Hmm.

Can you post the PartsBean.java file?

I see that before, the problem was with partsBean.getParts(), now it is with partsBean.getCategory() , yes?

Correct this if it's wrong...

You have a PartTitleBean class that contains a List of PartBeans.
You retrieve this using:

>> List titles = partTitleBean.getParts();

and then you iterate through the parts as follows:

PartBean currentPart;

Iterator it = titles.iterator()
{
    currentPart = (PartBean)it.next();

    ...  and somewhere in this loop, you do

    xxx = currentPart.getCategory();

Is that right?
0
 

Author Comment

by:MegaNasty
Comment Utility
Here it is:-

// PartsBean.java
// A PartBean object contains the data for one Part.

// Java core packages
import java.io.*;
import java.text.*;
import java.util.*;

// third-party packages
import org.w3c.dom.*;

public class PartsBean implements Serializable {
         private String Name, Category, Description;
      private int Stock;
      private double Price;
         
      // set Name
      public void setName(String name)
      {
            Name = name;
      }
      
      // set category
      public void setCategory(String category)
      {
            Category = category;
      }

      // set stock
      public void setStock(int stock)
      {
            Stock = stock;
      }

      // set Price
      public void setPrice(double price)
      {
            Price = price;
      }

        // set Price
      public void setDescription(String description)
      {
            Description = description;
      }

      //return name
      public String getName()
      {
            return Name;
      }      

      //return category
      public String getCategory()
      {
            return Category;
      }      

      //return stock
      public int getStock()
      {
            return Stock;
      }      

      //return name
      public double getPrice()
      {
            return Price;
      }      
   
        //return description
      public String getDescription()
      {
            return Description;
      }
}
0
 

Author Comment

by:MegaNasty
Comment Utility
Here is the PartTitleBean:-
// Java core packages
import java.io.*;
import java.sql.*;
import java.util.*;

// Java extension packages
import javax.naming.*;
import javax.sql.*;

public class PartTitleBean implements Serializable {
    private Connection con;
    private PreparedStatement s;
    private ResultSet rs;

 
   // construct TitlesBean object
   public PartTitleBean()
   {
      
      // attempt database connection and setup SQL statements
         try {

          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

            // set this to a MS Access DB you have on your machine
                  String filename = "C:/Maverickcomp.mdb";
            String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=";
            database+= filename.trim() + ";DriverID=22;READONLY=true}"; // add on to the end

            // now we can get the connection from the DriverManager
             con = DriverManager.getConnection( database ,"","");    
            
        }
       
        catch (Exception err) {
        System.out.println("ERROR: " + err);
        }
   }
   public void test()
   {
   }

   // return a List of PartBeans
   public List getParts()
   {
      List partList = new ArrayList();

      // obtain list of titles
      try {
         ResultSet rs = s.executeQuery();
      
      s = con.prepareStatement("SELECT * FROM Parts");            
         
         // get row data
         while ( rs.next() ) {
            PartsBean part = new PartsBean();
                  
            part.setName(rs.getString("Name"));
            part.setCategory(rs.getString("Category"));
            part.setPrice(rs.getDouble("Price"));
            part.setStock(rs.getInt("Stock"));
            part.setDescription(rs.getString("Description"));
           
            partList.add(part);
         }
      }
     
      catch (SQLException exception ) {
         exception.printStackTrace();
      }
      finally {
          return partList;
      }
   }




   // close statements and terminate database connection
   protected void finalize()
   {
       try {
         con.close();
       }
       
       catch (SQLException exception) {
           exception.printStackTrace();
       }
   }
}
0
Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

 

Author Comment

by:MegaNasty
Comment Utility
Finally, the jsp file:-


<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<%@
   page language = "java"
   import = "java.util.*"
   session = "true"
%>

<!-- begin document -->
<html xmlns = "http://www.w3.org/1999/xhtml">

<head>
   <title>Part List</title>

   <link rel = "stylesheet" href = "styles.css"
      type = "text/css" />
</head>

<body>
   <jsp:include page = "banner.html" flush = "true"/>

   <%
String passtype = request.getParameter("part");

      PartTitleBean partTitleBean = new PartTitleBean();
      List titles = partTitleBean.getParts();
      PartsBean currentPart;

   %>
   
   <P class = "bigfont"> <%= passtype %> </p>

   <table border="1"align = "center">
      <thead><tr>
          <th>Title</th>
          <th>Price</th>
      </tr></thead>
   
     <%
           
           // store titles in session for further use
      session.setAttribute( "partTitles", titles );

      // obtain an Iterator to the set of keys in the List
      Iterator iterator = titles.iterator();


      while ( iterator.hasNext() ) {
         currentPart = ( PartsBean ) iterator.next();
        
       String parttype = currentPart.getCategory();

       if (passtype.equals(parttype)){
%>
         <tr>
            <td>
               <a href = "selpart.jsp?Part=<%= currentPart.getName() %>">
                     <%= currentPart.getName() + "     " %>
                  </a>

            </td>
            <td>
                  <a href = "selpart.jsp?Part=<%= currentPart.getName() %>">
                     <%=  currentPart.getPrice()+"" %>

            </td>
            
         </tr>

   <% // continue scriptlet  
       }
      }   // end while loop
   %>
         </table>
   </p>
</body>

   <p> Click any of the above products to view them. </p>
</html>
0
 

Author Comment

by:MegaNasty
Comment Utility
Any help now?  :)
0
 
LVL 15

Expert Comment

by:jimmack
Comment Utility
OK.

Since you added the package, you may have some older .class files kicking around (under the Tomcat "work" directory).

If this is the case, your .JSP may be referring to a version of the bean that doesn't include this method.

I notice that at the top of the .JSP file, your import only includes java.util.

Make sure this is changed to

>> import = "java.util.*, classes.store.*"

as you said earlier ;-)
0
 

Author Comment

by:MegaNasty
Comment Utility
ooops.  That was an older version the jsp I had open in notepad so I just copied that.  The real one has that import line.  

But why would the problem only occur when I use getCategory?  Wouldn't it break down if it couldn't find the bean when the bean is declared??

This is really confusing me...
0
 
LVL 15

Expert Comment

by:jimmack
Comment Utility
Well I can see why this is confusing.

Can you post the complete error output that you get when you access the JSP.

(Sorry this is taking so long.  Stick with it and I'm sure we'll have it fixed soon).
0
 

Author Comment

by:MegaNasty
Comment Utility
Error: 500
Location: /cmon/parts.jsp
Internal Servlet Error:

org.apache.jasper.JasperException: Unable to compile C:\Documents and Settings\Matt\Desktop\tomcat\work\DEFAULT\cmon\parts_14.java:128: Method getCategory() not found in class PartsBean.
                         String parttype = currentPart.getCategory();
                                                                  ^
C:\Documents and Settings\Matt\Desktop\tomcat\work\DEFAULT\cmon\parts_14.java:158: Method getPrice() not found in class PartsBean.
                  out.print(  currentPart.getPrice()+"" );
                                                  ^
2 errors

      at org.apache.tomcat.facade.JasperLiaison.javac(JspInterceptor.java:898)
      at org.apache.tomcat.facade.JasperLiaison.processJspFile(JspInterceptor.java:733)
      at org.apache.tomcat.facade.JspInterceptor.requestMap(JspInterceptor.java:506)
      at org.apache.tomcat.core.ContextManager.processRequest(ContextManager.java:968)
      at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:875)
      at org.apache.tomcat.core.ContextManager.service(ContextManager.java:833)
      at org.apache.tomcat.modules.server.Http10Interceptor.processConnection(Http10Interceptor.java:176)
      at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:494)
      at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:516)
      at java.lang.Thread.run(Thread.java:484)



Here it is.
0
 
LVL 15

Assisted Solution

by:jimmack
jimmack earned 43 total points
Comment Utility
OK.  I'm not sure where the "14" has come from on the file that is referenced.

Have a look in the C:\Documents....\cmon directory to see if it contains the files you would expect.

Then have a look at parts_14.java in that directory.  This should contain the Servlet code that is generated from your JSP.  If should have the "import classes.store;" at the top.


Whoa!

Hang on.  "classes.store"?

If your package name is classes.store, does this mean that under your WEB-INF, you have the following structure:

WEB-INF\classes\classes\store\ <.class files> ?

I notice that your previous postings of PartTitleBean.java and PartsBean.java don't include a "package" line.

If they do, is this line:

package classes.store;

?

Sorry if this sounds a bit cheeky, but are you sure that all your files are saved and up to date (I only mention this because of your earlier comment about pasting a file that you currently had open in notepad that was out of date)?
0
 

Author Comment

by:MegaNasty
Comment Utility
Sorry mate.  I must have all the old versions open.  I've checked all my beans have the package line in.  They do.

And the WEB-INF\classes\classes\store\*.class is correct to.  That's all fine.

mmm... Sorry about the postings being so vague.  Lack of sleep.

Any more help would be great.
0
 
LVL 15

Expert Comment

by:jimmack
Comment Utility
I understand ;-)

How about the content of parts_14.java?

Make sure the imports are correct and make sure you delete and .class files that might be hanging around from earlier builds.

I don't think you should have any class files in the WEB-INF\classes directory any more.

And remember :-)  If the exception report changes at any stage, please post the complete new one ;-)
0
 

Author Comment

by:MegaNasty
Comment Utility
Lastest update on my problem...

Got rid of all errors.  I basically cleared all my tomcat default stuff, restarted the server and now I'm getting now errors... but!... I'm back to my original problem.  It seems like the beans are empty.

The jsp page basically loads up all the parts (of a certain type which is passed to it) and displays them in a table.  But for some reason the table is empty.  

Basically, it has nothing to iterate.  Kinda weird. Cos like I said, I haven't touched the code much and it works when no servlets are used.

Help *YIKES*
0
 
LVL 15

Expert Comment

by:jimmack
Comment Utility
Calm down ;-)

Let's go back to an earlier suggestion.

In PartTitleBean.getParts(), add two System.out.printlns like this:

         // get row data
System.out.println("About to parse result set");
         while ( rs.next() ) {
          PartsBean part = new PartsBean();
         // get row data
         while ( rs.next() ) {
          PartsBean part = new PartsBean();
                 
          part.setName(rs.getString("Name"));
System.out.println("Part name = " + part.getName());
          part.setCategory(rs.getString("Category"));
          part.setPrice(rs.getDouble("Price"));
          part.setStock(rs.getInt("Stock"));
          part.setDescription(rs.getString("Description"));
           
          partList.add(part);
         }
     
These outputs should appear in your "catalina.out" log file.

Alternatively, you might find an SQLException somewhere in your log files (if something has gone astray elsewhere).
0
 

Author Comment

by:MegaNasty
Comment Utility
Awesome.  I'll have to check it out in the morning... waaaaay to tired at the moment! :)

Will check out the log in the morning.

I'll be back in about 10 hours or so... hope you're still around.
0
 
LVL 15

Expert Comment

by:jimmack
Comment Utility
I'll be ready for you next comment ;-)

But.  I'm in the UK, so 10 hours puts it at about 4am.  I'm afraid you'll need to give me at least 4 hours on top of that :-)

Still.  That's a reasonable amount of time to try some stuff out :-)

Don't let anyone sneak in at the last minute and steal the points with a one-liner :-)

Jim.
0
 

Author Comment

by:MegaNasty
Comment Utility
It's ok, Jimmack.  I know who's doing all the hardwork for me so don't worry about one-liners.

Now, about this log file... I can't find it.  I'm running Tomcat 3.3, does that matter?  Is there any other way ?  I will eventuall upgrade but for right now I have to use 3.3.

Is that going to be a major problem?
0
 

Author Comment

by:MegaNasty
Comment Utility
Hope you're coming back soon Jimmack.  I'm all out of ideas and need your help badly.  ARG!
0
 
LVL 3

Assisted Solution

by:krispols
krispols earned 43 total points
Comment Utility
hello MegaNasty,

Just switch this two line:
      try {
         ResultSet rs = s.executeQuery();
     
     s = con.prepareStatement("SELECT * FROM Parts");          
 
must be
      try {
         s = con.prepareStatement("SELECT * FROM Parts");          
         ResultSet rs = s.executeQuery();
     
 regards
0
 
LVL 15

Expert Comment

by:jimmack
Comment Utility
Hi,  I'm back.

krispols may have solved the problem.

However, is this just a mistake because you had files open in your editor, or did you really change the order of these two statements?

I know you had it working before, so they must have been in the right order at some stage.

The version of Tomcat shouldn't be an issue, nor should the version of Java you're using.

Basically, you've had all the bits working, just not all at once ;-)
0

Featured Post

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

Suggested Solutions

HOW TO: Install and Configure VMware vSphere Hypervisor 6.5 (ESXi 6.5), Step by Step Tutorial with screenshots. From Download, Checking Media, to Completed Installation.
Veeam Backup & Replication has added a new integration – Veeam Backup for Microsoft Office 365.  In this blog, we will discuss how you can benefit from Office 365 email backup with the Veeam’s new product and try to shed some light on the needs and …
Here's a very brief overview of the methods PRTG Network Monitor (https://www.paessler.com/prtg) offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…
You have products, that come in variants and want to set different prices for them? Watch this micro tutorial that describes how to configure prices for Magento super attributes. Assigning simple products to configurable: We assigned simple products…

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now