纯手写SpringMVC到SpringBoot框架项目实战
引言
Spring Boot其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。
通过这种方式,springboot是一个快速整合第三方框架的,简化了xml的配置,项目中再也不包含web.xml文件了,完全使用注解来完成操作的,并且内部自带tomcat启动。直接使用jar文件运行即可。
好了大概了解了springboot有啥用处,本章节主要目的就是仿造一个springboot整合jsp的小实战。下面开始代码演示了。
1.导入相关依赖
创建项目之后需要引入tomcat,springmvc,spring-web,jsp相关的jar包。
代码如下:
<!-- tomcat相关jar -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.5.34</version>
</dependency>
<!-- tomcat对jsp支持 -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<version>8.5.16</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.10.RELEASE</version>
<scope>compile</scope>
</dependency>
<!-- springmvc相关jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.10.RELEASE</version>
<scope>compile</scope>
</dependency>
2.加载spring mvc的相关配置信息
需要创建一个springmvc相关配置类继承WebMvcConfigurationSupport ,这里只配置一个springmvc视图解析器。
代码如下:
//表示这是一个配置类,配置<beans></beans>
@Configuration
//表示配置视图解析器,开启注解的相关配置,以及<bean></bean>等等。
@EnableWebMvc
//表示包扫描
@ComponentScan(basePackages = {"springboot.controller"})
public class WebConfig extends WebMvcConfigurationSupport {
/**
* 配置springMVC视图解析器
*/
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
//配置前缀
viewResolver.setPrefix("/WEB-INF/views/");
//配置后缀
viewResolver.setSuffix(".jsp");
//可以在jsp页面中通过${}访问beans
viewResolver.setExposeContextBeansAsAttributes(true);
return viewResolver;
}
}
@Configuration:表示这是一个配置类,配置<beans></beans>。
@EnableWebMvc:开启注解的相关配置(配置视图解析器,以及<bean></bean>)等等。
@ComponentScan:表示包扫描。
viewResolver.setExposeContextBeansAsAttributes(true):jsp页面可以使用el表达式。
3.加载spring容器相关配置信息
创建一个SpringBeanScanConfig配置类,这个类主要是扫描service和dao层的,代码如下:
//表示配置类
@Configuration
//如果写了dao层,那么这里也需要扫描一下dao层
@ComponentScan("springboot.service")
public class SpringBeanScanConfig{
}
这个类目前什么都不需要做。
4.加载springMVC的dispatcherservlet
创建一个加载SpringMVC的DispatcherServlet的类。
代码如下:
public class DispatcherServletWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* 加载spring容器配置信息
* @return
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {Service_DaoConfig.class};
}
/**
* 加载springmvc配置信息
* @return
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
/**
* springmvc映射 拦截url所有请求"/"
* @return
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
解释:
getRootConfigClasses():表示加载spring容器配置信息
getServletConfigClasses():表示加载springmvc配置信息
getServletMappings():表示springmvc映射 拦截url所有请求"/"
下面代码就容易理解了。
5.service层
在service层创建一个IndexService业务类
代码如下:
@Service
public class IndexService {
public String show() {
return "我是service层";
}
}
controller层
代码如下:
@Controller
public class IndexContrller {
@Autowired
private IndexService indexService;
/**
* value:访问地址
* produces:解决乱码问题
* @return
*
*/
@RequestMapping(value = "/index1", produces = "text/html;charset=UTF-8")
@ResponseBody
public String index1() {
return "手写springboot。。。";
}
@RequestMapping(value = "/index2", produces = "text/html;charset=UTF-8")
public String index2(Model model) {
String str = indexService.show();
model.addAttribute("str",str);//返回到jsp页面显示数据
return "springboot";
}
}
这里我们写了2个方法,index1()方法是返回json字符串形式,index2是跳转jsp页面并且带了一个str参数返回在jsp页面显示的。
7.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>springboot</title>
</head>
<body>
<h1>这是一个手写的springboot框架</h1>
这里显示后台返回的数据为:【${str}】
</body>
</html>
${str}:这个表示后台带了一个str参数返回到jsp页面的,值应该为【我是service层】
8.启动类
这里就直接贴代码了,注释都写在代码中了。
代码如下:
public class SpringBootApp {
public static void main(String[] args) throws LifecycleException, ServletException {
// 创建Tomcat容器对象
Tomcat tomcatServer = new Tomcat();
// 设置端口号
tomcatServer.setPort(8080);
// 读取项目路径 加载静态资源
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执行(/WEB-INF/classes虚拟出来的路劲)
resources.addPreResources(
new DirResourceSet(resources, "/WEB-INF/classes", additionWebInfClasses.getAbsolutePath(), "/"));
tomcatServer.start();
// 异步等待请求执行
tomcatServer.getServer().await();
}
}
9.测试结果
启动程序看控制台显示加载情况:

以上创建的Service_DaoConfig和WebConfig2个配置类都加载成功。
输入地址:http://localhost:8080/index1显示为:“手写springboot。。。”
如图:

输入地址:http://localhost:8080/index2显示为:“这是一个手写的springboot框架 这里显示后台返回的数据为:【我是service层】”
如图:

总结
springboot主要特点为:
1. 创建独立的Spring应用程序
2. 嵌入的Tomcat,无需部署WAR文件
3. 简化Maven配置
4. 自动配置Spring
5. 提供生产就绪型功能,如指标,健康检查和外部配置
6. 绝对没有代码生成并且对XML也没有配置要求
纯手写SpringMVC到SpringBoot框架项目实战的更多相关文章
- 纯手写SpringMVC框架,用注解实现springmvc过程
闲话不多说,直接上代码! 1.第一步,首先搭建如下架构,其中,annotation中放置自己编写的注解,主要包括service controller qualifier RequestMapping ...
- 纯手写SpringMVC架构,用注解实现springmvc过程
1.第一步,首先搭建如下架构,其中,annotation中放置自己编写的注解,主要包括service controller qualifier RequestMapping 第二步:完成对应的anno ...
- 手写一个类SpringBoot的HTTP框架:几十行代码基于Netty搭建一个 HTTP Server
本文已经收录进 : https://github.com/Snailclimb/netty-practical-tutorial (Netty 从入门到实战:手写 HTTP Server+RPC 框架 ...
- (二)springMvc原理和手写springMvc框架
我们从两个方面了解springmvc执行原理,首先我们去熟悉springmvc执行的过程,然后知道原理后通过手写springmvc去深入了解代码中执行过程. (一)SpringMVC流程图 (二)Sp ...
- 手写SpringMVC 框架
手写SpringMVC框架 细嗅蔷薇 心有猛虎 背景:Spring 想必大家都听说过,可能现在更多流行的是Spring Boot 和Spring Cloud 框架:但是SpringMVC 作为一款实现 ...
- 手写SpringMVC框架(二)-------结构开发设计
续接前文, 手写SpringMVC框架(一)项目搭建 本节我们来开始手写SpringMVC框架的第二阶段:结构开发设计. 新建一个空的springmvc.properties, 里面写我们要扫描的包名 ...
- springmvc 动态代理 JDK实现与模拟JDK纯手写实现。
首先明白 动态代理和静态代理的区别: 静态代理:①持有被代理类的引用 ② 代理类一开始就被加载到内存中了(非常重要) 动态代理:JDK中的动态代理中的代理类是动态生成的.并且生成的动态代理类为$Pr ...
- 手写SpringMVC框架(三)-------具体方法的实现
续接前文 手写SpringMVC框架(二)结构开发设计 本节我们来开始具体方法的代码实现. doLoadConfig()方法的开发 思路:我们需要将contextConfigLocation路径读取过 ...
- 纯手写Myatis框架
1.接口层-和数据库交互的方式 MyBatis和数据库的交互有两种方式: 使用传统的MyBatis提供的API: 使用Mapper接口: 2.使用Mapper接口 MyBatis 将配置文件中的每一个 ...
随机推荐
- android apk打包编译好的so
加入so到apk有多种方法 1.build.gradle(Module)中android子项中加入以下代码,并将so放到到armeai/armeabi-v7a 子目录下 sourceSets { ma ...
- django基础(一)
一.创建django程序 1.终端:django-admin startproject sitename 2.IDE创建Django程序时,本质上都是自动执行上述命令 常用命令: python man ...
- Oracle 11g快速收集全库统计信息
环境:Oracle 11.2.0.4 采用并行的方式,快速收集全库统计信息,多用于跨版本升级之后,对全库的统计信息重新进行快速收集: --开启计时 set timing on --设置并行收集 exe ...
- 搭建私有仓库Harbor
搭建Harbor企业级docker仓库 搭建Harbor企业级docker仓库 一.Harbor简介 1.Harbor介绍 Harbor是一个用于存储和分发Docker镜像的企业级Registry ...
- c3p0:Connections could not be acquired from the underlying database!解决方案
在利用ssh框架做网站的时候遇到了一个比较棘手的问题,一直连接不上数据库,问题描述如下: 各种百度然后说的最多的解决方案是: 1,驱动配置有误:2,数据库连接地址有误:3,密码或帐号有误: 4,数据库 ...
- redis的key越来越多,对速度是否有影响
---恢复内容开始--- redis存储key是用字典对象的,查询性能几乎和数量级无关,只要保证内存够用就可以了,如果内存不够,会把内存和swap空间交换,这种情况下就会很影响性能,会读取出现读取磁盘 ...
- Exception in Spark
1: Exception in thread "main" org.apache.spark.SparkException: org.apache.spark.streaming. ...
- 【转】C#中base关键字的几种用法
base其实最大的使用地方在面相对性开发的多态性上,base可以完成创建派生类实例时调用其基类构造函数或者调用基类上已被其他方法重写的方法.例如: 2.1关于base调用基类构造函数 public c ...
- arc 092D Two Sequences
题意: 给出两个长度N相同的整数序列A和B,有N^2种方式从A中选择一个数Ai,从B中选择一个数Bj,让两个数相加,求这N^2个数的XOR,即异或. 思路: 暴力的求显然是会超时的,因为是异或,就考虑 ...
- 使用BenchmarkSQL测试PostgreSQL
BenchmarkSQL是一款经典的开源数据库测试工具,内嵌了TPCC测试脚本,可以对EnterpriseDB.PostgreSQL.MySQL.Oracle以及SQL Server等数据库直接进行测 ...