JavaEE-自定义SSM-编写核心

3.1 解决编写错误

3.1.1 注解

1)MySpringBootApplication
java 复制代码
package com.czxy.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.TYPE)               //只能修饰类
@Retention(RetentionPolicy.RUNTIME)     //策略 运行时(内存)
public @interface MySpringBootApplication {
}
2)MyMapper
java 复制代码
package com.czxy.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.TYPE)               //只能修饰类
@Retention(RetentionPolicy.RUNTIME)     //策略 运行时(内存)
public @interface MyMapper {
}
3)MySelect
java 复制代码
package com.czxy.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.METHOD)              //只能修饰方法
@Retention(RetentionPolicy.RUNTIME)     //策略 运行时(内存)
public @interface MySelect {
    public String value() ;             //注解参数
}
4)MyService
java 复制代码
package com.czxy.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.TYPE)               //只能修饰类
@Retention(RetentionPolicy.RUNTIME)     //策略 运行时(内存)
public @interface MyService {
}
5)MyRestController
java 复制代码
package com.czxy.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.TYPE)               //只能修饰类
@Retention(RetentionPolicy.RUNTIME)     //策略 运行时(内存)
public @interface MyRestController {
}
6)MyRequestMapping
java 复制代码
package com.czxy.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.TYPE)               //只能修饰类
@Retention(RetentionPolicy.RUNTIME)     //策略 运行时(内存)
public @interface MyRequestMapping {

    public String value();              //参数
}
7)MyGetMapping
java 复制代码
package com.czxy.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.METHOD)                     //只能修饰方法
@Retention(RetentionPolicy.RUNTIME)             //策略 运行时(内存)
public @interface MyGetMapping {
//    public String value() default "" ;       //注解参数
}
8)MyPostMapping
java 复制代码
package com.czxy.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.METHOD)                     //只能修饰方法
@Retention(RetentionPolicy.RUNTIME)             //策略 运行时(内存)
public @interface MyPostMapping {
//    public String value() default "" ;       //注解参数
}

3.1.2 spring boot核心类

java 复制代码
package com.czxy.boot;

import com.czxy.annotation.MySpringBootApplication;


public class MySpringApplication {
    /**
     * 整个程序的入口
     * @param appClass
     * @param args
     */
    public static void run(Class appClass, String[] args) {
        // 1)校验启动类是否有 @MySpringBootApplication注解
        boolean hasBootApp = appClass.isAnnotationPresent(MySpringBootApplication.class);
        if(!hasBootApp) {
            throw new RuntimeException(appClass + "没有添加@MySpringBootApplication注解");
        }

        System.out.println("正常运行");
    }
}

3.2 编写tomcat

3.2.1 测试

  • 测试tomcat

    java 复制代码
    package com.czxy;
    
    import org.apache.catalina.Context;
    import org.apache.catalina.LifecycleException;
    import org.apache.catalina.Wrapper;
    import org.apache.catalina.connector.Connector;
    import org.apache.catalina.core.StandardContext;
    import org.apache.catalina.loader.ParallelWebappClassLoader;
    import org.apache.catalina.loader.WebappLoader;
    import org.apache.catalina.startup.Tomcat;
    import org.apache.juli.logging.Log;
    import org.apache.juli.logging.LogFactory;
    
    import java.io.File;
    
    
    public class TestTomcat {
    
        public static void main(String[] args) throws LifecycleException {
    
    //        https://blog.csdn.net/weixin_44061521/article/details/120262084
    
            // 1. 创建tomcat
            Tomcat tomcat = new Tomcat();
    
            // 2. 设置端口号
            tomcat.setPort(8080);
    
            // 3. 设置tomcat的工作目录
            tomcat.setBaseDir(new File("E:/workspaces_2021_quan12_5/mytomcat").getAbsolutePath());
    
            // 4. 确定http请求使用的协议
            Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setThrowOnFailure(true);
            connector.setPort(8080);
    
            // 5. 使用的协议 与 tomcat 绑定
            tomcat.getService().addConnector(connector);
            tomcat.setConnector(connector);
            tomcat.getHost().setAutoDeploy(false);
    
            // 6. 设置上下文 (固定)
            StandardContext context = new StandardContext();
            context.setName("");
            context.setDisplayName("application");
            context.setPath("");
            context.setDocBase("/");
            context.addLifecycleListener(new Tomcat.FixContextListener());
            context.setParentClassLoader(StandardContext.class.getClassLoader());
            context.setCreateUploadTargets(true);
    
            // 7. web应用程序加载器(固定)
            WebappLoader loader = new WebappLoader();
            loader.setLoaderClass(ParallelWebappClassLoader.class.getName());
            loader.setDelegate(true);
            context.setLoader(loader);
    
            // 8. 设置默认Servlet
            addDefaultServlet(context);
    
            // 9. 将上下文对象设置给tomcat
            tomcat.getHost().addChild(context);
    
    //        tomcat.addServlet("/", "dispatcherServlet", new MyDispacherServlet());
            // 10. 启动tomcat
            tomcat.start();
        }
    
    
        private static void addDefaultServlet(Context context) {
            Wrapper defaultServlet = context.createWrapper();
            defaultServlet.setName("default");
    //        defaultServlet.setServletClass("org.apache.catalina.servlets.DefaultServlet");
            defaultServlet.setServletClass("com.czxy.servlet.MyDispacherServlet");
            defaultServlet.addInitParameter("debug", "0");
            defaultServlet.addInitParameter("listings", "false");
            defaultServlet.setLoadOnStartup(1);
            // Otherwise the default location of a Spring DispatcherServlet cannot be set
            defaultServlet.setOverridable(true);
            context.addChild(defaultServlet);
            context.addServletMappingDecoded("/", "default");
        }
    }
  • 自定义前端控制器

    java 复制代码
    package com.czxy.servlet;
    
    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 service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("哈哈,我执行了!");
    
            //返回数据
            response.getWriter().print("6666");
        }
    }
  • 创建文件件

    浏览器测试

    3.2.2 自定义web服务

  • 创建web服务器(再target目录下创建tomcat需要的目录结构 target/mytomcat/webapps

    • 注意:自定义web服务,需修改一个bug,端口号port从yml文件中读取。
    java 复制代码
    package com.czxy.server;
    
    import com.czxy.servlet.MyDispatcherServlet;
    import org.apache.catalina.Context;
    import org.apache.catalina.LifecycleException;
    import org.apache.catalina.Wrapper;
    import org.apache.catalina.connector.Connector;
    import org.apache.catalina.core.StandardContext;
    import org.apache.catalina.loader.ParallelWebappClassLoader;
    import org.apache.catalina.loader.WebappLoader;
    import org.apache.catalina.startup.Tomcat;
    
    import java.io.File;
    import java.io.IOException;
    
    
    public class MyWebServer {
        //tomcat路径
        private File tomcatDir;
    
        private void init() {
            try {
                //1 获得target目录
                String classPath = MyWebServer.class.getClassLoader().getResource("").getPath();
                File target = new File(classPath,"../");
    
                //2 tomcat目录
                tomcatDir = new File(target, "mytomcat");
                if(!tomcatDir.exists()) {
                    tomcatDir.mkdirs();
                }
    
                //3 web程序目录
                File webAppDir = new File(tomcatDir, "webapps");
                if(!webAppDir.exists()) {
                    webAppDir.mkdirs();
                }
    
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
    
        public void start() {
            // 初始化操作,准备tomcat目录
            init();
            //创建tomcat实例
            try {
                Tomcat tomcat = new Tomcat();
                //获得设置的端口号,如果没有,默认8080
                Integer port = 8080;
                tomcat.setPort(port);
    
                //设置工作目录
                tomcat.setBaseDir(tomcatDir.getAbsolutePath());
    
                Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
                connector.setThrowOnFailure(true);
                connector.setPort(port);
                tomcat.getService().addConnector(connector);
                tomcat.setConnector(connector);
                tomcat.getHost().setAutoDeploy(false);
    
                //设置上下文
                StandardContext context = new StandardContext();
                context.setName("");
                context.setDisplayName("application");
                context.setPath("");
                context.setDocBase("/");
                context.addLifecycleListener(new Tomcat.FixContextListener());
                context.setParentClassLoader(StandardContext.class.getClassLoader());
                context.setCreateUploadTargets(true);
    
                //web程序加载器
                WebappLoader loader = new WebappLoader();
                loader.setLoaderClass(ParallelWebappClassLoader.class.getName());
                loader.setDelegate(true);
                context.setLoader(loader);
    
                //设置默认,直接整合spring mvc(DispatcherServlet)
                addDefaultServlet(context);
                tomcat.getHost().addChild(context);
                tomcat.start();
            } catch (LifecycleException e) {
                throw new RuntimeException(e);
            }
        }
    
    
        private static void addDefaultServlet(Context context) {
            Wrapper defaultServlet = context.createWrapper();
            defaultServlet.setName("default");
    //        defaultServlet.setServletClass("org.apache.catalina.servlets.DefaultServlet");
            defaultServlet.setServletClass(MyDispatcherServlet.class.getName());
            defaultServlet.addInitParameter("debug", "0");
            defaultServlet.addInitParameter("listings", "false");
            defaultServlet.setLoadOnStartup(1);
            // Otherwise the default location of a Spring DispatcherServlet cannot be set
            defaultServlet.setOverridable(true);
            context.addChild(defaultServlet);
            context.addServletMappingDecoded("/", "default");
        }
    }
  • 调用web服务(启动tomcat)

java 复制代码
package com.czxy.boot;

import com.czxy.annotation.MySpringBootApplication;
import com.czxy.server.MyWebServer;


public class MySpringApplication {
    /**
     * 整个程序的入口
     * @param appClass
     * @param args
     */
    public static void run(Class appClass, String[] args) {
        // 1)校验启动类是否有 @MySpringBootApplication注解
        boolean hasBootApp = appClass.isAnnotationPresent(MySpringBootApplication.class);
        if(!hasBootApp) {
            throw new RuntimeException(appClass + "没有添加@MySpringBootApplication注解");
        }

        System.out.println("正常运行");
        // 3)启动web服务
        MyWebServer myWebServer = new MyWebServer();
        myWebServer.start();
    }
}
相关推荐
一只小青团1 小时前
Python之面向对象和类
java·开发语言
qq_529835351 小时前
ThreadLocal内存泄漏 强引用vs弱引用
java·开发语言·jvm
落笔画忧愁e1 小时前
扣子Coze飞书多维表插件添加数据记录
java·服务器·飞书
秋千码途4 小时前
小架构step系列08:logback.xml的配置
xml·java·logback
飞翔的佩奇4 小时前
Java项目:基于SSM框架实现的旅游协会管理系统【ssm+B/S架构+源码+数据库+毕业论文】
java·数据库·mysql·毕业设计·ssm·旅游·jsp
时来天地皆同力.4 小时前
Java面试基础:概念
java·开发语言·jvm
Code Warrior4 小时前
【Linux】基础开发工具(3)
linux·服务器
找不到、了5 小时前
Spring的Bean原型模式下的使用
java·spring·原型模式
阿华的代码王国5 小时前
【Android】搭配安卓环境及设备连接
android·java
YuTaoShao5 小时前
【LeetCode 热题 100】141. 环形链表——快慢指针
java·算法·leetcode·链表