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 就能够得到相应的结果。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于