Java http 服务器上的访客计数器
Visitor counter on Java http server
晚上好,
我发现这个非常基本的 http 服务器是用 Java.
编写的
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class Test {
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
server.createContext("/test", new MyHandler());
server.setExecutor(null); // creates a default executor
server.start();
}
static class MyHandler implements HttpHandler {
@Override
public void handle(HttpExchange t) throws IOException {
String response = "This is the response";
t.sendResponseHeaders(200, response.length());
OutputStream os = t.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
}
现在我正在尝试在网站上添加一个简单的计数器来计算每次访问。我刚刚找到需要 Java EE 库的代码。
像这里这样:
import java.io.*;
import java.sql.Date;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PageHitCounter extends HttpServlet{
private int hitCount;
public void init()
{
// Reset hit counter.
hitCount = 0;
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// Set response content type
response.setContentType("text/html");
// This method executes whenever the servlet is hit
// increment hitCount
hitCount++;
PrintWriter out = response.getWriter();
String title = "Total Number of Hits";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<h2 align=\"center\">" + hitCount + "</h2>\n" +
"</body></html>");
}
public void destroy()
{
// This is optional step but if you like you
// can write hitCount value in your database.
}
}
是否可以使用 Java SE 开发工具包编写此代码?又如何?
如果我理解你的问题,那么是的。最简单的方法可能是在 Handler
中添加一个 counter
。将 counter
添加到您的 response
,然后增加它。像,
static class MyHandler implements HttpHandler {
static int counter = 0;
@Override
public void handle(HttpExchange t) throws IOException {
String response = String.format("This is response %d%n", counter++);
t.sendResponseHeaders(200, response.length());
OutputStream os = t.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
我的建议是不要使用 int,因为它不是线程安全的,而应该使用 AtomicInteger
AtomicInteger atomicInteger = new AtomicInteger(123); // initialize it with a value or empty
int theValue = atomicInteger.get(); // this is how you get it
atomicInteger.addAndGet(1); // to add a value to it, you can also getAndAdd(x)
晚上好, 我发现这个非常基本的 http 服务器是用 Java.
编写的import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class Test {
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
server.createContext("/test", new MyHandler());
server.setExecutor(null); // creates a default executor
server.start();
}
static class MyHandler implements HttpHandler {
@Override
public void handle(HttpExchange t) throws IOException {
String response = "This is the response";
t.sendResponseHeaders(200, response.length());
OutputStream os = t.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
}
现在我正在尝试在网站上添加一个简单的计数器来计算每次访问。我刚刚找到需要 Java EE 库的代码。 像这里这样:
import java.io.*;
import java.sql.Date;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PageHitCounter extends HttpServlet{
private int hitCount;
public void init()
{
// Reset hit counter.
hitCount = 0;
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// Set response content type
response.setContentType("text/html");
// This method executes whenever the servlet is hit
// increment hitCount
hitCount++;
PrintWriter out = response.getWriter();
String title = "Total Number of Hits";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<h2 align=\"center\">" + hitCount + "</h2>\n" +
"</body></html>");
}
public void destroy()
{
// This is optional step but if you like you
// can write hitCount value in your database.
}
}
是否可以使用 Java SE 开发工具包编写此代码?又如何?
如果我理解你的问题,那么是的。最简单的方法可能是在 Handler
中添加一个 counter
。将 counter
添加到您的 response
,然后增加它。像,
static class MyHandler implements HttpHandler {
static int counter = 0;
@Override
public void handle(HttpExchange t) throws IOException {
String response = String.format("This is response %d%n", counter++);
t.sendResponseHeaders(200, response.length());
OutputStream os = t.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
我的建议是不要使用 int,因为它不是线程安全的,而应该使用 AtomicInteger
AtomicInteger atomicInteger = new AtomicInteger(123); // initialize it with a value or empty
int theValue = atomicInteger.get(); // this is how you get it
atomicInteger.addAndGet(1); // to add a value to it, you can also getAndAdd(x)