1. 程式人生 > >使用SpringBoot開發JavaWeb應用入門

使用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

),下載旗艦版(Ultimate)可以免費試用30天

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,教程參考

https://www.thymeleaf.org/documentation.html

首先新增依賴

在專案根目錄的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