代码实现SpringBoot内置tomcat与SpringMVC功能

1. 什么是SpringBoot

在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot来让你更易上手,更简单快捷地构建Spring应用!
Spring Boot让我们的Spring应用变的更轻量化。比如:你可以仅仅依靠一个Java类来运行一个Spring引用。你也可以打包你的应用为jar并通过使用java -jar来运行你的Spring Web应用。
SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。
SpringMVC是控制层。

Spring Boot的主要优点:
为所有Spring开发者更快的入门
开箱即用,提供各种默认配置来简化项目配置
内嵌式容器简化Web项目
没有冗余代码生成和XML配置的要求

SpringBoot核心原理

基于SpringMVC无配置文件(纯Java)完全注解化+内置tomcat-embed-core实现SpringBoot框架,Main函数启动。
SpringBoot核心快速整合第三方框架原理:Maven继承依赖关系
SpringBoot内嵌入tomcat-embed-core
SpringBoot采用SpringMVC注解版本实现无配置效果

下面将通过代码模拟SpringBoot内置tomcat和无配置整合SpringMVC

2. 内置Tomcat容器

Java提供内置Tomcat容器框架,使用Java语言操作Tomcat容器。
案例: 使用Java语言创建一个Tomcat容器

2.1 Maven依赖

<dependencies>
	<!--Java语言操作tomcat -->
	<dependency>
		<groupId>org.apache.tomcat.embed</groupId>
		<artifactId>tomcat-embed-core</artifactId>
		<version>8.5.16</version>
	</dependency>
	<!-- spring-web -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>5.0.4.RELEASE</version>
		<scope>compile</scope>
	</dependency>
	<!-- spring-mvc -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>5.0.4.RELEASE</version>
		<scope>compile</scope>
	</dependency>
	<!-- tomcat对jsp支持 -->
	<dependency>
		<groupId>org.apache.tomcat</groupId>
		<artifactId>tomcat-jasper</artifactId>
		<version>8.5.16</version>
	</dependency>
</dependencies>

注:在创建SpringBoot项目工程时我们无需自己引用上述倚赖,但SpringBoot利用子父倚赖倚赖关系已经将必需的倚赖进了了封装,可以向上追溯或者直接查看项目所导入的jar你就可以发现上面的倚赖

2.2 创建Servet类

public class IndexServet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.getWriter().print("springboot2.0");
	}
}

2.2 创建Tomcat运行

// 端口号
private static int PORT = 8080;
// 项目名称
private static String CONTEXTPATH = "/test";

public static void main(String[] args) throws LifecycleException {
	// 创建Tomcat服务器
	Tomcat tomcatServer = new Tomcat();
	// 设置Tomcat端口号
	tomcatServer.setPort(PORT);
	tomcatServer.getHost().setAutoDeploy(false);
	// 创建Context上下文
	StandardContext standardContext = new StandardContext();
	standardContext.setPath(CONTEXTPATH);
	standardContext.addLifecycleListener(new FixContextListener());
	// tomcat容器添加standardContext
	tomcatServer.getHost().addChild(standardContext);
	// 创建servlet
	tomcatServer.addServlet(CONTEXTPATH, "IndexServet", new IndexServet());
	// 添加servleturl映射
	standardContext.addServletMappingDecoded("/index", "IndexServet");
	tomcatServer.start();
	System.out.println("tomcat启动...");
	tomcatServer.getServer().await();
}

3. SpringMVC(无配置启动)

3.1 SpringMVC原理回顾

在这里插入图片描述

⑴ 用户发送请求至前端控制器DispatcherServlet
⑵ DispatcherServlet收到请求调用HandlerMapping处理器映射器。
⑶ 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
⑷ DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
⑸ 执行处理器(Controller,也叫后端控制器)。
⑹ Controller执行完成返回ModelAndView
⑺ HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
⑻ DispatcherServlet将ModelAndView传给ViewReslover视图解析器
⑼ ViewReslover解析后返回具体View
⑽ DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
⑾ DispatcherServlet响应用户。

3.2 SpringMVC注解启动方式

DispatcherServlet是Spring MVC的核心,每当应用接受一个HTTP请求,由DispatcherServlet负责将请求分发给应用的其他组件。
在旧版本中,DispatcherServlet之类的servlet一般在web.xml文件中配置,该文件一般会打包进最后的war包种;但是Spring 3引入了注解,我们这节课讲解,如何基于注解配置Spring MVC。

3.3 Maven依赖

<dependencies>
	<!--Java语言操作tomcat -->
	<dependency>
		<groupId>org.apache.tomcat.embed</groupId>
		<artifactId>tomcat-embed-core</artifactId>
		<version>8.5.16</version>
	</dependency>
	<!-- spring-web -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>5.0.4.RELEASE</version>
		<scope>compile</scope>
	</dependency>
	<!-- spring-mvc -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>5.0.4.RELEASE</version>
		<scope>compile</scope>
	</dependency>
	<!-- tomcat对jsp支持 -->
	<dependency>
		<groupId>org.apache.tomcat</groupId>
		<artifactId>tomcat-jasper</artifactId>
		<version>8.5.16</version>
	</dependency>
</dependencies>

3.4 加载SpringMVCDispatcherServlet

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

/**
 * 加载SpringMVCDispatcherServlet
 */
public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

	// 加载根容器
	protected Class<?>[] getRootConfigClasses() {
		// TODO Auto-generated method stub
		return new Class[] { RootConfig.class };
	}

	// 加载SpringMVC容器
	protected Class<?>[] getServletConfigClasses() {

		return new Class[] { WebConfig.class };
	}

	// SpringMVCDispatcherServlet 拦截的请求 /
	protected String[] getServletMappings() {

		return new String[] { "/" };
	}

}

3.5 加载SpringMVC容器

正如可以通过多种方式配置DispatcherServlet一样,也可以通过多种方式启动Spring MVC特性。原来我们一般在xml文件中使用mvc:annotation-driven元素启动注解驱动的Spring MVC特性。

/**
 * @Auther: 洺润Star
 * @Date: 2020/5/1 18:54
 * @Description: SpringMVC容器
 * @EnableWebMvc 开启SpringMVC功能
 * @Configuration 配置
 */
@Configuration
@EnableWebMvc
@ComponentScan("com.test.controller")
public class WebConfig extends WebMvcConfigurerAdapter {

}

3.6 RootConfig容器

/**
 * @Auther: 洺润Star
 * @Date: 2020/5/1 18:57
 * @Description:根容器 扫面路径下的bean
 */
@Configuration
@ComponentScan(basePackages = "com.test")
public class RootConfig {

}

3.7 运行代码

public static void main(String[] args) throws ServletException, LifecycleException {
	start();
}

public static void start() throws ServletException, LifecycleException {

	// 创建Tomcat容器
	Tomcat tomcatServer = new Tomcat();
	// 端口号设置
	tomcatServer.setPort(9090);
	// 读取项目路径
	StandardContext ctx = (StandardContext) tomcatServer.addWebapp("/", new File("src/main").getAbsolutePath());
	// 禁止重新载入
	ctx.setReloadable(false);
	// class文件读取地址
	File additionWebInfClasses = new File("target/classes");
	// 创建WebRoot
	WebResourceRoot resources = new StandardRoot(ctx);
	// tomcat内部读取Class执行
	resources.addPreResources(
			new DirResourceSet(resources, "/WEB-INF/classes", additionWebInfClasses.getAbsolutePath(), "/"));
	tomcatServer.start();
	// 异步等待请求执行
	tomcatServer.getServer().await();

}

3.8 项目添加业务逻辑层

创建Service层

@Service
public class UserService {

	public String index() {
		return "这是我的第一个UserService,哈哈哈";
	}

}

创建Controller


/**
 * @Auther: 洺润Star
 * @Date: 2020/5/1 19:02
 * @Description:
 */
@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping(value = "/user", produces = "text/html;charset=UTF-8")
    public String index() {
        return userService.index();
    }
}

3.9 对JSP页面支持

修改WebConfig创建视图解析器

// 创建SpringMVC视图解析器
@Bean
public ViewResolver viewResolver() {
	InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
	viewResolver.setPrefix("/WEB-INF/views/");
	viewResolver.setSuffix(".jsp");
        //可以在JSP页面中通过${}访问beans
	viewResolver.setExposeContextBeansAsAttributes(true);
	return viewResolver;
}

新增控制器层

/**
 * @Auther: 洺润Star
 * @Date: 2020/5/1 19:07
 * @Description:
 */
@RestController
public class HelloController {
    @RequestMapping(value = "/hello", produces = "text/html;charset=UTF-8")
    public String index() {
        return "hello";
    }
}

在/WEB-INF/views/ 下可以创建一个jsp页面,这样就可以进行访问了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值