import java.io.*; import javax.servlet.*; import javax.servlet.http.*; /* * 1.1.1 * Karl-Adam Karlsson * 06-11-01 * * Servlet för besökar räkning. * Testad på localhost med tomcat. * * synchronized använt vid filhanterinegn. * Detta borde se till att inget dumt händer. Eftersom, som jag förstår det * är det tomcat som kör det hela med nya trådar varje gång, så * synchronized borde se till att tomcat inte trådar till det underligt. * */ public class ServCounter extends HttpServlet { public void doGet( HttpServletRequest req, HttpServletResponse res ) throws IOException { res.setContentType( "text/html" ); PrintWriter targetClient = res.getWriter(); long number = getCounter(); number++; targetClient.println( "Servlet Counter" ); targetClient.println( "

Greetings visitor number: " + number +"

" ); saveCounter(number); //Skriv ut detta nummer. //targetClient.println( ); //Lägg till ett och spara fil. targetClient.close(); } /* Syncroniserad getCountermetod, som laddar data från fil returnerar en long. * */ private synchronized long getCounter(){ long ano = 0; try{ // Öppna fil och hämta info om beöksnummer. // Använder ett statiskt filnamn, eftersom alla skall ju använda samma. File f = new File(getServletContext().getRealPath("counter")); //Om detta e true har vi skapat, ny. Ergo filen fanns inte vi e alltså beökare no. 1 och skall // skriva 1 till filen. if(f.createNewFile()){ ano = 0; return ano; }else{ //Annars läser vi vad som finns och ökar med ett. FileInputStream fin = new FileInputStream(f); ObjectInputStream ois = new ObjectInputStream(fin); ano = (long)ois.readLong(); ois.close(); fin.close(); } }catch(IOException ioe){ ioe.printStackTrace(); } return ano; } /* * Synkronisearad save counter som sparar. * long anumber till counterfil. */ private synchronized void saveCounter(long anumber){ try{ //Tar bort gamla filen. File oldfile = new File(getServletContext().getRealPath("counter")); oldfile.delete(); //Skapar nu counter fil File fout = new File(getServletContext().getRealPath("counter")); FileOutputStream os = new FileOutputStream(fout); ObjectOutputStream oos = new ObjectOutputStream(os); //Skriver till tempfil oos.writeLong(anumber); oos.close(); os.close(); }catch(IOException ioe){ ioe.printStackTrace(); } } }