上一章节的学习搭建起了基本框架。这一章节开始做一个简单的URL映射。
关于Web服务器,采用SpringBoot的那种方式,直接在框架里面嵌入。因此,首先在上一章节建好的framework下面的build.gradle文件下的dependency里添加一个Tomcat的依赖:
//引入Tomcat依赖
compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '8.5.23'
然后在com.mooc.zbs.web包下面新建几个子包:server,servlet
在servlet包下新建一个类TestServlet(实现Servlet接口):
package com.mooc.zbs.web.servlet;
import javax.servlet.*;
import java.io.IOException;
public class TestServlet implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//输出一句话作为验证即可
res.getWriter().print("Test Servlet URL");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
接着,在server下,新建一个TomcatServer:
package com.mooc.zbs.web.server;
import com.mooc.zbs.web.servlet.TestServlet;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;
public class TomcatServer {
private Tomcat tomcat;
private String[] args;
public TomcatServer(String[] args){
this.args = args;
}
public void startServer() throws LifecycleException {
tomcat = new Tomcat();
//设置Tomcat启动端口
tomcat.setPort(6699);
tomcat.start();
//往Tomcat里面注册一个Servlet
//实例化一个Context
Context context = new StandardContext();
//为context设置路径
context.setPath("");
//生命周期监听器,注册默认
context.addLifecycleListener(new Tomcat.FixContextListener());
//实例化Servlet并注册到context
TestServlet testServlet = new TestServlet();
//并设置支持异步
Tomcat.addServlet(context,"testServlet",testServlet).setAsyncSupported(true);
//Servlet到url的映射
context.addServletMappingDecoded("/testServlet","testServlet");
//context注册到默认的Host容器
tomcat.getHost().addChild(context);
Thread awaitThread = new Thread("tomcat_await_thread"){
@Override
public void run() {
TomcatServer.this.tomcat.getServer().await();
}
};
//设置为非守护线程
awaitThread.setDaemon(false);
awaitThread.start();
}
}
在framework模块下的starter包新建一个MiniApplication类:
package com.mooc.zbs.starter;
import com.mooc.zbs.web.server.TomcatServer;
import org.apache.catalina.LifecycleException;
import java.io.IOException;
public class MiniApplication {
public static void run(Class<?> clazz,String[] args) {
System.out.println("Hello mini-spring!");
TomcatServer tomcatServer = new TomcatServer(args);
try {
tomcatServer.startServer();
} catch (LifecycleException e) {
e.printStackTrace();
}
}
}
在上一章节的Application类下调用MiniApplication:
MiniApplication.run(Application.class,args);
在Terminal窗口打包运行:
gradle clean build
java -jar test/build/lib/test-1.0-SNAPSHOT.jar
运行结果如下图: