How do I create a hit counter Servlet?
Category: javax.servlet, viewed: 2021 time(s).
Here we have a simple example of creating a hit counter using servlet. The servlet updates the hits counter every time a page is visited and display the number of hits as an image. The image is generated at runtime using Java's Graphic2D and ImageIO class.
To store the hits data create a table HITS with a single field called COUNTER and set the initial value of the counter to zero. Below is the HitCounter servlet code.
package org.kodejava.example.servlet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HitCounter extends HttpServlet { public HitCounter() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { updateHitCounter(); getHitCounterImage(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { updateHitCounter(); getHitCounterImage(request, response); } private void updateHitCounter() { Connection connection = getConnection(); try { // // Update the hits counter table by incrementing the counter every time // a user hits our page. // String sql = "UPDATE hits SET counter = counter + 1"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { closeConnection(connection); } } private void getHitCounterImage(HttpServletRequest request, HttpServletResponse response) throws IOException { Connection connection = getConnection(); String hits = ""; try { // // Get the current hits counter from database. // String sql = "SELECT counter FROM hits"; PreparedStatement stmt = connection.prepareStatement(sql); ResultSet rs = stmt.executeQuery(); while (rs.next()) { hits = rs.getString("counter"); } } catch (SQLException e) { e.printStackTrace(); } finally { closeConnection(connection); } // // Create an image of our counter to be sent to the browser. // BufferedImage buffer = new BufferedImage(50, 20, BufferedImage.TYPE_INT_RGB); Graphics2D g = buffer.createGraphics(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setFont(new Font("Monospaced", Font.PLAIN, 14)); g.setColor(Color.WHITE); g.fillRect(0, 0, 50, 20); g.setColor(Color.BLACK); g.drawString(hits, 0, 20); response.setContentType("image/png"); OutputStream os = response.getOutputStream(); ImageIO.write(buffer, "png", os); os.close(); } private Connection getConnection() { Connection connection = null; try { Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://localhost/sampledb", "root", ""); } catch (Exception e) { e.printStackTrace(); } return connection; } private void closeConnection(Connection connection) { try { if (connection != null && !connection.isClosed()) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } } |
To configure the servlet you'll need to update the web.xml file as follow:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>kodejava-example</display-name>
<servlet>
<display-name>HitCounter</display-name>
<servlet-name>HitCounter</servlet-name>
<servlet-class>
org.kodejava.example.servlet.HitCounter
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HitCounter</servlet-name>
<url-pattern>/HitCounter</url-pattern>
</servlet-mapping>
</web-app>
To display the hits counter image on the JSP page, create an image tag with the source point to our HitCoutner servlet.
Visited for: <img src="http://localhost:8080/app-name/HitCounter" alt="Hit Counter"/> times.
Can't find what you are looking for? Join our FORUMS and ask some questions!
Related Examples
- How do I get servlet request header information?
- How do I get servlet request URL information?
- How do I read servlet context initilization parameters?
- How do I know session last access time?
- How do I get a notification when session attribute was changed?
- How do I capture session creation and removal events?
- How do I invalidate user's session?
- How do I get client IP and hostname in Servlet?
- How do I set the maximum age of a cookie?
- How do I send a response status in servlet?