目前Java开发web最流行的就是Spring系列了。比如SpringBoot,SpringCloud,简单易上手。但有时候,我只想有一个很简单的Web服务,简单到没有数据库,这时候用SpringBoot感觉就有点杀鸡用牛刀了。
我们可以用java自带的jdk实现一个简单的WebServer,用Java自带的com.sun.net.httpserver.HttpServer类就可以了。视图渲染我用了freemarker,需要依赖freemarker-2.3.30.jar
包
目录结构如下:
上代码:
package simple_web;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.Version;
import java.io.*;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SimpleWebServer {
private Configuration templateCfg;
public SimpleWebServer(){
Version version = new Version("2.3.0");
templateCfg = new Configuration(version);
templateCfg.setClassForTemplateLoading(this.getClass(), "");
}
public void run(){
try {
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/view", new ViewHandler());
server.createContext("/demo", new DemoHandler());
server.start();
System.out.println("Server running");
System.out.println("Visit: http://localhost:8080/view");
System.out.println("Visit: http://localhost:8080/demo");
System.out.println("Hit return to stop...");
System.in.read();
System.out.println("Stopping server");
server.stop(0);
System.out.println("Server stopped");
} catch (java.io.IOException ioe) {
ioe.printStackTrace(System.err);
}
}
private OutputStream viewTemplate(String name, Object dataModel, OutputStream out){
try {
Template template = templateCfg.getTemplate(name + ".ftl");
template.process(dataModel, new PrintWriter(out));
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return out;
}
class ViewHandler implements HttpHandler{
@Override
public void handle(HttpExchange he) throws IOException {
System.out.println("Im is ViewHandler");
he.sendResponseHeaders(200, 0);
Map<String, Object> dataModel = new HashMap<>();
dataModel.put("username", "张大宝");
dataModel.put("userList", selectUser());
viewTemplate("index", dataModel, he.getResponseBody()).close();
}
private List<User> selectUser(){
List<User> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
User user = new User();
user.setId(i);
user.setLogo("https://avatar.csdnimg.cn/E/9/A/3_ma45115200"+ i +".jpg");
user.setName("小" + i);
user.setSex((byte)( i % 2));
user.setTag("我的忧伤,没人能懂");
list.add(user);
}
return list;
}
}
class DemoHandler implements HttpHandler{
@Override
public void handle(HttpExchange he) throws IOException {
System.out.println("Im is DemoHandler");
he.sendResponseHeaders(200, 0);
OutputStream out = he.getResponseBody();
out.write("Hello Demo".getBytes());
out.close();
}
}
}
package simple_web;
public class User {
private Integer id;
private String logo;
private String name;
private byte sex;
private String tag;
// get set ...
}
然后还需要一个模板文件index.ftl
,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="referrer" content="no-referrer" />
<title>Title</title>
</head>
<style>
.u-tag{
padding: 2px 10px;
background-color: aliceblue;
border-radius: 10%;
}
.u-tag_red{
background-color: darkred;
color: aliceblue;
}
.u-tag_green{
background-color: green;
color: aliceblue;
}
</style>
<body>
<h4>Hello ${username}</h4>
<#-- 这是注释 -->
<table>
<thead>
<tr>
<th>ID</th>
<th>头像</th>
<th>姓名</th>
<th>性别</th>
<th>签名</th>
</tr>
</thead>
<tbody>
<#list userList as user>
<tr>
<td>${user.id}</td>
<td>
<img src="${user.logo}"/>
</td>
<td>${user.name}</td>
<td>
<span class="u-tag <#if (user.sex == 0)> u-tag_green </#if>">
${(user.sex == 0) ? string("男", "女")}
</span>
</td>
<td>${user.tag}</td>
</tr>
</#list>
</tbody>
</table>
</body>
</html>
好了,写个main方法,运行起来。
public static void main(String[] args) throws IOException {
SimpleWebServer server = new SimpleWebServer();
server.run();
}
浏览器也显示出来了数据,这样一个很简单的Web服务就完成啦。