![]() ![]() |
22.12.2008г. в 02:04ч.
Коментар:
#1
|
|
![]() Доктор - уроци ![]() ![]() ![]() ![]() ![]() ![]() Група: Потребители Съобщения: 836 Дата на регистрация: 15.11.2008г. Потребител # 6 111 |
Реших този път да ви покажа нещо по тематично. Тъй или иначе никой не ми чете темите Краен резултат:
final.png ( 4.46 килобайта )
Брой сваляния: 7Да 'сътворим' нашият сървлет 1) Създаваме клас, наследяващ HttpServlet. След като сме решили да броим колко пъти е заредена нашата картинка.. Да! Ще си направим променлива КОД 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 килобайта )
Брой сваляния: 34) Да се върнем на програмирането. Сега ще направим метод, в който ще рисуваме новата картинка. По-късно ще използваме този метод в doGet() 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 - сигурно вече се сещате Идеята на тези изчисления беше да центрирам броя посетители точно под надписа 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> Надявам се да сте научили/намерили нещо полезно
Best regards, Fake User |
|
|
15.01.2012г. в 10:23ч.
Коментар:
#2
|
|
|
Новак ![]() Група: Потребители Съобщения: 9 Дата на регистрация: 7.05.2011г. Потребител # 18 267 |
Еее човк меси от 3 дни се ровя в гоогъл и нищо не намирам по тази тема. Мерси много!
|
|
|
![]() ![]() |