使用SpringBoot開發JavaWeb應用入門
使用SpringBoot開發JavaWeb應用入門
0、環境及開發工具準備
環境
- 首先是jdk,可以到oracle官網(oracle.com)下載jdk,版本用8或11都行,本文演示使用8
- 然後是資料庫,本文使用MySQL5.7
開發工具
可以使用sts或者idea,本文使用idea,下載地址(https://www.jetbrains.com/idea/download/#section=windows
1、建立專案
統一編碼
建立專案之前,首先統一字符集以防止中文亂碼
設定idea編碼:
啟動時右下Configure - Settings
然後搜尋encoding,兩個都改為UTF-8,確認即可
建立SpringBoot專案
點選Create New Project
左邊選擇Spring Initializr,右邊Project SDK選擇jdk1.8,如果沒有的話就New一個
然後點選Next填寫專案資訊,這裡我就全部預設,繼續Next
這裡選擇專案依賴,暫時只勾選Web下的Web,繼續Next
最後一步,填寫專案名和選擇專案存放位置
這裡我也都默認了(專案位置強烈不建議使用帶有中文和特殊字元的路徑),Finish
然後idea會自動幫我們下載專案依賴包,此時需要保持網路穩定
整個專案的結構大致是這樣的
啟動看看效果
點選DemoApplication或者main方法前面的綠色小箭頭即可啟動應用
看到控制檯打出了Tomcat started on port(s): 8080 (http) with context path ''
這句日誌,開啟瀏覽器輸入網址http://localhost:8080
即可看到如下介面
這是一個預設的錯誤頁面,但也足以說明專案成功啟動了
2、編寫控制器(Controller)
上一節說到啟動後展示了一個預設的錯誤頁面,相信很多人都能看懂那個錯誤,404嘛
因為我們沒有指定應該展示什麼頁面。
接下來我們就來指定一下
新建一個Controller
在啟動類DemoApplication的包名上右鍵新建一個包,取名就叫controller
在新建的controller包上右鍵新建一個Java Class,就叫IndexController吧
新增一個請求對映
在新建的IndexController裡新增如下程式碼
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController {
@RequestMapping(value = "/", method = RequestMethod.GET)
@ResponseBody
public String index() {
return "<h1>Hello SpringBoot</h1>";
}
}
點選右上角重啟應用
重新整理瀏覽器即可看到我們在index方法裡return的Hello SpringBoot
請求對映簡解
如何對映一個url地址到一個具體方法呢?我們來看一下IndexController類的內容
- 首先這個類得是控制器類,IndexController為什麼是控制器呢,不是因為他叫xxxController,而是因為他頭上的@Controller註解
@Controller
public class IndexController {
- 然後看這個方法
@RequestMapping(value = "/", method = RequestMethod.GET)
@ResponseBody
public String index() {
return "<h1>Hello SpringBoot</h1>";
}
- 首先是@RequestMapping(value = “/”, method = RequestMethod.GET)
- @RequestMapping是指把一個請求對映到這個方法來處理
- value指的是那個url,這裡的url是相對的url,即相對於
http://localhost:8080/
的url - method是指請求方法,最常用的有GET,POST,PUT,DELETE等,我們從瀏覽器裡直接輸的網址,是GET請求
- 這個註解還有一種簡寫
@GetMapping("/")
,對應的也有@PostMapping,@PutMapping,@DeleteMapping等 - 最後是@ResponseBody註解,他表明把這個方法的返回值直接返回給瀏覽器,如果不加這個註解,將會解析並返回檢視,接下來就講講返回檢視的操作
3、使用模板引擎
Java的模板引擎有很多,這裡使用SpringBoot官方推薦的thymeleaf
,教程參考
首先新增依賴
在專案根目錄的pom.xml
的標籤內部新增如下內容
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
然後在src/resources/templates下新建一個test.html
最後新增一個請求對映到這個html
在IndexController裡新增一個方法,如下
@GetMapping("/test")
public String test() {
return "test";
}
開啟http://localhost:8080/test
即可看到這個頁面
4、使用資料庫
首先依然是新增依賴
在pom.xml
中的dependencies
標籤內新增以下依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<exclusions>
<exclusion>
<artifactId>protobuf-java</artifactId>
<groupId>com.google.protobuf</groupId>
</exclusion>
</exclusions>
</dependency>
配置資料庫連線資訊
在src/main/resources/application.properties
中加入以下配置
# MySql驅動類
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 連線地址,最後的/demo是資料庫名,改成自己的即可
spring.datasource.url=jdbc:mysql://localhost:3306/demo
# 資料庫使用者名稱
spring.datasource.username=root
# 資料庫密碼
spring.datasource.password=root
# 自動更新表結構的配置
spring.jpa.hibernate.ddl-auto=update
建立實體
在com.example.demo
包下新建一個entity
包,並在包內新建一個User
類,寫入以下內容
package com.example.demo.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private String username;
@Column
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
建立資料訪問類
在com.example.demo
包下新建一個repository
包,並在包內新建一個UserRepository
介面,寫入以下內容
package com.example.demo.repository;
import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, String> {
}
其中extends JpaRepository<User, String>
中尖括號內的User代表此資料訪問類對應的實體,String代表實體的主鍵
測試資料讀寫
修改IndexController,新增一個成員變數,新增兩個url對映
@Controller
public class IndexController {
@Autowired
private UserRepository userDao;
@GetMapping("/db/save")
@ResponseBody
public String dbSave() {
User u = new User();
u.setUsername("lenchu");
u.setPassword("lenchu");
userDao.save(u);
return "success";
}
@GetMapping("/db/get")
@ResponseBody
public User dbGet() {
Optional<User> user = userDao.findById("lenchu");
return user.get();
}
}
資料庫的使用就先說這麼多,下面做一個簡單的註冊登入的小例子
5、註冊登入小案例
- 在controller包下新建
UserController
,內容如下
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpSession;
import java.util.Map;
@Controller
public class UserController {
private final UserRepository userDao;
public UserController(UserRepository userDao) {
this.userDao = userDao;
}
@GetMapping("/user/add")
public String addView() {
return "reg";
}
@PostMapping("/user/add")
public String add(@RequestParam String username, @RequestParam String password) {
if (username == null || password == null || "".equals(username) || "".equals(password)) {
return "使用者名稱或密碼不能為空";
}
User user = new User();
user.setUsername(username);
user.setPassword(password);
userDao.save(user);
return "redirect:/user/login";
}
@GetMapping("/user/login")
public String loginView() {
return "login";
}
@PostMapping("/user/login")
public String login(@RequestParam String username, @RequestParam String password, HttpSession session) {
if (username == null || password == null || "".equals(username) || "".equals(password)) {
return "使用者名稱或密碼不能為空";
}
User user = userDao.findByUsernameAndPassword(username, password).orElse(null);
session.setAttribute("user", user);
return "redirect:/home";
}
@GetMapping("/home")
public String home(Map<String, Object> map, HttpSession session) {
map.put("user", session.getAttribute("user"));
return "index";
}
}
UserRepository
中新增一個方法,如下
public interface UserRepository extends JpaRepository<User, String> {
Optional<User> findByUsernameAndPassword(String username, String password);
}
- 在
src/resources/templates
下新建三個html,分別如下
reg.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>註冊</title>
</head>
<body>
<div>
<form method="post" th:action="@{/user/add}">
<input name="username" type="text" placeholder="Username"><br>
<input name="password" type="password" placeholder="Password"><br>
<input type="submit" value="註冊">
</form>
</div>
</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>登入</title>
</head>
<body>
<div>
<form method="post" th:action="@{/user/login}">
<input name="username" type="text" placeholder="Username"><br>
<input name="password" type="password" placeholder="Password"><br>
<input type="submit" value="登入">
</form>
</div>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>歡迎</title>
</head>
<body>
<h1 th:text="${user == null ? '請先登入' : '歡迎您:' + user.username}"></h1>
</body>
</html>
6、獲取示例程式碼
Github: https://github.com/lengchu/springboot-minidemo
Gitee: https://gitee.com/lenchu/springboot-minidemo