自定义MVC框架

1. 手写MVC框架之SpringMVC原理回顾

在这里插入图片描述

2. 手写MVC框架之注解开发

创建一个自定义Servlet

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


public class MyDispatcherServlet extends HttpServlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }


}


web.xml


<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>


  <servlet>
    <servlet-name>lagoumvc</servlet-name>
    <servlet-class>com.lagou.mvcframework.MyDispatcherServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>lagoumvc</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>


</web-app>


@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAutowired {
    String value() default "";
}

import java.lang.annotation.*;

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyController {
    String value() default "";
}

import java.lang.annotation.*;

@Documented
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyRequestMapping {
    String value() default  "";
}
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyService {
    String value() default "";
}
3. 手写MVC框架之流程结构开发

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        // 1 、加载配置文件 获取一些配置的信息,如包扫描的路径
             // 这里为了简单 使用 将 配置写在 properties 文件中

        // 2、扫描相关的类,扫描注解

        // 3、 初始化bean对象 (实现ioc容器,基于注解)

        // 4、实现依赖注入

        // 5、 构造一个HandlerMapping ,将配置好的url 和 Method 建立映射关系

        System.out.println("my mvc build successful!!");

    }

4. 手写MVC框架之doLoadConfig开发
  <servlet>
    <servlet-name>lagoumvc</servlet-name>
    <servlet-class>com.lagou.mvcframework.MyDispatcherServlet</servlet-class>

    <init-param>
      <param-name>contextConfigLocation</param-name>
      <!-- 这里不能 使用 classpath:  暂时 不做 classpath 的处理 -->
      <param-value>servlet.properties</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>lagoumvc</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>



    // 配置一个
    private Properties properties = new Properties();
    
    private void doLoadConfig(String contextConfigLocation) {

        InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(contextConfigLocation);

        try {
            properties.load(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

5. 手写MVC框架之doScan扫描类

    //缓存扫描到的类 全限定名
    private List<String> classNames = new ArrayList<>();

    private void doScan(String scanPackage) {

        String path =Thread.currentThread().getContextClassLoader().getResource("").getPath()+ scanPackage.replace("\\.","/");

        File pack = new File(path);

        File[] files = pack.listFiles();

        for (File file : files) {
            // 如果是文件夹 递归
            if(file.isDirectory()){
                doScan(scanPackage + file.getName());

            }else if(file.getName().endsWith(".class")){
                String className = scanPackage + "." +file.getName().replaceAll(".class","");
                classNames.add(className);
            }

        }


    }


6. 手写MVC框架之doInstance实例化
public interface DemoService {

    String get(String name);

}

import com.lagou.annotaiton.MyService;
import com.lagou.service.DemoService;

@MyService
public class DemoServiceImpl implements DemoService {
    @Override
    public String get(String name) {

        System.out.println(name);

        return "serviceimpl --- " +name ;
    }
}

在这里插入图片描述
把整个方法 try catch

7. 手写MVC框架之doAutowird实例化

在这里插入图片描述
在这里插入图片描述

8. 手写MVC框架之initHandleMapping实例化

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


private void initHandleMapping() {

        if(ioc.isEmpty()) return;

        // 维护 ioc 容器类之间的关系
        try{
            for ( Map.Entry<String,Object> entry : ioc.entrySet()){

                Class<?> aClass = entry.getValue().getClass();

                // 判断是否 ioc容器是否 包含 MyRequestMapping 注解
                if ( aClass.isAnnotationPresent(MyRequestMapping.class) ){
                    MyRequestMapping annotation = aClass.getAnnotation(MyRequestMapping.class);
                    String baseUrl = annotation.value();

                    Method[] methods = aClass.getMethods();

                    for (Method method : methods) {
                        if (method.isAnnotationPresent(MyRequestMapping.class)){

                            MyRequestMapping methodAnnotation = method.getAnnotation(MyRequestMapping.class);

                            String methodUrl = methodAnnotation.value();

                            String url = baseUrl + methodUrl;
                            
                            handleMapping.put(url,method);
                            
                        }
                        
                    }


                }

            }
        }catch (Exception e){
            e.printStackTrace();
        }


    }


9. 手写MVC框架之初始化流程初步测试

在这里插入图片描述
在这里插入图片描述

10. 手写MVC框架之initHandleMapping问题分析

在这里插入图片描述

11. 手写MVC框架之Handle封装引入

在这里插入图片描述

在这里插入图片描述

12. 手写MVC框架之initHandleMapping改造

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

13. 手写MVC框架之请求处理开发

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

14. 手写MVC框架之整体测试

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值