1.web 服务器只只专注于接受请求和返回相应,并不涉及具体的业务逻辑。
2.请求转发模型
tcp 端口不管有没有请求,都会一直等着,并一直监听着,等待着请求的到来
3.sevlet
sevlet 是一种规范,约束了 Java 服务器和业务类的通信方式
是一种接口,javax.servlet.Servlet
是一个实现类,实现了 sevlet 接口的实现类
web 服务器通过 sevletRequest 和 sevletResponse 类和 sevlet 进行交互
4.在 framework 模块中加入 tomcat embed 的依赖
// https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-core
compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '8.5.23'
5.web 包中开始写 sever
package cn.chenforcode.web.server;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
public class TomcatServer {
private Tomcat tomcat;
private String[] args;
TomcatServer(String[] args) {
this.args = args;
}
public void startServer() throws LifecycleException {
tomcat = new Tomcat();
tomcat.setPort(6699);
tomcat.start();
Thread awaitThread = new Thread("tomcat_await_thread") {
@Override
public void run() {
TomcatServer.this.tomcat.getServer().await();
}
};
awaitThread.setDaemon(false);
awaitThread.start();
}
}
其中 startServer 方法是启动一个 tomcat 服务器
6.在 miniapplication 中启动一个服务器
public class MiniApplication {
public static void run(Class<?> cls, String[] args) {
System.out.println("Hello Mini-spring!");
TomcatServer tomcatServer = new TomcatServer(args);
try {
tomcatServer.startServer();
} catch (LifecycleException e) {
e.printStackTrace();
}
}
}
7.建立一个 servlet,并实现其 servlet 方法
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
res.getWriter().println("test");
}
8.在服务器中注册 servlet
public void startServer() throws LifecycleException {
tomcat = new Tomcat();
tomcat.setPort(6699);
tomcat.start();
//建立一个容器
Context context = new StandardContext();
context.setPath("");
//增加生命周期监听器
context.addLifecycleListener(new Tomcat.FixContextListener());
//创建servlet
TestServlet testServlet = new TestServlet();
//把servlet加入到tomcat里,并支持异步
Tomcat.addServlet(context, "testServlet",testServlet).setAsyncSupported(true);
//增加servlet的映射
context.addServletMappingDecoded("/test.json", "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();
}
9.重新打包运行,在浏览器中访问/test.json 就能够得到相应的结果。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于