最近,SpringBoot、SpringCloud、Dubbo等框架非常流行,作为Coder里的一名小学生,借着改革开放的东风,自然也是需要学习学习的,于是将学习经历记录于此,以备日后查看。

  官网:https://start.spring.io/

  可以在官网直接下载demo项目导入到开发工具中,在官网下载只能选择JDK8和JDK11(似乎2.0以上已经不支持1.7了),如果从官网下载项目而本地环境JDK版本是1.7,需要指定prom.xml里的版本,也可自行构建maven项目,因为初次学习,此处自行新建maven项目配置SpringBoot框架。

项目目录如下:

一、目录结构

如上图所示,Spring Boot的基础结构共三个文件:

l src/main/java  程序开发以及主程序入口

l src/main/resources  模板、js、css、图片、配置等静态文件

l src/test/java  测试程序

而在src/main/java 目录 ,主要程序结构是

----------com.hyblogs

    -----Application.java

    -----controller

      -----------HyBlogsController.java

     ------mode

        -----------User.java

     ------service

        -----------GetUserService.java

   ------dao

   ------utils

------constant

        

Application.java 程序作为入口,所在的位置是在controller、model、service包的同一级,同一级,同一级,重要的事情说三遍。

①、Application.java 墙裂建议放到根目录下面,主要用于做一些框架配置

②、model目录主要用于实体

③、service 层主要是业务类代码

④、controller 负责页面访问控制

⑤、dao用于数据访问

⑥、constant用于存放常量

⑦、utils用于存放常用工具

这个目录结构让我想起世界上最好的语言PHP,真的好像ThinkPHP里的路由,有木有?既然是maven构建的项目,自然少不了porm.xml文件了。现将内容贴出,再来分析。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--   
spring-boot-starter-parent是Spring Boot的核心启动器,
包含了自动配置、日志和YAML等大量默认的配置,大大简化了我们的开发。
引入之后相关的starter引入就不需要添加maven 里jar包的 version配置,
   spring boot会自动选择最合适的版本进行添加。
   -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <!--项目的基本描述信息-->
<groupId>com.hyblogs</groupId>
<artifactId>SpringBooT</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringBoot_1</name>
<description>Hyblogs Spring Boot 1</description> <!--指定当前的jdk版本和字符编码,开发、编译jdk版本要一致 -->
<properties>
<java.version>1.7</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<!--Springboot核心,通过starter来启动 核心模块,包括自动配置支持、日志和YAML -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 添加测试模块 ,包括JUnit、Hamcrest、Mockito-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!--包含了Spring Boot预定义的一些Web开发的常用依赖包如: spring-webmvc,Tomcat等 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 热部署,修改代码后不需要手动重启tomcat -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.7.RELEASE</version><!--$NO-MVN-MAN-VER$-->
</dependency>
<!-- 应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>1.5.4.RELEASE</version><!--$NO-MVN-MAN-VER$-->
</dependency>
</dependencies> <build>
<plugins>
<!--在Maven中提供Spring Boot支持,允许打包可执行jar或war和运行应用程序 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

建议将maven的远程仓库改为阿里云,第一次下载jar包的速度会快很多,下载完jar包,新建目录,SpringBoot的基本结构就完成了。

二、入口程序Application.java

  执行Application中的main()方法,启动SpringBoot程序。

  @SpringBootApplication:表明这个是SpringBoot的入口文件,这是SpringBoot的启动程序。

  @RunWith(SpringRunner.class)  @RunWith是指定运行器,而(SpringRunner.class)是Spring的运行器,指定用Spring容器的方式来运行。

 package com.hyblogs;

 import org.junit.runner.RunWith;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.test.context.junit4.SpringRunner; @SpringBootApplication
@RunWith(SpringRunner.class)
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
} }

三、Controller层

  在com.hyblogs.controller包下创建HyBlogsController.java

  此处说一下这两个Controller的区别

  @RestController:表明此控制器内的方法的返回值会以json格式显示,返回的内容就是return 里的内容

  @Controller:表明此控制器的的返回值会映射一个页面,浏览器会转到return里的页面中。如果要返回json,不跳转到返回的页面中,需要在方法上添加@ResponseBody。

  @RequestMapping():指定请求的路径

 package com.hyblogs.controller;

 import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import com.hyblogs.model.User; @RestController
public class HyBlogsController {
@RequestMapping("/hello")
public String index() {
return "Hello World";
}
@RequestMapping("/hyblogs")
public String hi() {
return "hyblogs 666";
} }

由于还没有编写jsp和html页面,就先使用@RestController来体验一把SpringBoot的威力,直接运行入口文件Application.java。

根本没有部署程序到Tomcat,Tomcat已经成功加载程序并运行了。在浏览器地址栏输入:http://127.0.0.1:8080/hello

结果出来的,真的方便,不用部署,不用配置xml,不用启动Tomcat,有了SpringBoot简直美滋滋。既然配置了@RestController控制器,自然也要体验一把json的效果。

在com.hyblogs.model包下新建一个User.java

 package com.hyblogs.model;

 public class User {
private String userName;
private String passWord;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}

HyBlogsController.java中添加

 package com.hyblogs.controller;

 import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import com.hyblogs.model.User; @RestController
public class HyBlogsController {
@RequestMapping("/hello")
public String index() {
return "Hello World";
}
@RequestMapping("/hyblogs")
public String hi() {
return "hyblogs 666";
}
@RequestMapping("/getUser")
public User getUser() {
User user=new User();
user.setUserName("小明你还记得我吗");
user.setPassWord("7890");
return user;
}
}

将对象属性转为json数据,在保存的那一刻,控制台显示Tomcat自动restart。在地址栏输入:http://127.0.0.1:8080/getUser

SpringBoot配置JSP

  体验了@RestController的效果,再来看看@Controller,使用@Controller返回一个jsp页面。在Spring MVC里面也可以很方便的将JSP与一个View关联起来,返回一个字符串,就能对应上jsp页面。但是SpringBoot官方不推荐使用JSP,推荐使用模板Thymeleaf,对jsp的使用不太友好,所以这一点拿出来单独纪录,坑有几个,踩上就是404,得花时间调试一会。先来分析一下SpringBoot的资源目录:

    

在resource目录中新建了config、static、templates三个文件。

  config里存放的各种配置文件,注意:如果在config里有一个配置文件,在resource目录下也有一个配置文件,那么会以config下的为准,会覆盖掉外层的配置;

  static里有css,js,images的目录,这无需多言,而HTML作为静态文件,也是放在这里的,通过地址栏可以直接访问到的;

  templates 里主要放动态文件,Thymeleaf模板文件就在这里。

既然如此,就需要给jsp安排地方了,在resources同级目录,新建一个webapp目录,在webapp里新建一个WEB-INF目录,WEB-INF中建一个jsp目录,把jsp文件放在这里。

MyJsp.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP </title>
</head>
<body>
测试jsp的页面内容</br>
<hr>
不建议使用jsp
</body>
</html>

现在创建一个Controller,并返回指向MyJsp.jsp的页面(使用@Controller注解,而非RestController注解,返回的地址写webapp地址的全路径):

TestController.java

package com.hyblogs.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
@RequestMapping("/testControl")
public String testControl(){
System.out.println("!!!!!");
return "/WEB-INF/jsp/MyJsp.jsp";
} }

运行发现出现404:

原因是还没配置jsp的支持,于是在pom.xml中添加jsp的jar包支持:

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency> <dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- tomcat的支持.-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>

配置后,再次运行:

此时已经成功运行处jsp页面了,当然也可以使用配置文件,配置Controller返回的前缀和后缀,这样就可以省去每次写jsp路径和".jsp"。

打开src.main.resources.config中的application.properties

添加2行

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

prefix是前缀,后面跟webapp后的每一层目录,suffix是后缀,后面跟.jsp

配置完前缀和后缀,在Controller里返回就不用带上目录和文件后追了,直接返回文件名字的字符串就可以,改成如下:

package com.hyblogs.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
@RequestMapping("/testControl")
public String testControl(){
System.out.println("!!!!!");
return "MyJsp";
} }

运行:

总结几点:

  1、SpringBoot的目录按照MVC的思想进行分离,但需要注意Application.Java这个入口文件的位置。

  2、如果需要返回JSP页面,①配置文件后面不能有空格、tab等字符,②路径要对应,③pom.xml里不能同时存在jsp和Thymeleaf,默认会在templates中找模板文件;

   3、使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面若返回json等内容到页面,则需要加@ResponseBody注解,而                @RestController相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就                不能返回jsp,html页面,视图解析器无法解析jsp,html页面。

   4、SpringBoot不推荐使用JSP,Thymeleaf模板确实是比JSP效率高,对前后端的分离做的更好,推荐使用。

Thymeleaf模板内容较多,且到下文分解---------------------------------------------------------------------------

SpringBoot入门学习记录(一)的更多相关文章

  1. redis入门学习记录(二)

    继第一节 redis入门学习记录(一)之后,我们来学习redis的基本使用. 接下来我们看看/usr/local/redis/bin目录下的几个文件作用是什么? redis-benchmark:red ...

  2. SpringBoot入门学习(一)

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.用我 ...

  3. 【Java】SpringBoot入门学习及基本使用

    SpringBoot入门及基本使用 SpringBoot的介绍我就不多说了,核心的就是"约定大于配置",接下来直接上干货吧! 本文的实例: github-LPCloud,欢迎sta ...

  4. SpringBoot入门学习看这一篇就够了

    1.SpringBoot是什么? SpringBoot是一套基于Spring框架的微服务框架. 2.为什么需要SpringBoot 由于Spring是一个轻量级的企业开发框架,主要的功能就是用于整合和 ...

  5. gulp入门学习教程(入门学习记录)

    前言 最近在通过教学视频学习angularjs,其中有gulp的教学部分,对其的介绍为可以对文件进行合并,压缩,格式化,监听,测试,检查等操作时,看到前三种功能我的心理思想是,网上有很多在线压缩,在线 ...

  6. springboot入门学习1

    springboot学习1 SpringBoot对Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑 业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中 ...

  7. springboot入门学习-helloworld实例

    今天学习了springboot,发现使用springboot创建项目确实非常方便,创建第一个springboot项目之前先看一下下面两个问题. 一.什么是springboot? Spring Boot ...

  8. SpringBoot入门学习(二)

    第一讲我们已经讲解了入门Demo,这一讲我们主要讲解包含以下内容 项目内一些属性配置 自定义属性配置 ConfigurationProperties配置 (1)第一个工程创建的时候会自动在工程下创建a ...

  9. Sentinel入门学习记录

    最近公司里面在进行微服务开发,因为有使用到限流降级,所以去调研学习了一下Sentinel,在这里做一个记录. Sentinel官方文档:https://github.com/alibaba/Senti ...

随机推荐

  1. MySQL分析函数实现

    | MySQL分析函数实现还好MySQL8.0已经实现了与Oracle相同的分析函数. 1. 实现rownumSET @rn:=0;SELECT @rn:=@rn+1 AS rownum ,e.* F ...

  2. Java 设计模式笔记

    0. 说明 转载 & 参考大部分内容 JAVA设计模式总结之23种设计模式 1. 什么是设计模式 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设 ...

  3. Pandas Learning

    Panda Introduction Pandas 是基于 NumPy 的一个很方便的库,不论是对数据的读取.处理都非常方便.常用于对csv,json,xml等格式数据的读取和处理. Pandas定义 ...

  4. Beta阶段第一次冲刺

    Beta阶段第一次冲刺 以后严格按照Git标准来,组员有上传Git的才有贡献分没有的为0 代码签入图 1.part1 -站立式会议照片 2.part2 -项目燃尽图 3.part3 -项目进展 1.正 ...

  5. CompletionService简讲

    背景 最近在项目中看到太多后台task中使用Executor框架,提交任务后,把future都一个个加入到list,再一个个get这些future的代码. 这个的问题在于一方面没有时限,可能会被某些运 ...

  6. BZOJ 1028 麻将 枚举

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1028 题目大意: 麻将是中国传统的娱乐工具之一.麻将牌的牌可以分为字牌(共有东.南.西 ...

  7. [转]VS2015+OpenCV3.3 GPU模块和opencv_contrib模块的编译以及采用CMake编译opencv_contrib时提示“No extra modules found in folder”问题的解决方案

    据官方说法,目前还不是太稳定的算法模块都在opencv_contrib里边,由于不稳定,所以不能在release版本里发行,只有在稳定以后才会放进release里边.但是这里边有很多我们经常要用的算法 ...

  8. 贪心算法——字典序最小问题,Saruman‘s Army

    题目描述 Best Cow Line (POJ 3617) 给定长度为N的字符串S,要构造一个长度为N字符串T.T是一个空串,反复执行下列任意操作: 从S的头部删除一个字符,加到T的尾部: 从S的尾部 ...

  9. PGM1.1-简介

    自己根据Jordan大神的资料写的(算翻译?完全不记得了,这是半年前整理的,反正不记得了,如果大神有看到部分重合,那肯定是我借鉴了人家的,本来是一个群里的人大家兴致高说写DL的书(所以这一章并不是书的 ...

  10. odoo 订单打印 会出现字体. ........... 虚线问题

    在表头加 红色部分 <?xml version="1.0" encoding="utf-8"?><openerp> <data&g ...