When I run the app I'll enter some search criteria. I'll get good results. Then if I close the browser, or just go back and rerun the search it will give me the previous set of results plus the new ones.
My arraylist is a list of beans. The servlet runs each time the user makes a form submit from the first screen. What I need to do is make sure that the array list is clear before I do any of my lines.
I've already turned off browser caching using the meta tags in my template. My template is applied to all the pages.
Any ideas? [ November 30, 2007: Message edited by: Bear Bibeault ]
Bryce, list is an instance level variable. It is initialized once one the servlet is created and then never again. You would need to re-initialize it each time or better yet make the list a local variable. The current approach is not thread safe. If two people access the servlet at the same time, they will get a mix of data back.
Bryce, Servlet container creates only one instance of any servlet and all the request share the same object by multi thread, Servlet is a multitreaded hence there will be only one object for a give servlet and as the new request comes in , an new thread is created for the request and hence not a new object. and hence if you add data to the arraylist , it will be visible to all the request and till the time the servlet container(web server or app server) goes down. It is srongly advice not to use any variables in the servlets.
Joined: Nov 19, 2007
Ok. I moved the list inside the method. It is thread safe now. I've tested it and I get no cross results while performing multiple actions on the servlet. My concern now turns toward my connection. I think, as I have it now, I only get one connection with the servlet and its being shared by all the requests. I'm guessing this is not the way to do it? I should have a connection per request? If I leave it this way, it is my thinking that the responses would be very slow for many requests over the connection?
Well I have a separate class that I called ConnDB.java
In that class I have my two methods, one for connecting to the DB and one for obtaining a ResultSet. Here is my code...
Is this what you are talking about when you say DB code that is UI agnostic? Any java class can call these methods to make connections and get result sets. How do I do the container controlled connection pooling? What is the coding difference? I had a hard time getting the scope right so that I could make the connection from my servlet. Should I have each method make a connection when it is called? I'm not real clear on how these different methods are handled... Any clarification would be appreciated.
Bryce, what Bear meant is that you should refactor your code so that the database logic/connection stuff is not dependent on that particular view. So, that it can be accesed from a browser, a PDA, or a non-web application, etc.
You may want to look up or search the forum for the Model-View-Controller (MVC) pattern
briefly... your data access logic will be in the model (possibly using a DAO). The view will be your JSP in this case. And the Servlet will serve as the controller. It will serve a a communicator between the view and the model.
There is tons of stuff out there on MVC, so...
Bosun (SCJP, SCWCD)
So much trouble in the world -- Bob Marley
Joined: Nov 19, 2007
I think that I've gotten it in MVC for the most part. I might be missing something though. I have my JSP. That is the view. The only thing on my JSPs are html tags and jstl tags with EL to get information stored in beans. So I have the view part right. Now I have a Bean, which I store my information in and I have a servlet that puts the information into a bean. The bean would be my model and the servlet would be my controller.
So that is MVC. But my issue seems to be with database connectivity. This would be a separate controller? How exactly does connections to the data base fit in the MVC? I thought they would be part of the Controller part. I'll go dig around for some examples of MVC that include database connections. But I think I'm pretty close on this. I can't be far off...
If you are doing DB calls in the servlets, you're not even close to MVC. Can your app pass this test? Put a Swing or a command line UI on your app without copying or moving any model code.
Joined: Nov 23, 2007
MVC is used to loosly couple the business logic and the presentation (servlets,jsp,...) so never put your business logic into servlets or into jsp it is a bad design, well you can grow existing frameworks like struts or spring which hve implemented MVC, and use datasource so that you can reap the benifit of connection pooling and transactions based on the server implementation for datasource
Joined: Nov 19, 2007
Well, I just had a nice long response with some questions, then nature called me to my "special thinking spot". And while thinking I figured it out. I processed it. I was looking at it from the wrong angle.
Here is how I was looking at it...
My servlet needed to get some info from the db to the bean. And I was thinking, "what do I need to do first?". I need a DB connection. So, that was what I tried to do. Then I needed my result set. So I built my sql string and made my db call and got my result set. But just because things are supposed to happen in that order doesn't mean the servlet should be written in a strict top down approach. This is completely wrong.
These are the steps I need to happen. 1.create sql string 2.connect to db 3.get resultset 4.make list of beans by iterating over resultset.
In my servlet I need to call a class called SetBean. That class will make a call to my BuildList method, which calls the ResultSet method, which will make a call to the connection method. By staring at the end result and creating separate classes and methods as I go backwards. This will make my code fall into the MVC pattern. The only thing my servlet is going to do is direct traffic. It will figure out which way I should be moving, pass the appropriate string out to the generic list building methods which will need to only return the list to my servlet so that I can do my request.setAttribute("list",list); Then forward my getRequestDispatcher to the right jsp.
Whew! I know it took me a while to finally see this. Thank you guys for all your patience and direction. If I'm still missing something please let me know.