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();
}
}
}