iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 8
1
Modern Web

30天學習Spring MVC系列 第 8

Day 8 Spring MVC-@Service的使用

首先要介紹@Service前我要先介紹一下 ,簡單的MVC架構,對於第一次接觸MVC架構的人可能會有點不了解

首先MVC中指的三層架構對應為

  • M-Model(數據模型層):
    1.功能:將從資料庫取出來的資料存入Model或者業務邏輯層中使用的的數據存到Model
  • V-View(層):
    2.功能:呈現出Model數據的頁面,但是也可以沒有任何的Model單純展示頁面的一層(渲染頁面)
  • C-controller(控制層)
    3.功能:不能層之間的交互傳遞控制

三層互動模式示意圖
https://ithelp.ithome.com.tw/upload/images/20171227/20107812hRy77DgsLm.png

這是很簡單的介紹,我沒說明太多相關的術語怕搞亂了大家的思考邏輯

那這跟我們要介紹的@Service有什麼關聯?

Service層是位於Controler與Model的中間

Service層可以將Controler與Model層做解耦

簡單來說:
我要取得一個會員的資料,我是使用我的取得會員資料的服務去做處理,然後將處理完的結果存入Model中
回傳,這樣可以讓我們的controller可以保持著程式碼識別度,在要修改Model層或controller層中的程式
碼就不需要牽一髮動全身了

Spring也是透過控制反轉(Inversion of Control)IOC與依賴注入(dependency injection)DI
來完成我們的MVC架構,但是光要講IOC與AOP的概念可能會太抽象,我們用實際的例子來介紹它們

那在Spring MVC中如何實現Service層呢?
ex:

我們來看看以下的程式碼

在src->main->java下新增一個New Package叫com.tutorial.SpringTutorial.Service做好我們的類別分類

如下圖:
https://ithelp.ithome.com.tw/upload/images/20171227/20107812y8jJK4q6Jt.png

新增一個Class:名稱UserService
在建好的package:Service點選右鍵->New Class->Name輸入UserService

https://ithelp.ithome.com.tw/upload/images/20171227/20107812xGKnc5PwHp.png

加入以下程式碼

package com.tutorial.SpringTutorial.Service;

import org.springframework.stereotype.Service;

@Service
public class UserService {
  public Integer getUserId(){
	  System.out.println("進入了UserService的getUserId方法");
	  int userId=5;
	  return userId;
  }
}

UserController代碼

package com.tutorial.SpringTutorial;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import com.tutorial.SpringTutorial.Service.UserService;

@Controller
public class UserController {
	@Autowired
	UserService userService;

	 @GetMapping("/")
		public String index(Map<String, Object> model) {
		 	model.put("ID", userService.getUserId());
			return "index";
		}

}

建好Service

重點說明:
1.在Service的public class UserService上方加入@Service對這個類別宣告為Spring管理的一個Bean
2.在UserController下方下方使用@Autowired將UserService的實體Bean注入到UserController讓
UserController擁有UserService的功能

重新啟動我們的Spring Boot Application
在瀏覽器輸入
(http://localhost:8080)

出現如下圖!!!
我們成功了讓UserController擁有了UserService的功能 ~~
https://ithelp.ithome.com.tw/upload/images/20171227/20107812VoJb3NdTLA.png

我目前已經將頁面顯示方式改成以thymeleaf的模板引擎配置記住複習一下重點!要使用thymeleaf在application.properties加入spring.thymeleaf.prefix=classpath:/templates/要將
spring.mvc.view.prefix = /WEB-INF/jsp/
spring.mvc.view.suffix = .jsp註解掉

如下圖:
https://ithelp.ithome.com.tw/upload/images/20171227/20107812FwFEUStfhq.png

然後在src->main->resources底下的templates新增一個index.html檔案
頁面程式如下:

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>My first Page by thymeleaf</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <div th:text=" ${ID} + '!'" /></div>
</body>
</html>

明天我們來建資料庫吧~~~


上一篇
Day 7 Spring Boot-Controller(下)
下一篇
Day 9 MariaDB-安裝
系列文
30天學習Spring MVC30

2 則留言

1
connor0225
iT邦新手 5 級 ‧ 2018-11-12 13:51:06

您好,
我按照你文章中的方式進行佈署配置,
但仍發生error,
出現
Description:

Field userService in com.example.demo.UserController required a bean of type 'com.example.Service.UserService' that could not be found.

The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type 'com.example.Service.UserService' in your configuration.

不曉得是什麼原因,
還望您能協助,
感謝。

已找到解決方法,
在maind的class中需加上@SpringBootApplication(scanBasePackages="xxxx"),
xxxx= package ,
以我為例的話為com.example,
才可以正常執行,
至於原因就不清楚了.............

hsiwei iT邦新手 5 級 ‧ 2018-11-14 16:00:21 檢舉

connor0225
我也遇到跟你一樣的問題!!!
照你的方法做解決了
謝謝您

0
sa0124
iT邦新手 5 級 ‧ 2019-03-12 17:21:30

@GetMapping("/")
public String index(Map<String, Object> model) {
model.put("ID", userService.getUserId());
return "index";
}

return "index" => return 到 index那一頁 筆記一下~~

我要留言

立即登入留言