Reply to this topicStart new topic
> HowTo: брояч на посетители (Java Servlet)
fakeuser
публикация 22.12.2008г. в 02:04ч.
Коментар: #1


Доктор - уроци
******

Група: Потребители
Съобщения: 836
Дата на регистрация: 15.11.2008г.
Потребител # 6 111





Реших този път да ви покажа нещо по тематично. Тъй или иначе никой не ми чете темите laugh.gif В този урок ще видите как да направите брояч на посетителите за вашата страница. Крайният резултат: на вашия сайт ще се мъдри картинка, която ще показва колко пъти до сега е била зареждана (Респективно колко импресии има вашата страница) За по-пълна статистика винаги може да се добавят 2 реда код wink.gif

Краен резултат:
Прикачи файл  final.png ( 4.46 килобайта ) Брой сваляния: 7


Да 'сътворим' нашият сървлет
1) Създаваме клас, наследяващ HttpServlet. След като сме решили да броим колко пъти е заредена нашата картинка.. Да! Ще си направим променлива laugh.gif Създайте статично поле visitors. Обърнете внимание, че полето трябва да е статично. Статичните полета са еднкави за всяка инстанция и променени в една, те се променят и във всички останали (еднакво)
КОД
import javax.servlet.http.HttpServlet;

public class CounterServlet extends HttpServlet
{
    private static int visitors = 0;
}


2) Да прихванем Post и Get метода -> Пренаписваме методите doGet и doPost, които HttpServlet любезно ни предоставя. Реших, че Post не ми необходим, затова той изглежда така:
КОД
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        resp.setContentType("text/plain; charset=UTF-8");
        PrintWriter pw = resp.getWriter();
        pw.println("Post method is not suported");
        pw.flush();
        pw.close();
    }


3) Тук прекъсваме програмирането за малко и се прехвърляме в творческия отдел: трябва да създадем фонова картинка за нашия брояч. Хванете любимата си програма за това и надраскайте нещо на бързо. Ето какво направих аз с един gradient в GIMPa:
Прикачи файл  back.png ( 5.05 килобайта ) Брой сваляния: 3


4) Да се върнем на програмирането. Сега ще направим метод, в който ще рисуваме новата картинка. По-късно ще използваме този метод в doGet() wink.gif
CODE

private BufferedImage createCounterImage(String localAddr)
{
visitors++;

ImageIcon background = null;

try
{
background = new ImageIcon(new URL(localAddr + "/SimpleServlet/res/background.png"));
} catch (MalformedURLException e)
{
e.printStackTrace();
return;
}

BufferedImage counter = new BufferedImage(background.getIconWidth(), background.getIconHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = counter.createGraphics();
background.paintIcon(null, g, 0, 0);

g.setColor(new Color(170, 197, 214));
g.setFont(new Font("Apple Garamond Bold Italic", Font.PLAIN, 24));
String text = "" + visitors;
int x = (background.getIconWidth() - text.length() * 10) / 2;
g.drawString(text, x, 45);

return counter;
}

Методът ни получава като параметър символната променлива localAddr. Това представлява комбинация от използвания протокол, IP адрес на сървъра и порта, на който слуша сървлета. Например :8080 или :8143 или каквато и да е вашата комбинация. На установяването на тези параметри ще се спрем в doGet() метода. Съответната променлива използваме, за да заредим фоновата картинка. В моят случай тя се намира на път /SimpleServlet/res/background.png от базовия адрес. Освен инкрементирането на броя посетители (visitors++) в този метод рисуваме върху фоновата картинка числото, отговарящо на посещенията:
КОД
        int x = (background.getIconWidth() - text.length() * 10) / 2;
        g.drawString(text, x, 45);

На първият ред изчислявам началото по X. От там ще започва нарисуваният текст. Грубо определям ширината на текста като умножа броя цифри по 10px за всяка. За по-точно определяне погледнете FontMetrics
Също така решавам, че базата на текста трябва да е на 45px по y. Самият фон е висок 50px - сигурно вече се сещате wink.gif
Идеята на тези изчисления беше да центрирам броя посетители точно под надписа Visitors


5) След като сме написали "рисуващия" метод можем да се върнем на doGet()
Първо задаваме header-a като за PNG картинка
след това използваме методите от HttpServletRequest за да определим порта и адреса (В моят пример се използва само http протокол. Разбира се може да вземете и протоколо чрез request-a). Извикваме нашият метод createCounterImage и върнатата картинка записваме в OutputStream-a на HttpServletResponse инстанцията. Би трябвало да прилича на това:
КОД
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        resp.setContentType("image/png");
        ServletOutputStream os = resp.getOutputStream();
        String localAddr = "http://" + req.getLocalAddr() + ":" + req.getLocalPort();
        ImageIO.write(createCounterImage(localAddr), "png", os);
        os.flush();
        os.close();
    }


6) Voila! Разпънете вашето приложение в Tomcat или друг ServletContainer и поверете във вашият браузер



Пълен код на програмата:
CODE

/**
*
*/
package org.fakeuser.servlets;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.ImageIcon;

/**
* @author Fake User
*
*/
public class CounterServlet extends HttpServlet
{

private static int visitors = 0;

private ImageIcon background;

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
resp.setContentType("text/plain; charset=UTF-8");
PrintWriter pw = resp.getWriter();
pw.println("Post method is not suported");
pw.flush();
pw.close();
}

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
resp.setContentType("image/png");
ServletOutputStream os = resp.getOutputStream();
String localAddr = "; + req.getLocalAddr() + ":" + req.getLocalPort();
ImageIO.write(createCounterImage(localAddr), "png", os);
os.flush();
os.close();
}

private BufferedImage createCounterImage(String localAddr)
{
visitors++;

if (background == null)
{
try
{
background = new ImageIcon(new URL(localAddr + "/SimpleServlet/res/background.png"));
} catch (MalformedURLException e)
{
e.printStackTrace();
}
}

BufferedImage counter = new BufferedImage(background.getIconWidth(), background.getIconHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = counter.createGraphics();
background.paintIcon(null, g, 0, 0);

g.setColor(new Color(170, 197, 214));
g.setFont(new Font("Apple Garamond Bold Italic", Font.PLAIN, 24));
String text = "" + visitors;
int x = (background.getIconWidth() - text.length() * 10) / 2;
g.drawString(text, x, 45);

return counter;
}
}

Bonus - Как би изглеждал вашият web.xml
CODE

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="; xmlns:xsi="; xsi:schemaLocation=" ;>
<display-name>SimpleServlet</display-name>
<servlet>
<servlet-name>CounterServlet</servlet-name>
<servlet-class>org.fakeuser.servlets.CounterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CounterServlet</servlet-name>
<url-pattern>/counter</url-pattern>
</servlet-mapping>

<welcome-file-list>
<!-- Приемам на доверие, че с index.html ще се оправите сами -->
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>



Надявам се да сте научили/намерили нещо полезно wink.gif
Best regards,
Fake User
Go to the top of the page
 
+Quote Post
alien1976
публикация 15.01.2012г. в 10:23ч.
Коментар: #2


Новак
*

Група: Потребители
Съобщения: 9
Дата на регистрация: 7.05.2011г.
Потребител # 18 267




Еее човк меси от 3 дни се ровя в гоогъл и нищо не намирам по тази тема. Мерси много! biggrin.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

 

RSS Олекотена Версия Сега е: 12:42 - 9.08.2026г.

Калдейта Ком ЕООД - © 2003-. Всички права запазени.