import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import mixer.*; /* * 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 SeparatedCounter extends HttpServlet { public void doGet( HttpServletRequest req, HttpServletResponse res ) throws IOException { //res.setContentType( "text/html" ); String htmlTemplate = Mixer.getContent( getHtmlFile("count.html") ); Mixer m = new Mixer(htmlTemplate); PrintWriter targetClient = res.getWriter(); long number = getCounter(); number++; String aNo = Long.toString(number); System.out.println(htmlTemplate); //targetClient.println( "Servlet Counter" ); //targetClient.println( "

Greetings visitor number: " + number +"

" ); //Sätt variebeln i .html dokumentet till number. m.add("===number===", aNo); res.setContentType("text/html"); targetClient.println(m.getMix()); saveCounter(number); //Skriv ut detta nummer. //targetClient.println( ); //Lägg till ett och spara fil. targetClient.close(); } /* * laddar en fil. * Var tidigare synchronized, men såg i källkoden för mixer att den ändå använde synchronized, * så jag tog bort det här. Verkade vara overkill * att synchroniza dubbelt. * Används för att ladda till Mixer. * Notera att filen måste ligga i rätt mapp. * För mig, på localhost, var detta examples i tomcat. * Men det är ju en inställningsfråga. * Finns inte filen skriver man bara ut stacktrace. * * * @param String name The name of the file to load * @return File The loaded file. */ private File getHtmlFile(String name){ File f = new File(getServletContext().getRealPath(name)); return f; } /* 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(); } } }