文档章节

SpringBoot+Mybatis+Thymeleaf-Build Blog site_1

杨木发
 杨木发
发布于 01/26 01:55
字数 4319
阅读 465
收藏 0

1、快速构建Springboot项目

(1)、 Spring Boot 项目目录结构介绍

(2)、 Spring Boot 项目启动的几种方式

2、

(1)、hello blog

(2)、 DispatchServlet 配置

(3)、 静态 web 资源如何处理

(4)、 消息转换器 HttpMessageConverter

3、总结

环境:

JDK:1.8

Spring boot:2.1.0-RELEASE

Maven:3+

注意事项:

过程中应当必须注意spring和Java版本之间的对应兼容问题这个非常的坑。

如果Maven默认的国外资源较远很慢可换为阿里云资源池。

**1.1-**构建Springboot的方式:

(1)、使用Spring Initialize构建:

Spring官方提供了Spring Initialize来进行Springboot的快速构建,他是一个在线生成Springboot基础项目的工具,哎呀就当理解为Springboot的“创建向导”。

♬ 首先进入官网 https://start.spring.io

♬ 然后呢在页面上输入我们需要的我基础信息依次填写即可

♬ 最后点击 Generate Project构建项目就即可获取一个Springboot基础项目代码压缩包-如下图;

如上图,Springboot 版本选择最新版或其它稳定点儿的老版本,视项目要求而定,“ dependencies ” 表示添加到项目所依赖的 Spring Boot 组件,也是根据项目要求来选择,需要哪些场景就直接选择相应模块即可,也可以多选,本次演示选择了 Web 模块。

(2)、mvn 命令行创建Springboot项目:

♬ 打开Terminal命令行并将目录切换到对应的文件夹中再依次运行如下命令:

wget  https://yangmufa.com/Resources/SpringBlog.zip

unzip Springboot.zip

在构建成功后可以生成骨架项目,但是由于生成的项目仅仅是骨架项目,因此可以在 pom.xml 文件中添加直接首先要的而其他依赖。

如下图即用命令行构建项目VisualStudioCode示例;

此种方法不推荐。

(3)、Git方式直接从GitHub或Gitee拉去:

♬ 地址:https://gitee.com/yangmufa/SpringBlog.git

Clone后待加载一段时间后即可。

(4)、直接打开:

最后一种方式是直接导入已下载好的Springboot项目,与引入普通的Maven工程类似,解压并通过IDE打开项目(Eclipse、IDEA、VisualStudioCode等)导入成功就可以进行Springboot项目的开发了。

♬ 下载地址https://gitee.com/yangmufa/SpringBlog/repository/archive/master.zip

♬ 下载得到zip包后解压直接打开待加载完成后即可。

1.2-项目启动:

(1)、 线上环境中启动:

♬  项目默认目录是在 SpringBlog下,因此想要启动咱们的项目,首先需要通过在Terminal通过 cd SpringBlog 命令切换到  SpringBlog 目录下,之后可以通过 Maven 插件的方式启动 Spring Boot 项目,命令为  mvn spring-boot:run,之后就可以等待项目启动了;

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

(2)、 IDE直接run:

直接在IDE点击带有运行功能的图标即可(以IDEA为例)

:♬

项目成功启动后,在本机浏览器输入localhost:端口号,可以看到一个 white label error 页面,这个页面是 Spring Boot 的默认错误页面,由页面内容可以看出报错为 404 ,访问其他地址也都会是这个页面,此时的 web 服务中并没有任何可访问资源,因为我们并没有在项目中增加任何一行代码,没有接口,也没有页面。

2.0-在上一阶段项目的创建和启动都没没问题了以后便可愉快的进行下面的操作了。

2.1-hello blog:

♬  自行实现一个 Controller 来测试一下 Spring Boot 如何处理 web 请求,接下来使用 Spring Boot 做一个简单的接口实现。在 src/main/java 目录下新建 com/yangmufa.blog下在建一个controller 包,之后在包里新建一个 HelloController 类,编码如下:

package com.lou.springboot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @GetMapping("/hello")
    @ResponseBody
    public String hello() {
        return "hello,shiyanlou";
    }
}

这段代码在 Spring Boot 项目中,大部分功能实现的写法与 Spring 项目开发的写法是相同的,其含义就是处理请求路径为 /hello 的 get 请求,之后返回一段字符串。 编码完成后重新启动项目,启动后在本机浏览器输   localhost:80880 ,并在浏览器地址栏地址末尾中添加 /hello,如下图所示,第一个 Spring Boot 项目实例就完成了!

2.2- DispatchServlet 配置:

当创建第一个 Spring Boot 项目,在初始化时我选择了 web 模块(即在 pom 文件中引入了 spring-boot-starter-web 依赖),该模块中包含了 SpringMVC 相关依赖,之后我们开发了第一个 web 功能,仅仅是在控制器类中实现了一个简单的字符串返回方法,并对该方法进行了请求地址映射设置,之后没有做其他配置操作,但是项目启动后就能够进行正常的 web 请求并正常返回数据。 回想一下在未使用 Spring Boot 开发 web 应用的场景,在平时的 Spring web 项目中,使用 SpringMVC 模块时需要在容器中 SpringMVC 相关的配置 bean,并且在 web.xml 中配置 DispatcherServlet 以及它的 <Servlet-mapping> 进行请求地址的映射,配置文件如下:

  <!--Start spring mvc Servlet-->
    <servlet>
        <servlet-name>Spring</Servlet-name>
        <servlet-class>org.springframework.web.Servlet.DispatcherServlet</Servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--End spring mvc Servlet-->
    <!--Start Servlet-mapping -->
    <servlet-mapping>
        <Servlet-name>Spring</Servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--End Servlet-mapping -->

最后启动 Tomcat 服务器装载 DispatcherServlet,接着就可以进行基于 SpringMVC 框架的 web 项目开发和使用,但是 Spring Boot 开发 web 项目时,开发者只需导入 spring-boot-starter-web 场景启动器即可,根本无需再进行任何配置就能够使得 DispatherServlet 正常加载并使用,这是因为 Spring Boot 在项目启动时已经将 DispatherServlet 自动配置到项目中了,因此无需做多余的配置即可完成接口的开发。

不过呢,使用 Spring Boot 开发 web 应用时,有两个需要注意的配置项:

server.port 表示启动后的端口号,默认是 8080
    server.servlet.context-path 项目路径,是构成 url 地址的一部分

如果想要修改这两个参数值,可以在 application.properties 配置文件中修改,示例如下:

这样的话,启动后的端口号就不再是默认的固定 8080 而是 可以 自定义了(比如9090),在浏览器访问时也需要加上设置的项目路径,比如前面的 hello 请求,路径就变成了 http://localhost:9090/yangmufa/hello ,这一点需要注意,如果想要对端口和项目访问路径做修改的话,修改这两个参数然后重新启动就可以了。

且为了不采坑可先停止后再启动而不要直接在启动运行状态小直接在此启动。

2.3-静态资源处理消息转换器 HttpMessageConverter:

在 B/S 架构中,静态资源一般指 Web 服务器对应目录中的资源文件,客户端发送请求到 Web 服务器后,Web 服务器(比如 Tomcat)直接从文件目录中获取文件并返回给客户端,客户端解析并渲染显示出来,比如 HTML、CSS、JavaScript、图片等文件,这些文件原样返回给客户端,并不会在 Web 服务器端有所改变,在进行 web 项目开发时,对于这些资源的处理也是十分重要的。

通过查看源码可以看到,Springboot 默认存放静态资源文件的目录有四个,这些目录都在类路径下,它们分别是:

/META-INF/resources/
    /resources/
    /static/
    /public/

也就是说,在进行 web 功能开发时,如果项目中存在静态资源文件,如 HTML、CSS、JavaScript、图片等文件,只要将这些文件放到以上四个文件目录即可正常访问到。接下来,我们新建四个目录并进行测试,类路径对应到项目路径中就是 src/main/resources ,新的目录结构如下:

src/main/resources
  ├── application.properties
  ├── META-INF
  │   └── resources
  ├── public
  ├── resources
  ├── static
  └── templates

为了验证,可以分别在每个目录中新增一个静态资源文件,分别是 /META-INF/resources/test.html 、/resources/love.png 、/static/test.css 、/public/test.js :

为 test.html 添加如下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>发哥你好帅</title>
</head>
<body>
resource - html
</body>
</html>

为 test.css 添加如下内容:

. test {
    font-size: 14px;
}

为 test.js 添加如下内容:

function test() {
    console.log('resource - js');
}

接下来启动项目,启动成功后可以点击页面上方的 Web 服务直接在显示查看网站效果。

mvn spring-boot:run

之后点击 Web 服务,我们在路径中分别进行接口的访问和静态资源的访问,看一下服务器返回的结果,访问路径为:

♬ /test.html

♬ /test.css

♬ /test.js

♬ /love.png

如果不在四大默认目录将无法直接访问否则-404伺候:

    结果都是正确的,文件虽然在不同的路径中,但是四个路径都是默认的静态资源目录,因此都能够被访问到。当然,要是我就想要访问yangmufa 目录下的这个不在四大默认目录下的静态资源文件,这种情况该怎么办呢?前面的之所以能直接访问那是因为前面四个静态资源目录是 Springboot 默认设置的,如果想要更改,可以修改配置文件中的 spring.resources.static-locations 参数。比如,我们想要访问 yangmufa 目录下的静态资源文件,首先需要在src/main/resources下新建 yangmufa 目录,将静态资源复制到该目录中:

yangmufa
  ├── love.png
  ├── test.css
  └── test.html

我复制了三个静态资源文件,test.js 依然放在 static 目录中,之后修改配置文件,添加如下设置:

spring.resources.static-locations=classpath:/yangmufa/

重启后,在浏览器中再次分别访问这些静态资源,你会发现 yangmufa 目录下的三个文件都能够正常访问,但是 test.js 访问时报错 404 了,因为配置文件中静态资源路径并没有包含 static 目录,yangmufa 目录下也没有 test.js。如果想要正常访问到该文件,有两个办法,一是将 test.js 文件放到 yangmufa 目录下,二是修改配置文件为 :

spring.resources.static-locations=classpath:/yangmufa/,classpath:/static/

spring.resources.static-locations 的参数值可以设置为一个数组。这样修改后,重启后又能够访问所有的静态资源文件了。

2.4- 消息转换器 HttpMessageConverter:

    以往在使用 SpringMVC 框架开发项目时,大家应该都使用过 @RequestBody、@ResponseBody 注解进行请求实体的转换和响应结果的格式化输出,以普遍使用的 json 数据为例,这两个注解的作用分别可以将请求中的数据解析成 json 并绑定为实体对象以及将响应结果以 json 格式返回给请求发起者,但 Http 请求和响应是基于文本的,也就是说在 SpringMVC 内部维护了一套转换机制,也就是我们通常所说的“将 json 格式的请求信息转换为一个对象,将对象转换为 json 格式并输出为响应信息 ”,这些就是 HttpMessageConverter 的作用。

举一个简单的例子,定义一个实体类,并通过 @RequestBody、@ResponseBody 注解进行参数的读取和响应,代码如下:

在 com.lou.springboot 下创建如下目录结构:

com.yangmufa.blog
     ├── Application.java
     ├── controller
     │   ├── HelloController.java
     │   └── TestController.java
     ├── entity
     │   └── SaleGoods.java
     └── service
         └── HelloService.java

SaleGoods.java 的代码内容如下:

package com.yangmufa.blog.entity;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

//SaleGoods=销售商品
//实体类
public class SaleGoods {

    private Integer id;
    private String goodsName;//商品名
    private float weight;//重量
    private int type;//类型
    private Boolean onSale;//销售中


//get、set

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getGoodsName() {
        return goodsName;
    }

    public void setGoodsName(String goodsName) {
        this.goodsName = goodsName;
    }

    public float getWeight() {
        return weight;
    }

    public void setWeight(float weight) {
        this.weight = weight;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public Boolean getOnSale() {
        return onSale;
    }

    public void setOnSale(Boolean onSale) {
        this.onSale = onSale;
    }

    //覆写toString
@Override
    public String toString(){

        return "SaleGoods{" +
            "id=" + id +
            ", goodsName='" + goodsName + '\'' +
            ", weight=" + weight +
            ", type=" + type +
            ", onSale=" + onSale +
            '}';
    }

}

TestController.java 控制器方法如下,拿到参数数值后进行简单的修改并将对象数据返回:

package com.yangmufa.blog.controller;

import com.yangmufa.blog.entity.SaleGoods;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

    @Controller //控制者
    public class TestController {

        //请求映射
        @RequestMapping(value = "/get/httpMessageConverter", method = RequestMethod.GET)
        @ResponseBody   //响应体

        public SaleGoods httpMessageConverterTest() {

            SaleGoods saleGoods = new SaleGoods();
            saleGoods.setGoodsName("银河手机");
            saleGoods.setId(1);
            saleGoods.setOnSale(true);
            saleGoods.setType(1);
            saleGoods.setWeight(300);
            return saleGoods;
        }

    }

编码完成后重启项目,并在浏览器地址末尾添加  http://localhost:9090/yangmufa//get/httpMessageConverter  进行测试,结果如下:

返回数据如下 :

{
    "id": 1,
    "goodsName": "银河手机",
    "weight": 300.0,
    "type": 1,
    "onSale": true
}

添加 @ResponseBody 注解后,Spring Boot 会直接将对象转换为 json 格式并输出为响应信息,这是将对象作为相应数据的例子。 接下来我们再写一个案例,使用 @RequestBody 接收前端请求并将参数转换为后端定义的对象,在 TestController 类中添加的方法如下,请求方法为 POST,并使用 @RequestBody 注解将前端传输的参数直接转换为 SaleGoods 对象。

package com.yangmufa.blog.controller;

import com.yangmufa.blog.entity.SaleGoods;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

    @Controller //控制者
    public class TestController {

        //请求映射
        @RequestMapping(value = "/get/httpMessageConverter", method = RequestMethod.GET)
        @ResponseBody   //响应体

        public SaleGoods httpMessageConverterTest() {

            SaleGoods saleGoods = new SaleGoods();
            saleGoods.setGoodsName("银河手机");
            saleGoods.setId(1);
            saleGoods.setOnSale(true);
            saleGoods.setType(1);
            saleGoods.setWeight(300);
            return saleGoods;
        }

        @RequestMapping(value = "get/httpMessageConverter2", method = RequestMethod.POST)
        @ResponseBody
        public SaleGoods httpMessageConverterTest2(@RequestBody SaleGoods saleGoods2) {
            System.out.println(saleGoods2.toString());
            saleGoods2.setType(saleGoods2.getType() + 1);
            saleGoods2.setGoodsName("商品名:" + saleGoods2.getGoodsName());
            return saleGoods2;
        }

    }

由于是 POST 请求,因此没有直接使用浏览器访问,而是在 static 中新增了 api-test.html 页面进行模拟请求,页面当中使用的是 applicaiton/json 格式进行 ajax 请求,resources/static/api-test.html 代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>yangmufa.Blog | 请求测试</title>
</head>
<body class="hold-transition login-page">
<div style="width:720px;margin:7% auto">
    <div class="content">
        <div class="container-fluid">
            <div class="row">
                <div class="col-lg-6">
                    <div class="card">
                        <div class="card-header">
                            <h5 class="m-0">接口测试</h5>
                        </div>
                        <div class="card-body">
                            <input id="id" type="text" placeholder="请输入id字段">
                            <input id="goodsName" type="text" placeholder="请输入goodsName字段">
                            <input id="weight" type="number" placeholder="请输入weight字段">
                            <input id="type" type="number" placeholder="请输入type字段">
                            <input id="onSale" type="number" placeholder="请输入onSale字段(0或1)">
                            <h6 class="card-title">接口返回数据如下:</h6>
                            <p class="card-text" id="result2"></p>
                            <a href="#" class="btn btn-primary" onclick="requestPostTest()">发送Post请求</a>
                        </div>
                    </div>
                    <br>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- jQuery -->
<script src="https://cdn.staticfile.org/jquery/1.12.0/jquery.min.js"></script>
<script type="text/javascript">
    function requestPostTest() {
        var onSale = true;
        var id = $("#id").val();
        var weight = $("#weight").val();
        var type = $("#type").val();
        var goodsName = $("#goodsName").val();
        var onSaleValue = $("#onSale").val();
        if(onSaleValue !== 1){
            onSale = false;
        }
        var data = {"id": id, "goodsName": goodsName, "weight":weight, "type":type, "onSale":onSale};
        $.ajax({
            type: "POST",  //方法类型
            dataType: "json",  //预期服务器返回的数据类型
            url: "get/httpMessageConverter2",
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify(data),
            success: function (result) {
                $("#result2").html(JSON.stringify(result));
            },
            error: function () {
                $("#result2").html("接口异常,请联系管理员!");
            }
        });
    }
</script>
</body>
</html>

重启项目,在地址栏访问 /api-test.html 页面,并在页面输入框中输入对应的数据,点击请求按钮,最终获得结果如下:

前端 ajax 传输的数据是 5 个字段,到达后端后直接转换为 SaleGoods 对象。由于消息转换器的存在,对象数据的读取不仅简单而且完全正确,响应时也不用自行封装工具类,使得开发过程变得更加灵活和高效。

2.4- 总结

今天晚上的实验就到此结束实在是冷的遭不住了这大年初一的还在撸代码颇有身体被掏空的感觉,为了后续实践项目的开发,这次简单的介绍了如何使用 Springboot 进行接口开发和 web 资源的访问。

        首先对 DispatchServlet 自动配置做一下回顾介绍,在做 web 功能开发时其实与原来使用 SpringMVC 框架开发时类似,只不过 Springboot 默认是已经将其配置好而减少我们的工作量,不仅如此,Springboot 还做了很多自动配置使得我们能够如此方便的进行 web 项目开发。

通过官方文档的介绍我们可以发现,Springboot 还做了如下的默认配置:

    自动配置了 ViewResolver 视图解析器
    静态资源文件夹处理
    自动注册了大量的转换器和格式化器
    提供了 HttpMessageConverter 对请求参数和返回结果进行处理
    自动注册了 MessageCodesResolver
    默认欢迎页配置
    favicon 自动配置

以上这些特性中,比较重要的内容我都在文章中进行了实验记录,为了更好的掌握到这些内容,志同道合的朋友也可以根据文章中的内容对接口或者配置进行修改,之后重启项目看一下访问效果是否有更改。

/*-------------------反爬声明o(*////▽////*)咻咻咻--------------------

作者:杨木发
版权声明:
       本文为博主倾情原创文章,整篇转载请附上源文链接!

如果觉得本文对你有所收获,你的请评论点赞 与

合理优质的转发也将是鼓励支持我继续创作的动力,

 更多精彩可百度搜索 杨木发 或:

个人网站:www.yangmufa.com    ,

开源中国:https://my.oschina.net/yangmufa    ,

Gitee:https://gitee.com/yangmufa    ,

GitHub:https://github.com/yangmufa    。

坚持创作 善于总结 开源共享 高质进步。

鸣谢:十三

-------------------反爬声明o(*////▽////*)咻咻咻--------------------*/

 

© 著作权归作者所有

杨木发

杨木发

粉丝 1
博文 73
码字总数 70713
作品 0
铜仁
个人站长
私信 提问
加载中

评论(0)

js中url拼接提示我要换成'&amp;'字符,但是提交之后却不能被转换,导致后台接收不到参数

如题,框架为springboot+mybatis+thymeleaf js中一段简单的url跳转: onclick调用js函数,浏览器地址栏为: http://localhost:8080/?searchText=&pageNo=2 导致后台接收不到pageNo参数,将地址...

韩涛
2017/01/06
1.9K
3
整合springboot+mybatis+thymeleaf

最近刚在学习这个springboot,刚开始学习,然后自己就迫不及待的去整合了一个小实例 1:因为spring-boot这个案例因为整合的是thymeleaf所以在创建maven项目的时候选择jar的方式, 如果整合的...

曾将
2018/04/05
0
0
Lexus Extroic OpenCart 2.X 自适应主题模板 ABC-0648-01

LEXUS EXTROIC OPENCART 2.X 自适应主题模板 ABC-0648-01 CORE FEATURES: Check out the amazing features of the Opencart theme DETAIL FEATURES Compatible with latest Opencart versio......

OpenCart中国
2015/05/11
49
1
[喵咪大数据]HUE大数据管理工具

日常的大数据使用中经常是在服务器命名行中进行操作,可视化功能仅仅依靠着各个组件自带的网页进行,那么有没有一个可以结合大家能在一个网页上的管理工具呢?答案是肯定的,今天就和大家一起来探...

喵了_个咪
2018/01/13
346
1
linux 安装python MySQLdb

安装步骤 在服务器安装了mysql 或者mysql-connect的前提下 1、安装setuptools 2、安装mysql-python 1、No module named setuptools *原因 没有安装setuptools工具 *解决方案 在python官网htt...

Mr_Tea
2016/10/13
502
0

没有更多内容

加载失败,请刷新页面

加载更多

006. 线程安全之 JAVA 锁相关

1. JAVA中锁的概念 自旋锁: 是指当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断地判断锁是否能够被成功获取,直到获取到锁才会退出循环。 乐观锁: 假...

紫穹
30分钟前
50
0
如何确定Python变量的类型? - How to determine a Python variable's type?

问题: How do I see the type of a variable whether it is unsigned 32 bit, signed 16 bit, etc.? 如何查看变量的类型,无论是无符号32位,带符号16位等等? How do I view it? 我该如何看...

javail
今天
115
0
略谈分布式系统中的容器设计模式

本文作者:zytan_cocoa 略谈分布式系统中的容器设计模式 谭中意 2020/3/5 前言:云原生(Cloud Native)不仅仅是趋势,更是现在进行时,它是构建现代的,可弹性伸缩的,快速迭代的计算网络服...

百度开发者中心
03/11
128
0
a small thing that made me a little bit depressed

It was just two hours ago,specificly speaking It was 11:48 almost coming close to midneight. I was pratising singing songs in my renting room which is a sharing apartment . I re......

lost_myself
今天
101
0
OSChina 周日乱弹 —— 这中间几个月的地震、核爆、外星人、高达... 去哪了

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《Elizabeth》- Ashram 手机党少年们想听歌,请使劲儿戳(这里) @巴拉迪维 :#共...

小小编辑
今天
238
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部