springboot入门系列(2):web一下

系列之第2篇。面向有java基础、正在打磨实践能力、不太适应学院派教程、想快速具备实际项目能力的java菜鸟。事实上这一系列文章是专门面向我圈子里的某些特定读者的,考虑可能对于圈外的读者也有价值,所以放出来。不喜勿喷,但欢迎交流,大佬路过也请多提斧正意见。

写在前面

前一篇在这里《springboot入门系列(1):最简起步》 ,讲述如何摒弃一切干扰、简单粗暴体验springboot。达成的目标有两个:

  • 配置并运行最简springboot项目
  • 让springboot在控制台打印Hello World

第2个目标的达成,完全没有触及springboot的灵魂。

首先,如果较真的话,它只有输出没有输入。当然,java基础知识里面有关于System.in.read()的介绍,相信如果愿意的话,菜鸟也能写出来比如输入1+1,返回结果2的代码。

其次,它的界面是标准输入输出。杀鸡焉用牛刀,springboot显然不是用来搞System.in和System.out的,一个普通java程序就可做到。

本篇将开始触及springboot的灵魂,但必须指出的是,暂时仍未没有达到灵魂最深处。只不过对于初学者来说,这个触摸过程确实可以借鉴用来暂时解决一些实际问题并学到必要的知识。

 

说明一下本次目标

springboot运行起来被称为一个“springboot实例”或“springboot应用”

本次目标是:

  1. 用一个比较主流的界面与springboot实例交互
  2. 用户从界面对springboot实例发起输入
  3. springboot实例针对输入做一点简单处理并输出结果
  4. 界面对用户显示处理结果

界面的选择:重新认识Web浏览器

本节仅针对web基础知识欠缺的初级读者。掌握基本web知识的请跳过。

微软IE、火狐Firefox、谷歌Chrome、360安全浏览器等等都是web浏览器。在非IT工程师看来,它们貌似是多媒体的一种形式,像一本书或一幅画或一部电影。但从开发者视角看来,它的能力本质是:

  • 向服务器提供输入(请求一个网页、图片、声音、视频等资源的地址)
  • 把服务器输出的内容呈现出来(显示网页、图片,播放音视频)

具体的,当你打开浏览器,在地址栏键入“csdn.net”并回车(或点击GO按钮),就是向csdn的服务器做了一次输入。这个输入内容很复杂,所有复杂细节由浏览器帮你组装,这里暂时不展开。你只需要知道对于服务器上运行的springboot(假设csdn网站使用springboot开发的,虽然实际并不是,但确实可以)来说,这是一次通过网络送达的输入。csdn服务器上的springboot给你返回主页的所有内容,浏览器将其呈现出来。

另一种情况,在上一步的基础上,假设你在首页看到了本文的链接(或者其他博客文章也同理),点击这个链接,就打开了本页。在上一篇中,我就反复提醒,你需要有意识地关注浏览器的地址栏。当你鼠标点链接打开了某个页面,地址栏就变化了。这和你直接在地址栏输入这个地址并回车是完全同等作用的。因此,点击链接也同样是向服务器的springboot做了一次输入,并能得到一个输出结果,就是新的页面,浏览器呈现之。

和我们在System.in上输入略有不同的是,在浏览器地址栏的输入,必须遵守一点点小规则。原因在于System.in永远指本机,这是确定的,但浏览器可以访问任意公开的服务器,所以必须指明要向哪个服务器输入。这就是域名系统了,形如www.csdn.net或www.apple.cn等。我们学习和测试阶段,不可能csdn允许你把你的springboot打包放到他们服务器,所以我们用自己的电脑作为服务器。每一个人的电脑都有一个固定的“域名”,就是“localhost”。因此,稍后springboot运行起来以后,记得打开浏览器,在地址栏输入localhost并回车,就产生了一次输入。

初学者可以暂时认为,浏览器和服务器的这种交互机制,就是web。通俗的说法叫做网站。

目前通过web的方式构建网络应用,是最普遍的做法。

springboot主要支持的就是web的方式。

我们选择web浏览器作为springboot的界面,继续体验学习。

 

过程提纲

详细做法参考《springboot入门系列(1):最简起步》,忘记了可以回去重温,这次简要过程如下:

  1. 搭建一个支持web的springboot项目(上一篇的不支持web)
  2. 做一些编码,接收输入、处理并输出结果
  3. maven编译打包
  4. 把自己的电脑看做服务器,在服务器上运行springboot的jar文件
  5. 用浏览器作为界面,与springboot做输入输出交互,这时自己的电脑又看做是客户端

 准备工作:搭建一个支持web的springboot项目

上一篇的那个项目,因为是最简,从能做的事情这个角度来说,几乎和一个普通java程序没有区别,它是不支持web的。但它的底子非常好。

这次首先要让它支持web。有两个做法上的选择:

  1. 在上一篇的项目上加一点东西
  2. 重新下载初始化打包,中间多一点点步骤(步骤肯定不可能和上一篇完全相同,那样下载下来还是上一篇的结果)

两种做法殊途同归,第2种做法更傻瓜,而且从第2种的结果可以反推出第1种做法,先来第2种。

首先打开https://start.spring.io 页面,上一篇打开之后是什么都没动,下载了最简项目,这次要动一动框出来的两处:

要动的两处:

红色框A处,你应该看出来了,这是项目的名称,为了和上一次的区别开来,请把原来的“demo”改为“demo2”或“demoweb”,自己任意起一个名字,容易识别就好,注意不要使用特殊字符和汉字等;这个改动不是绝对必须的,如果你不会把此次项目和上一篇项目混淆,那么可以不改动此项。

绿色框B处,这里就是让项目支持web的关键所在。在这里填写“web”,注意这还不够,填写了之后,会弹出下拉列表如下图:

点击弹出下拉列表中Spring Web条目右侧的圆形加号+按钮, 变成下图:

右侧多出了Spring Web的选中记录。

这样就可以了。

现在像之前一样,点绿色按钮,下载,解压缩,得到springboot项目文件夹,这次的springboot项目是支持web的。

给springboot项目增加web支持,这个用术语叫做“填加web依赖”,“支持”=“依赖”,只是叫法的不同,“支持”更通俗,“依赖”比较专业。下文一概采用术语“依赖”。可以推知,springboot还有很多其他依赖,暂不表。

总结重点——springboot初始化打包要选中web依赖。

springboot初始化打包,选中和不选中web,都可以生成项目,那么区别是什么呢?

可以比较一下两个项目根目录下的pom.xml文件,这是关键的maven配置文件。比较如下图所示:

可以看出,除了项目名字的不同(黄色记号)之外,只有一处红色记号标出的不同。左侧是选了web依赖的,右侧是没有web依赖的。通俗地说只是多了“-web”这4个字符而已。

所以,一开始提到的两种做法中的第1种做法,其实就是在最简的项目基础上,编辑pom.xml,找到spring-boot-starter这个位置,后面加上-web,保存文件即可。

添加web依赖的本质,就是在pom.xml中使用了spring-boot-starter-web代替spring-boot-starter

体验一下准备工作的成果

先不急编码,先体验一下“填加了web依赖”的成果

不论用两种方法的哪一种搭建了项目,到项目目录下mvn package然后java -jar运行,参考《springboot入门系列(1):最简起步》,或者参照下图我的执行(要注意你自己的项目目录):

在所有运行信息的最末位附近有重要信息如下图所示:

绿色框内信息的意思是:在8080端口上启动成功了。

特殊情况下,可能会失败,如:

这个失败的含义是端口8080被占用了。要么是你其他程序在占用,要么是你重复启动了本springboot项目。自己某度一下怎么查看占用端口的进程并杀死它。

看到started on port(s): 8080就表示启动成功了。

回到主线,刚才启动成功了。现在打开web浏览器,地址栏输入 localhost:8080

温馨提示初学者:数字8080不是什么神奇数字,就是刚才启动成功信息中提示你的,这只是springboot默认使用的端口,后续篇章会学到如何使用其他端口。数字8080和localhost之间是英文的冒号(是英文的:,不是中文的:)。localhost就是指你自己的电脑模拟成服务器时特有的域名。

回车。

这是一个“成功”的“错误”页。

错误是因为你看到了Error字眼,成功是因为如果没有springboot,你连错误这个字眼都看不到。“给女朋友买了错误色号的口红因此挨骂了”与“根本没有女朋友所以不会挨骂”完全是两回事。如果有疑惑,请用另外一台未运行springboot的电脑试试看,或者,用上述杀死进程的办法之后再试,你会看到不一样的风景。

好了,再看一眼这个界面,虽然结局不怎么美妙,但这是你与你的springboot的第一次输入输出交互。

打开了错误页面,但这确实是一次成功的输入输出

编程:为了真正的输入输出

现在要做的事情先简要列个提纲:

  1. 新建一个java类
  2. 在类内编写一点特定代码
  3. 保存并重新打包
  4. 运行
  5. 用浏览器发起输入并查看结果

在项目目录下,src文件夹是源文件所在。其下目录结构比较深,暂不具体讨论这些目录结构,首先知道目前唯一的关键类在:src\main\java\com\example\demoweb\ (最后一层目录名可能有所不同,取决于你初始化时设定的项目名称),类名叫做DemowebApplication.java(同理,这个名称也可能略有不同)

现在我们就在这里新建一个java源文件,你可以自己定义它的名字,但文件名要与public类的名字完全一致的java基本规则请牢记。我的类起名叫HelloWorld,自然,文件名就要叫HelloWorld.java

 

 源文件的内容初始如下,注意package:

package com.example.demoweb;

public class HelloWorld {
	
}

 空的类并具备任何行动能力,需要加个方法:

package com.example.demoweb;

import java.util.Date;

public class HelloWorld {

	String f() {
		return "Hello World. @ " + new Date();
	}
}

方法的名字并不重要,随意。正式项目中方法的名字应该反映方法的行为。

方法接收“空”的输入,会返回一个字符串内容。为了体现程序是活动的,特意在字符串上拼接了日期对象,这样在返回结果上能看到一个真实的时间。Date类java的核心基础类,不了解的菜鸟先花5分钟去翻一下教程。

现在这个类具有了雏形,但明显只是个普通的java类,springboot高大上的特征一点都没有,接下来加入springboot特征:

package com.example.demoweb;

import java.util.Date;
import org.springframework.web.bind.annotation.*;    // 引入相关包

@RestController                        // << == 简单理解:表示该类会被springboot加载和使用
public class HelloWorld {

	@RequestMapping                // << == 简单理解:表示该方法是用来处理输入输出的
	String f() {
		return "Hello World. @ " + new Date();
	}
}

可以了。写好保存。

体验一下

重新打包mvn package,运行java -jar xxx.jar。

 浏览器和springboot的成功且正确的输入输出交互。

后记

体验之后,需要去学习或复习的java基础知识主要是“注解”,英文是annotation,完全理解注解不太容易,需要真正的实践,可以先初步掌握即可。

另外要特别说明的,可以通俗地认为,springboot启动时,实际上暗戳戳启动了一个tomcat服务器软件(术语叫“中间件”,可以某度了解一下tomcat和中间件这两个概念),网络链接和数据交换等工作都在我们程序员看不到的地方由中间件处理掉了。

整个过程好比你打个网约车去撩妹,你只需要准备土味情话,不需要在意路上开车的问题。在上述springboot代码中,我们只需加两个注解,就能上车,剩下的工作只需要在方法里做好输入输出的处理。这种编程的新模式对于程序初学者来说非常别扭,非常费解。先尽力适应,习惯成自然。抽象理解里好的初学者,可以某度看一下“控制反转”“依赖倒置”等高级概念,先触摸一下,不强求完全掌握。

下篇预告

丰富一下处理过程,来一个更有实际意义的交互。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值