Web interface for java application
-------------- WebInterface.java ---------------
import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;
import java.nio.charset.*;
import com.sun.net.httpserver.*;
public class WebInterface {
String appRootPath;
public static void main(String args[]) { new WebInterface(args); }
WebInterface(String argv[]) {
final String hostname = "";
final int port = 8000;
appRootPath = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
if (getClass().getResource("/" + getClass().getName() + ".class").toString().startsWith("jar:")) {
appRootPath = appRootPath.substring(0, appRootPath.lastIndexOf("/") + 1);
}
try {
HttpServer server = HttpServer.create(new InetSocketAddress(hostname, port), 0);
HttpContext context = server.createContext("/", new MyHandler());
//server.setExecutor(java.util.concurrent.Executors.newFixedThreadPool(5));
server.start();
System.out.println("http://" + server.getAddress().getHostName() + ":" + server.getAddress().getPort());
System.out.println("^C to exit");
} catch (Exception e) { e.printStackTrace(); }
}
class MyHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
exchange.getResponseHeaders().set("Content-Type", "text/html; charset=utf-8");
String query = exchange.getRequestURI().getRawQuery();
String s;
if (query == null || query.isEmpty()) {
s = htmlMain();
} else {
String url = urlDecode(query);
String path;
if (url.equals(".")) {
path = appRootPath;
} else {
path = url;
}
s = htmlFileList(path);
}
byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
exchange.sendResponseHeaders(200, bytes.length);
try (OutputStream os = exchange.getResponseBody()) {
os.write(bytes);
}
}
} // End class MyHandler
String htmlMain() {
StringBuilder sb = new StringBuilder();
sb.append("<head>\n")
.append(" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n")
.append(" <script type=\"text/javascript\">\n")
.append(" function f1(p1) {\n")
.append(" xhttp = new XMLHttpRequest();\n")
.append(" xhttp.onreadystatechange = function() {\n")
.append(" if (xhttp.readyState == 4 && xhttp.status == 200) document.getElementById(\"div1\").innerHTML = xhttp.responseText;\n")
.append(" };\n")
.append(" xhttp.open(\"GET\", \"?\" + p1, true);\n")
.append(" xhttp.send();\n")
.append(" }\n")
.append(" window.onload = f1('").append(urlEncode(".")).append("');\n")
.append(" </script>\n")
.append("</head>\n")
.append("<body bgcolor=\"#FEFEFE\" style=\"font-size: 14pt;\">\n")
.append(" <div id=\"div1\" style=\"margin: 20px;\"></div>\n")
.append("</body>\n");
return sb.toString();
}
String htmlFileList(String path) {
SimpleDateFormat dateFormat = new SimpleDateFormat();
NumberFormat numberFormat = NumberFormat.getIntegerInstance();
File file = new File(path);
while (!file.exists() || file.isFile()) {
file = file.getParentFile();
if (file == null) return "<p>Wrong path</p>";
}
StringBuilder sb = new StringBuilder();
sb.append("<p style=\"font-size: 20pt;\">Index of "+htmlEncode(file.getPath())+"</p>\n");
sb.append("<table width=\"70%\"><col width=\"60%\"><col width=\"25%\"><col width=\"15%\">\n");
sb.append(" <tr>\n");
sb.append(" <th style=\"border-bottom: thin solid black;\">Name</td>\n");
sb.append(" <th style=\"border-bottom: thin solid black;\">Last modified</td>\n");
sb.append(" <th style=\"border-bottom: thin solid black;\">Size</td>\n");
sb.append(" </tr>\n");
File parent = file.getParentFile();
if (parent != null) {
sb.append(" <tr><td><a href=\"javascript:f1('"+urlEncode(parent.getPath())+"');\">..</a><br></td><td></td><td></td>\n");
}
File[] files = file.listFiles();
if (files != null && files.length > 0) {
Arrays.sort(files, (f1, f2) -> {
return f1.isDirectory() == f2.isDirectory() ?
f1.getName().compareToIgnoreCase(f2.getName()) :
f1.isDirectory() ? -1 : 1;
});
for (File childFile : files) {
String fln = childFile.getName();
String s1, s2, s3;
if (childFile.isFile()) {
s1 = htmlEncode(fln);
s2 = htmlEncode(dateFormat.format(new Date(childFile.lastModified())));
s3 = htmlEncode(numberFormat.format(childFile.length()));
} else {
s1 = "<a href=\"javascript:f1('"+urlEncode(childFile.getPath())+"');\">"+htmlEncode(fln)+"/</a>";
s2 = s3 = "";
}
sb.append(" <tr>\n");
sb.append(" <td>").append(s1).append("</td>\n");
sb.append(" <td>").append(s2).append("</td>\n");
sb.append(" <td align=\"right\">").append(s3).append("</td>\n");
sb.append(" </tr>\n");
}
}
sb.append("</table>\n");
return sb.toString();
}
String htmlEncode(String text) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
switch(c) {
case '&': sb.append("&"); break;
case '<': sb.append("<"); break;
case '>': sb.append(">"); break;
case '\"': sb.append("""); break;
case '\'': sb.append("'"); break;
default:
if(c > 126) sb.append("&#").append((int)c).append(';');
else sb.append(c);
}
}
return sb.toString();
}
String urlEncode(String url) {
try {
return new String(Base64.getUrlEncoder().encode(url.getBytes(StandardCharsets.UTF_8)));
} catch (Exception e) { return ""; }
}
String urlDecode(String txt) {
try {
return new String(Base64.getUrlDecoder().decode(txt), StandardCharsets.UTF_8);
} catch (Exception e) { return ""; }
}
}