美文网首页互联网科技Java 杂谈Java
纯手写SpringBoot框架之注解方式启动SpringMVC容

纯手写SpringBoot框架之注解方式启动SpringMVC容

作者: cd4bd3aa39ec | 来源:发表于2019-06-24 20:47 被阅读0次

    使用Java语言创建Tomcat容器,并且通过Tomcat执行Servlet,接下来,将会使用Java语言在SpringBoot创建内置Tomcat,使用注解方式启动SpringMVC容器。

    代码实现。
    1.pom.xml文件,需要依赖的jar包。

    <dependencies>
            <!--Java语言操作Tomcat-->
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
                <version>8.5.23</version>
            </dependency>
            <!--tomcat对jsp的支持-->
            <dependency>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jasper</artifactId>
                <version>7.0.47</version>
            </dependency>
            <!--spring-web-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>5.0.8.RELEASE</version>
            </dependency>
            <!--spring-webmvc-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.0.8.RELEASE</version>
            </dependency>
        </dependencies>
    

    2.配置SpringMVC、Spring、DispatcherServlet的初始化类:

    /**
     * 加载springmvc====dispatcherservlet
     */
    public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
        //加载根配置信息 spring核心
        protected Class<?>[] getRootConfigClasses() {
            return new Class[0];
        }
        //springmvc 加载配置信息
        protected Class<?>[] getServletConfigClasses() {
            return new Class[]{WebConfig.class};
        }
        //springmvc拦截的url映射,拦截所有请求
        protected String[] getServletMappings() {
            return new String[]{"/"};//拦截所有请求
        }
    }
    

    AbstractAnnotationConfigDispatcherServletInitializer这个类负责"初始化Spring容器、SpringMVC容器、配置DispatcherServlet"。

    • getRootConfigClasses()方法用于获取Spring应用容器的配置文件,这里我们给定预先定义的RootConfig.class;
    • getServletConfigClasses负责获取Spring MVC应用容器,这里传入预先定义好的WebConfig.class;
    • getServletMappings()方法负责指定需要由DispatcherServlet映射的路径,这里给定的是"/",意思是由DispatcherServlet处理所有向该应用发起的请求。

    SpringMVC配置,加载SpringMVC容器。这里的@Configuration相当于springmvc.xml配置文件;@ComponentScan(basePackages = "com.jiuyue.controller")相当于配置文件sringmvc.xml的扫描controler应该还有印象吧;@EnableWebMvc则是开启SpringMVC功能。

    /**
     * SpringMVC配置信息
     */
    @Configuration  //相当于配置文件springmvc.xml
    @EnableWebMvc //开启SpringMVC功能
    @ComponentScan(basePackages = "com.jiuyue.controller")//扫springMVC的
    public class WebConfig extends WebMvcConfigurerAdapter {
        //配置视图转换器
    }
    

    根配置,加载Spring容器。

    /**
     * 根配置
     */
    @Configuration
    @ComponentScan(basePackages = "com.jiuyue")//扫整个spring项目的
    public class RootConfig {
    }
    

    3.启动类

    public class APP {
        public static void main(String[] args) throws ServletException, LifecycleException {
            //使用Java内置tomcat运行SpringMVC框架
            //原理:tomcat加载到SpringMVC注解启动方式,就会创建SpringMVC容器
            start();
        }
        public static void start() throws LifecycleException, ServletException {
            //创建tomcat服务器
            Tomcat tomcatServer = new Tomcat();
            //设置port
            tomcatServer.setPort(8085);
            //读取项目路径,'/'可以加载静态资源
            StandardContext ctx = (StandardContext) tomcatServer.addWebapp("/", new File("src/main").getAbsolutePath());
            //禁止重新载入
            ctx.setReloadable(false);
            //class文件读取地址
            File addtionWebInfoClasses = new File("target/classes");
            //创建WebRoot
            WebResourceRoot resources = new StandardRoot(ctx);
            //tomcat内部读取class文件进行执行
            //内部虚拟Tomcat空间
            resources.addPreResources(new DirResourceSet(resources,"/WEB-INF/classes",addtionWebInfoClasses.getAbsolutePath(),"/"));
            tomcatServer.start();
            System.out.println("Java语言创建Tomcat启动成功");
            //异步进行接收请求
            tomcatServer.getServer().await();
    
        }
    }
    

    controller类

    @Controller
    public class IndexController {
        @RequestMapping(value = "/index",produces = "text/html;charset=UTF-8")
        @ResponseBody
        public String index(){
            return "纯手写Java语言实现SpringBoot注解启动SpringMVC容器";
        }
    }
    

    访问效果图

    配置视图解析器

    直接下WebConfig配置类中配置就可以,WebConfig就相当于springmvc.xml配置文件,前面我们在里面配置了扫包与开启springMVC功能,接下来就在下面继续配置视图解析器。

    @Configuration  //相当与配置文件
    @EnableWebMvc //开启SpringMVC功能
    @ComponentScan(basePackages = "com.jiuyue.controller")//扫springMVC的
    public class WebConfig extends WebMvcConfigurerAdapter {
        //配置视图转换器
        //SpringMVC视图解析器
        @Bean
        public ViewResolver viewResolver(){
            InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
            viewResolver.setPrefix("/WEB-INF/jsp/");
            viewResolver.setSuffix(".jsp");
            //可以在JSP页面中通过${}访问bean
            viewResolver.setExposeContextBeansAsAttributes(true);
            return viewResolver;
        }
    }
    

    JspController控制器类

    @Controller
    public class JspController {
        @RequestMapping(value = "/jspIndex")
        public String jspIndex(){
            return "jspIndex";
        }
    }
    

    WEB-INF/jsp目录

    访问jspIndex返回jsp页面

    业务逻辑层

    将根配置,配置到初始化类

    /**
     * 根配置
     */
    @Configuration
    @ComponentScan(basePackages = "com.jiuyue")//扫整个spring项目的
    public class RootConfig {
    }
    

    public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
        //加载根配置信息 spring核心
        protected Class<?>[] getRootConfigClasses() {
            return new Class[]{RootConfig.class};
        }
        //springmvc 加载配置信息
        protected Class<?>[] getServletConfigClasses() {
            return new Class[]{WebConfig.class};
        }
        //springmvc拦截的url映射,拦截所有请求
        protected String[] getServletMappings() {
            return new String[]{"/"};//拦截所有请求
        }
    }
    

    Service类

    @Service
    public class IndexService {
        public String index(){
            return "纯手写Java语言实现SpringBoot注解启动SpringMVC容器";
        }
    }
    

    控制器类

    
    

    如果文章有错的地方欢迎指正,大家互相交流。

    相关文章

      网友评论

        本文标题:纯手写SpringBoot框架之注解方式启动SpringMVC容

        本文链接:https://www.haomeiwen.com/subject/pedaqctx.html