【计算机是如何通信 四】Web服务器/Severlet/DispatcherServlet/Controller

web服务器

web服务器从字面上理解:是用于存储web网站程序的服务器

WebServer做了哪些事儿?

当客户端(可以是浏览器、也可以是postman等工具)发送请求给服务器后,服务器会调用并执行对应的逻辑代码进行请求处理。逻辑代码是由程序员自己编写然后放进服务器进行运行,然后讲运行后的结果返回给客户端。那么服务器需要处理两件事情:

  • 1、处理网络连接
  • 2、找到我要寻找的资源(无论是程序还是其他网页资源)
  • 3、将找到的东西返回给用户

处理网络连接这里就不重点阐述,默认他能够接受并处理http协议栈的请求。

这里的资源在网上一般叫web资源:

web资源按照实现的技术和呈现的效果的不同,又分为静态资源和动态资源两种
静态资源:
html,css,js,txt,mp4视频,jpg图片…
动态资源:
JSP页面,Servlet程序

对于静态资源比较好办,直接返回就好了。但是对于动态资源比如代码如java代码,我必须找到这个代码的class文件,还需要根据请求找到代码从哪里开始运行。在本地我们直接运行main方法即可启动程序执行java代码,但是在web应用中我们不可能每次来个请求,我都去点一下main方法去执行相应的代码。

        所以聪明的程序员们写了一个根据用户请求来调用相应逻辑代码的容器(对象),执行完相应逻辑后,java主线程并没有结束,而是在那里等待用户请求。这个容器就叫做服务器,每个请求的过程就是把程序员自己些的代码放入这个服务器执行并相应的过程。可是这个容器要能跑java代码的话,那也就必须要按照jvm规范去实现。那么服务器又如何知道去应该调用那个类和哪个方法来处呢?也就是服务器怎么才能认识程序员执行的代码。由于java的多态的性质,程序员写的代码只要和服务器共同实现一个接口。只要将程序员写的这个对象传入服务器,就可以直接执行这个代码。而这个技术就叫Servlet,只要程序员的请求都去实现servlet接口,请求的时候传给服务器容器,就去找这个实例对象中的一个service方法,再由service方法根据请求信息去找到对应的业务逻辑执行。而如tomcat服务器就是一种这样的服务器实现。

用户访问页面过程:

  1. 用户通过点击链接或者直接输入URL访问Servlet。
  2. Web服务器接收到请求后,交给Servlet容器。
  3. Servlet容器通过反射实例化Servlet。
  4. 调用Servlet特定方法对请求进行处理,并且产生一个响应。
  5. 响应由Servlet容器返回给Web容器。
  6. Web容器包装这个响应,以HTTP响应的形式发送给浏览器。

下面看个具体实现 

Spring MVC (DispatcherServlet)请求处理流程

 从servlet的doService开始:

DispatcherServlet中的 doService();




    /**
     * Exposes the DispatcherServlet-specific request attributes and delegates to {@link #doDispatch}
     * for the actual dispatching.
     */
     /*
     翻译:暴露(个人理解是讲参数取出,或者传入新的参数)请求参数并指派(传递)给 doDispatch() 方法
     目的: 为了实际调度(处理请求)
     个人理解: 即对request进行预加工,设置默认属性,然后将 request,response 传入 doDispatch() 方法,对请求进行处理
     */
    @Override
    protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
        if (logger.isDebugEnabled()) {
            String resumed = WebAsyncUtils.getAsyncManager(request).hasConcurrentResult() ? " resumed" : "";
            logger.debug("DispatcherServlet with name '" + getServletName() + "'" + resumed +
                    " processing " + request.getMethod() + " request for [" + getRequestUri(request) + "]");
        }

        // Keep a snapshot of the request attributes in case of an include,
        // to be able to restore the original attributes after the include.
        Map<String, Object> attributesSnapshot = null;
        if (WebUtils.isIncludeRequest(request)) {
            attributesSnapshot = new HashMap<String, Object>();
            Enumeration<?> attrNames = request.getAttributeNames();
            while (attrNames.hasMoreElements()) {
                String attrName = (String) attrNames.nextElement();
                if (this.cleanupAfterInclude || attrName.startsWith("org.springframework.web.servlet")) {
  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值