之前学习Java EE的时候,做的项目都是部署在Tomcat上面,配置web.xml(小毛驴),然后启动Tomcat,通过浏览器输入URL去访问,当时其实真的不懂好多东西,尤其是不懂request、和response这两个对象是谁创建的,为什么继承了HttpServlet,重写service方法就可以用,今天手写了一遍,豁然开朗,可以说学的更明白了。
今天一天,每一步都敲了一遍,虽然不能脱离老师的视频,但是自己理解了思路,我觉得学编程最重要的是理解,思路一定要清晰,不是打字,照着敲10遍,不理解原理也没有用。
手写“假汤姆猫”的步骤:
1、首先是Socket,用于通信,基于TCP,使用io流,分C/S(客户端和服务器),B/S(浏览器和服务器),C/S就是在客户端创建Socket对象,服务器端常见ServerSocket,调用accpet()监听
我们手写服务器的是B/S模式
当一个浏览器,URL地址栏输入IP地址+端口号会发生,会发生什么呢?
虽然浏览器没有显示内容,但是控制台有请求的信息
我们在看通过浏览器提交表单访问
我之前都不知道还有这种操作,原谅我孤陋寡闻了。。。。
步入正题:
通过在浏览器URL地址栏输入一个连接,是怎么访问Tomcat项目上面的项目呢?
1、web.xml(小毛驴),配置了一个个的Servlet的信息,
我们通过在URL地址栏输入的/log之类的东西,就能找到Servlet,那么是怎么做到创建对象的呢?
原来,使用DOM4J解析XML,就可以得到web.xml的servlet的信息,浏览器的请求我们可以通过字节输入流得到,然后在请求字符串中得到相应的我们需要的信息。
这样,知道了对应servlet的路径,我们就可以通过反射创建servlet了
然后,我们把请求的信息,封装到一个叫做request的类中存储,是不是似曾相似的,没错,就是我们一直用servlet的那个,还有响应的信息,封装到response中
再谈servlet类,它有一个所有servlet的父类
它里面的sevice方法,doGet,doPost方法,我们一直使用,都没有发现原来是这种操作。
基于每个请求和响应都是会有很多人同时使用的,一个服务器不可能只有一个人访问,所以我们使用了多线程,有一个线程类
import java.io.IOException;
import java.net.Socket;
import com.chenpeng.servlet.Servlet;
import com.chenpeng.util.IOCloseUtil;
/**
* 一个请求与响应就是一个Dispatcher,就是一个线程
*
* @author chenpeng
*
*/
public class Dispatcher implements Runnable {
private Request req;
private Response rep;
private Socket client;
private int code = 200;// 状态码
// 构造方法初始化
public Dispatcher(Socket client) {
this.client = client;
try {
req = new Request(this.client.getInputStream());
rep = new Response(this.client.getOutputStream());
} catch (IOException e) {
// 异常
code = 500;
return;
}
}
@Override
public void run() {
//根据不同的url创建指定的Servlet对象
System.out.println(req.getUrl());
Servlet servlet = WebApp.getServlet(req.getUrl());
if(servlet==null) {
this.code=404;
}else {
//调用相应的Servlet中的service方法
try {
servlet.service(req, rep);
} catch (Exception e) {
this.code=500;
}
}
//将响应结果推送到客户机的浏览器
rep.pushToClient(code);
//关闭流
IOCloseUtil.closeAll(client);
}
}
然后,服务器要一直开着,因为不可能只有一个人来访问
使用while循环
对了,还有一点,当我们向服务器发送请求的时候
每次我们向浏览器发送自己的登录请求的时候,浏览器还会去发送一个ico的小图标请求,而我们产生上面的问题的原因就是没有在web.xml中配置这个请求的servlet,所以就报错,解决方式为:配置一下就行了
描述的不是太清楚,以后再补充吧,附上代码代码pan.baidu.com
提取码:434f