从零写一个具有IOC-AOP-MVC功能的框架---学习笔记---10. MVC 结果渲染器的编写

   日期:2020-07-17     浏览:84    评论:0    
核心提示:1. 本章需要完成的内容完成请求处理器接口RequestProcessor的编写完成ResultRender渲染器接口的编写完成DefultResultRender默认渲染器类的编写完成InternalErrorResultRender内部异常渲染器类的编写完成JsonResultRender Json渲染器类的编写完成ResourceNotFoundResultRender 资源未找到时使用的渲染器类编写完成ViewResultRender 页面渲染器类的编写完成DispatcherS

1. 本章需要完成的内容

  1. 完成请求处理器接口RequestProcessor的编写
  2. 完成ResultRender渲染器接口的编写
  3. 完成DefultResultRender默认渲染器类的编写
  4. 完成InternalErrorResultRender内部异常渲染器类的编写
  5. 完成JsonResultRender Json渲染器类的编写
  6. 完成ResourceNotFoundResultRender 资源未找到时使用的渲染器类编写
  7. 完成ViewResultRender 页面渲染器类的编写
  8. 完成DispatcherServlet http请求拦截器的编写
  9. 完成RequestProcessorChain 责任链类的编写

2. 第一部分内容

  1. 该部分完成DispatcherServlet与RequestProcessorChain类的编写

2.1 DispatcherServlet类

2.1.1 需要完成的代码如下:
package com.wuyiccc.helloframework.mvc;

import com.wuyiccc.helloframework.aop.AspectWeaver;
import com.wuyiccc.helloframework.core.BeanContainer;
import com.wuyiccc.helloframework.injection.DependencyInjector;
import com.wuyiccc.helloframework.mvc.processor.RequestProcessor;
import com.wuyiccc.helloframework.mvc.processor.impl.ControllerRequestProcessor;
import com.wuyiccc.helloframework.mvc.processor.impl.JspRequestProcessor;
import com.wuyiccc.helloframework.mvc.processor.impl.PreRequestProcessor;
import com.wuyiccc.helloframework.mvc.processor.impl.StaticResourceRequestProcessor;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;


@WebServlet("

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.myframework.mvc.processor.RequestProcessor;
import org.myframework.mvc.render.DefaultResultRender;
import org.myframework.mvc.render.InternalErrorResultRender;
import org.myframework.mvc.render.ResultRender;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Iterator;


@Data
@Slf4j
public class RequestProcessorChain {

    // 请求处理器迭代器
    private Iterator<RequestProcessor> requestProcessorIterator;

    private HttpServletRequest request;

    private HttpServletResponse response;

    // http请求方法
    private String requestMethod;

    // http请求路径
    private String requestPath;

    // http响应状态码
    private int responseCode;

    // 请求结果渲染器
    private ResultRender resultRender;


    public RequestProcessorChain(Iterator<RequestProcessor> requestProcessorIterator, HttpServletRequest request, HttpServletResponse response) {
        this.requestProcessorIterator = requestProcessorIterator;
        this.request = request;
        this.response = response;
        this.requestMethod = request.getMethod();
        this.requestPath = request.getPathInfo();
        this.responseCode = HttpServletResponse.SC_OK;
    }

    
    public void doRequestProcessorChain() {
        // 1. 通过迭代器遍历注册的请求处理器实现类列表
        try {
            while (requestProcessorIterator.hasNext()) {
                // 2. 知道某个请求处理器执行后返回为false为止
                if (!requestProcessorIterator.next().process(this)) {
                    break;
                }
            }
        } catch (Exception e) {
            // 3. 期间如果出现异常,则交给内部异常渲染器处理
            this.resultRender = new InternalErrorResultRender(e.getMessage());
            log.error("doRequestProcessorChain error: ", e);
        }

    }


    
    public void doRender() {
        // 1. 如果请求处理器实现类均未选择合适的渲染器,则使用默认的
        if (this.resultRender == null) {
            this.resultRender = new DefaultResultRender();
        }
        // 2. 调用渲染器的render方法对结果进行渲染
        try {
            this.resultRender.render(this);
        } catch (Exception e) {
            log.error("doRender error: ", e);
            throw new RuntimeException(e);
        }

    }
}


2.2.2 RequestProcessorChain相关代码讲解如下:

3. 第二部分需要完成的内容: 结果渲染器的编写

3.1 DefaultResultRender类的编写及讲解:

3.2 InternalErrorResultRender类的编写及讲解:

3.3 JsonResultRender类的编写及讲解:

3.4 ResourceNotFoundResultRender类的编写及讲解:

3.5 ViewResultRender类的编写及讲解:


github地址:https://github.com/wuyiccc/helloframework/

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服