纯手写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也没有配置要求

本文分享自微信公众号 - Java研发军团(ityuancheng)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券