对spring框架盛行了多年的java方向开发人员来说,每个人java开发已经把spring框架当做开发中不可或缺的一部分。之前传统的模式都是以applicationContext.xml配置文件的形式存在,而对应大多数入门级开发人员来说配置出现一点纰漏就会导致运行失败或者更大的问题,因此会浪费开发人员很多宝贵的时间,对公司来说也是有所损失。那么spring开源组织很早之前就意识到这种问题的存在,于是他们便对spring框架的全系列组件进行了内部封装。对外只是提供**maven(jar管理、项目打包工具)或者gradle(新兴jar管理、项目打包工具)**的形式来进行引入parent.pom(maven配置文件)或者parent.gradle(gradle配置文件),让每一个spring项目都是以spring的子项目的形式来运行,这样开发人员不用再去注重配置文件的繁琐而是把精力放到业务逻辑以及更深层次的架构方面。自此SpringBoot就诞生了,它有着纯正的开源血统,在此非常感谢spring开源组织给我们java开发人员带来的便利!
使用springboot完成一个简单的web(springmvc)应用程序,通过@restController输出"HelloWord"到界面,让我们初步体验springboot的快速开发、简单的特性。
目前构建项目有多种方式我这里简单介绍两种。
1、使用spring官网 SPRING INITIALIZR 来构建项目结构(地址:http://start.spring.io/)
2、使用IntelliJ IDEA开发工具来构建项目结构
访问start.spring.io/网址就会看到如下 “图1” 界面:
界面主要部分包括:管理工具,springboot版本,包名(group),工程名(Artifact),已选模块(我已经选择了一个web模块)。
点击Generate Project就会下载一个根据你输入的信息创建的项目工程架构源码的压缩包。
解压压缩包到指定目录(目录你可以随意定义)我这里为了后续操作先定义到E:/lessions内可以看到如下“图2”所示:
解压完成之后我们就可以通过IntelliJ IDEA开发工具导入到工程,
打开工具,界面如下 “图3” 所示:
我们点击Create New Project来创建一个新的springboot应用程序,点击后如下“图4”所示:
我们点击Next继续下一步操作,根据界面输入选项填写对应的内容即可如“图5”所示:
点击Next即可完成创建项目,而且创建完成后会自动导入到项目工程内就不需要再次import操作,这种方式会比较简单些,所以我们的文章内都会采用第二种形式来创建新工程。
我们来看看工具为我们生成新工程的目录结构,如”图6“所示:
我们可以看到目录结构有如下几个:
1、/src/main/java/ 存放项目所有源代码目录
2、/src//main/resources/ 存放项目所有资源文件以及配置文件目录
3、/src/test/ 存放测试代码目录
SpringBoot21Application 该类是程序的入口类内有个main方法,可以直接通过run as运行项目
application.properties 该配置文件是项目的核心配置文件,以xx.xx.xx的形式存在
pom.xml maven配置文件,因为我们采用的maven管理jar,所以这里会自动生成一个pom文件
我们可以看到工具为我们自动生成的入口程序是有@SpringBootApplication的这么一个注解,那它主要是做什么的呢?不难看出,它是声明当前类为sprinboot的入口类。而一个springboot项目内有且只能有一个这个注解存在。
我们在入口程序类中右键->Run LessonOneApplication在控制台的输出如下”图8“所示,证明你已经成功的运行了springboot项目。
可以看到我们的项目是通过内置的tomcat容器启动的,并且端口号默认是8080(至于如何修改端口号后期文章中更新)。我们现在通过浏览器直接访问是得不到任何回应的,只是会有一个错误页面,如下”图9“所示
我们首先在**/src/main/java/com/lqg** (该目录是你构建项目的目录) 目录下创建一个叫做controller的包,然后在controller包下再创建一个叫做IndexController的类,我们使用@RestController来声明我们新创建的IndexController是一个访问控制器,详细代码如下:
package com.lqg.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/index")
public class IndexController {
@RequestMapping
public String index(){
return "hello spring boot";
}
}
可以看到我在IndexController类上配置了一个**@RequestMapping**注解来声明index()方法可以通过127.0.0.1:8080/index访问到,那么我们接下来重新启动项目(项目中如果重启出错应该是注解配置问题),访问地址如下”图10“所示:
在IndexController类里面在写一个方法,返回值是map集合,参数列表是String类型的name,@RequestParam简单类型的绑定的注解,这个注解要放在参数列表的前面
package com.lqg.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
@RestController
@RequestMapping(value = "/index")
public class IndexController {
@RequestMapping
public String hello(){
return "hello spring boot ";
}
/**
* @RequestParam 简单类型的绑定,可以出来get和post
* @param name
* @return
*/
@RequestMapping(value = "/get")
public HashMap<String,Object> get(@RequestParam String name){
HashMap<String,Object> map = new HashMap<>();
map.put("title", "hello world");
map.put("name", name);
return map;
}
}
那么Controller层是如何返回一个Bean对象呢?先在/src/main/java/com/lqg下面创建一个bean包,在bean包里创建一个User类,详细代码如下:
package com.lqg.bean;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
/**
* @author 凌枫lqg
*/
@Getter
@Setter
public class User {
private int id;
private String name;
private Date date;
}
@Getter@Setter:注解是lombok插件里面的,用这个注解就可以省略getter和setter方法
package com.lqg.controller;
import com.lqg.bean.User;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.xml.crypto.Data;
import java.util.Date;
import java.util.HashMap;
@RestController
@RequestMapping(value = "/index")
public class IndexController {
@RequestMapping
public String hello(){
return "hello spring boot ";
}
/**
* @RequestParam 简单类型的绑定,可以出来get和post
* @param name
* @return
*/
@RequestMapping(value = "/get")
public HashMap<String,Object> get(@RequestParam String name){
HashMap<String,Object> map = new HashMap<>();
map.put("title", "hello world");
map.put("name", name);
return map;
}
/**
* @PathVariable 获得请求url中的动态参数
* @param id
* @param name
* @return
*/
@RequestMapping(value = "/find/{id}/{name}")
public User get(@PathVariable int id,@PathVariable String name){
User user = new User();
user.setId(id);
user.setName(name);
user.setDate(new Date());
return user;
}
}
SpringBoot测试可以通过Spring提供的测试类MockMvc
package com.lqg;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import com.lqg.controller.IndexController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import com.lqg.controller.IndexController;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootDemo21ApplicationTests {
//SpringBoot测试可以通过Spring提供的测试类MockMvc
private MockMvc mvc;
@Before
public void setup() {
//这是通过setup方法引入mvc
this.mvc = MockMvcBuilders.standaloneSetup(new IndexController()).build();
}
@Test
public void contextLoads() throws Exception {
//生成request一个请求
RequestBuilder request = get("/index");
//用mvc的请求,期望它的状态码是ok的,期望它返回的内容,返回的是一个字符串hello spring boot
mvc.perform(request).andExpect(status().isOk()).andExpect(content().string("hello spring boot"));
}
}