废话少说直接进入正题,这里使用的编译器是IDEA2021。
新建springboot项目,记得选中spring.web以及devtools依赖。这里我们打开setting选中下图这个,使得项目支持热部署,能减少很多工作量。这是IDEA2021版本,老版本的方法跟这个不一样。
在左侧的文件目录中可见,src/main/java中保存的是我们项目的代码,src/main/resources中有static、templates两个文件夹,猜测分别存放静态文件和模板文件,还有一个配置文件application.properties。这里我们使用官方推荐的yaml文件,即application.yaml或者application.yml,使得配置文件更加简洁。设置操作过后的截图如下:
下面我们在com/lxc下新建文件夹controller,新建FirstController类,java代码如下所示:
package com.lxc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FirstController {
@RequestMapping("/hello")
public String helloWorld(){
return "hello world";
}
}
这里我们接触到了两个注解(APP里的注解SpringBootApplication是自带的)。其中@RestController注解是Controller注解和ResponseBody注解的结合,如果是后端开发这个注解最为重要(不需要考虑页面跳转,只管拿到数据并返回),表示是Controller并且以json的形式返回数据。@RequestMapping注解我不知道官方名字是什么,意思就是访问时候输入的url部分。记得要在最前面加上"/"。这里的意思就是,通过访问localhost:8080/hello来查看内容(默认端口为8080)。我们运行项目,在浏览器url输入localhost:8080/hello查看运行结果。
以上就是我的第一个springboot项目。之前有提到springboot的默认端口是8080,这个是可以根据个人需要在配置文件中修改的。例如我们将端口设为9090
server:
port: 9090
当然了这里不需要真的修改,下面还是使用默认的8080端口,看着舒服。之前我们删除了系统默认的 properties文件,yaml文件和properties文件最好不要同时出现,如果非要同时出现,后者的优先级更高。
配置文件可以放在以下四个地方:①项目根目录下的config目录中②项目根目录下③classPath下的config目录中④classpath 目录下,优先级自上而下越来越低,出现多个时以优先级高的为准。这里就涉及了如何修改配置文件的问题:当将项目打包后,可以通过下载项目的配置文件,修改后注入到更高优先级地方的方式解决问题。
关于配置文件,我们可能会遇到需要多个文件的问题,此时就可以创建application-dev.yml、application-test.yml文件,并在系统先加载的application.yml中进行spring.profiles.active的设置,确定启用哪个配置文件。这里补充一点,yml配置文件是以键值对的形式来配置的,一定要注意缩进问题和空格问题。在:后必须有空格才能被解析。
接下来我们做一下读取配置文件的问题。假如我们将“获取第三方的访问地址链接”功能加入了配置文件,代码如下:
third:
get:
url: http://www.baidu.com
此时我们可以使用@Value注解来拿到想要的值。这里继续用之前的helloWorld函数,修改后的代码如下:
package com.lxc.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FirstController {
@Value("${third.get.url}")
private String getUrl;
@RequestMapping("/hello")
public String helloWorld(){
System.out.println("获取到的数据为:"+getUrl);
return "hello world";
}
}
运行项目访问localhost:8080/hello,可以看到打印出我们想要的结果:
另外也可以用系统提供的Environment类解决问题,这里我就用@Value注解了就不研究新方法了。
以上内容结束之后可以说是有点入门的意思了,接下来我遇到了第一个重量级注解,也是一个应用相当广泛的注解@Controller。说到这个注解,首先我想到了前面提到的@RestController,这里我们新建一个User类,来再次操作一下。建立一个haveFun文件夹,User类代码如下:
package com.lxc.haveFun;
public class User {
private String name;
private Integer age;
private String sex;
public User() {}
public User(String name, Integer age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
我个人觉得无论存不存在含参构造器,把无参构造器写出来是一种好习惯,仅代表个人观点啊。对了写到这里我突然想起来之前遇到的一个坑,这里记得要将我们的APP程序放在所有包的最外面,否则会产生404的错误(也可以通过引入的方式解决,不过太烦人了懒得搞,不如将APP放最外面来得方便)。建完User类后我们可以建立咱们的第二个Controller类了,这次我们直接搞两个人出来,写三个@RequestMapping来加深理解。代码如下:
package com.lxc.haveFun;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/haha")
public class SecondController {
@RequestMapping("/second")
public User secondOne(){
User user = new User("张三", 5, "男");
return user;
}
@RequestMapping("/third")
public User thirdOne(){
User user = new User("李四", 3, "女");
return user;
}
}
很显然,我们通过localhost:8080/haha/second以及localhost:8080/haha/third就可以拿到两个User的信息了,结果如下:
根据之前了解过的知识,访问的时候有Get请求、Post请求等等,@RequestMapping注解可以解决限制请求方式的问题,我们让张三的信息只能用Get请求访问到,代码如下:
@RequestMapping(name = "/second", method = RequestMethod.GET)
public User secondOne(){
User user = new User("张三", 5, "男");
return user;
}
如果不想这么麻烦,可以直接使用@GetMapping注解一步到位。这里建议直接GetMapping吧,我用前面那种方法报错了。
解决基本问题之后我们来看一下传参问题。首先是Get传参,根据以前的知识,在路由的后面加上?XXXXX是可以传回参数的,后端只需要用某种东西接收参数就好。我们搞个新方法吧
@GetMapping("/getThings")
public String getThings(String name, Integer age, String sex){
System.out.println(name);
System.out.println(age);
System.out.println(sex);
return "后台已收到";
}
当然了,这种打印出来的方式感觉有点低水平,毕竟参数特别多就会非常麻烦。不如直接用User类来接参数来得痛快,代码和运行结果如下:
@GetMapping("/getThingsAgain")
public User getThingsAgain(User user){
return user;
}
最后说几句没啥用的吧。由于之前参考的博客有些偏差导致有一段时间学习的效果并不好,今天下午我才开始这一波的重新学习。以上是第一天的内容(两个小时),希望明天学习更顺利吧。本周老师给我安排了任务,要掌握增删改查,还剩下两天时间我觉得绰绰有余。