安裝
安裝依賴
maven是一個依賴管理工具,我們利用maven進行構建。創建一個maven項目,在pom.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> <groupId>1.0</groupId> <artifactId>SpringBoot</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> </parent> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
,接着在idea里面import change,或者執行mvn install來下載依賴。
啟動
在src根目錄創建一個包,然后將項目的代碼放進去。(注:App類不能直接放在src根目錄,否則將無法正常啟動)
package App; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
運行
點擊RUN,即可運行。如果是正常啟動,控制台會輸出
路由
什么是路由?
路由是什么?路由即我們瀏覽器上的地址,我們通過路由與服務器進行信息交互。例如:https://search.bilibili.com/all?keyword=老友記。在這個例子中,我們訪問https://search.bilibili.com/all,並且參數是老友記,直觀意思是搜索keyword是老友記的視頻。也可以這么理解,https://search.bilibili.com/all是一個函數,keyword是參數,通過調用函數來獲得對應的結果。
匹配方法和路由
在Spring Boot中,我們需要指定哪一個路由對應哪一個方法。
我們在一個Controller里面通過@RequestMapping注解來匹配路徑和對應的方法,以下是代碼例子。
@RestController
@RequestMapping("test") public class IndexController { @RequestMapping("index") public String fun() { return "hello Spring boot"; } }
@RestController注解的作用是表示這一個類是一個控制器類,並且返回的對象會自動轉換為JSON(如果返回字符串則還是字符串形式)。@RequestMapping作用是匹配路由和方法,當它加在類上的時候,就是給該類的所有路徑前加一層,但它加在方法上的時候,表示該路徑匹配該方法。在這個例子中訪問http://localhost:8080/hello/index,頁面即打印hello Spring boot。
返回Json對象
進一步,如果我們想要返回JSON對象,怎么辦呢?
@RestController注解的類會自動轉換對象為JSON的,如果只是用@Controller修飾類,則要在方法前加上@ResponseBody。以下演示如何返回Json對象。
@RequestMapping("person") public Object testJson() { return new Person("Overflow",18); }
在之前的控制器上加上以上代碼,Person是我們自己定義的類。在瀏覽器上打開即可以看到Json字符串
{"name":null,"age":18}。
指定請求方法
如果我們想指定路由的請求方法,我們可以在@RequestMapping指定method,method可以是單個對象,也可以是數組形式。
@RequestMapping( value = "index",method ={RequestMethod.GET,RequestMethod.POST} )
以上例子說明該路由請求可以用GET和POST訪問。如果不特別指定,則任何方法都可以訪問該路由。
接受路由參數
只有單純的路由是不夠的,路由可以附帶參數對服務器,那么我們綁定的方法要如何接受這些參數呢?
在Spring Boot里,我們只需要結合注解即可,以下介紹幾種例子
1、匹配路由中的參數
@RequestMapping("/person/{name}") public Object testJson(@PathVariable(name = "name")String name)
2、獲得get 或者post方法的參數
get方法路徑就是 http:localhost:8080/hello/data?name=Tom
post方法要把參數放在form-data中
@RequestMapping(value = "/data",method={RequestMethod.GET,RequestMethod.POST}) public Object accessData(@RequestParam(name="name") String name) { return name; }
3、接受Json對象
當參數比較多的時候,可以將參數解釋為一個對象。注意該類一定要有一個默認的構造方法。
@RequestMapping(value = "/json") public Object accessJsonData(Person person) { return person.getName(); }
4、接收HttpServletRequest對象
事實上以上的接收參數方法都是框架封裝HttpServletRequest對象,而我們獲得這個對象的方法很簡單,只需要在函數的參數列表里面聲明就好,Spring框架會為我們的方法注入該對象。
@RequestMapping(value = "/servlet") public Object selvlet(HttpServletRequest request) { return request.getRequestURL(); }
Session和Cookie
cookie的作用
cookie是存儲在瀏覽器端的數據。通常用於保存客戶端的狀態信息。
Session的作用
Http請求,與普通的程序不一樣,他是沒有狀態的。但是許多應用需要記錄用戶的狀態,例如用戶的登錄信息等等,這時候就利用session技術來存儲。當瀏覽器與服務器進行交互,服務器會分配一個SessionID給瀏覽器,瀏覽器會把這個ID保存在cookie里,然后每一次發送請求的時候都會將這一個sessionID附上,然后服務器就可以獲得該ID的相關數據。
Map<String,Map<String,Object>> Session
Session的使用類似於以上的代碼說明,一個SessionID對應一個Map來存儲數據。
當然在Spring Boot里面,不需要手動地調用sessionID,就能獲取對應該ID的HttpSession對象。
@RequestMapping(value = "/sessionAndCookie") public Object sessionAndCookie(HttpSession session, HttpCookie cookie)
與數據庫交互數據
什么是ORM?
數據庫的數據是通過字段來存儲信息的,如果Java類的屬性能夠與數據庫的字段互相映射,那么我們就可以像操作Java對象一樣操作數據庫數據,方便的進行增刪查改操作。
SpringBoot與MySQL進行數據交互
添加依賴
在原來的pom.xml里面添加以下依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
在resource文件夾新建一個application.properties文件,這是一個配置文件
spring.jpa.hibernate.ddl-auto=none spring.datasource.url=jdbc:mysql://localhost:3306/你的數據庫名稱 spring.datasource.username=username spring.datasource.password=password
spring.jpa.hibernate.ddl-auto的作用,在這里我直接引用文檔的解釋
Here, spring.jpa.hibernate.ddl-auto
can be none
, update
, create
, create-drop
, refer to the Hibernate documentation for details.
-
none
This is the default forMySQL
, no change to the database structure. -
update
Hibernate changes the database according to the given Entity structures. -
create
Creates the database every time, but don’t drop it when close. -
create-drop
Creates the database then drops it when theSessionFactory
closes.
創建與數據庫表對應的Entity類
@Entity @Table(name = "user") public class User { @Id public int id; public String username; public String password; public int power; }
注解解釋,@Entity注解表示該類是一個與數據庫映射的類,@Table表示這個類綁定的是user表,@Id表示id是主鍵。
創建Repository類
這個類是與數據庫進行交互用的,我們要繼承Spring框架給我們提供的一個接口,CrudRepository<>,在使用的時候Spring框架會為我們自動注入相關的方法,方便我們進行增刪查改
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> { <S extends T> S save(S var1); <S extends T> Iterable<S> save(Iterable<S> var1); T findOne(ID var1); boolean exists(ID var1); Iterable<T> findAll(); Iterable<T> findAll(Iterable<ID> var1); long count(); void delete(ID var1); void delete(T var1); void delete(Iterable<? extends T> var1); void deleteAll(); }
解釋以上相關的函數
save(S var) 傳入對象即可保存在數據庫對象,如果我們的對象有指定ID,則會更新相應ID的記錄
delete(ID var1) 傳入ID即可刪除對應ID的記錄
構造查詢方法
以下是我們的UserRepository的例子
public interface UserRepository extends CrudRepository<User,Long> { //1、通過函數名來進行查詢 User findByUsername(String username); List<User> findUsersByUsername(String username); //2、通過指定HQL語句進行查詢 @Query("select u from User u where u.username= :username and u.password= :password") User findUser(@Param("username") String name,@Param("password") String password); }
查詢方式有兩種
一種是Spring Data提供的通過一定規范的函數名進行查詢
另一種是利用@Query注解,指定HQL,來實現復雜的查詢
大家看到這里可能會疑惑,為什么只需要定義方法名,而不需要寫具體的方法體呢。這是Spring框架的優勢,因為對象都是由Spring來管理,因此只需要給與必要的信息給框架識別,框架就能夠構建一個繼承你的接口的函數,接着按照Spirng自動載入的方法,將該對象引入類中即可。
在Controller類里使用Repository類
@RestController @RequestMapping("user") public class UserController { @Autowired UserRepository userRepository; @RequestMapping("find/{name}") public Object findUser(@PathVariable("name")String name) { return userRepository.findByUsername("hello"); } @RequestMapping("check/{name}/{password}") public Object checkUser(@PathVariable("name") String name,@PathVariable("password") String password) { return userRepository.findUser(name, password); } }
利用@AutoWired即可自動載入我們定義的UserRepository
參考資料
1、http請求方法:http://www.runoob.com/http/http-methods.html
2、spring boot文檔:http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/
3、spring data jpa文檔:http://docs.spring.io/spring-data/jpa/docs/2.0.0.M4/reference/html/#jpa.query-methods
4、spring boot guide:https://spring.io/guides/gs/rest-service/