JavaRush /Java Blog /Random-TW /Maven、Spring、MySQL、Hibernate 和第一個 CRUD 應用程式簡介(第 1 部分)
Макс
等級 41

Maven、Spring、MySQL、Hibernate 和第一個 CRUD 應用程式簡介(第 1 部分)

在 Random-TW 群組發布
午安. 在這篇文章中,我想分享我在創建一個簡單的 CRUD 應用程式的過程中第一次接觸到 Maven、Spring、Hibernate、MySQL 和 Tomcat 等東西。這是 4 的第一部分。本文主要針對那些已經完成 30-40 級,但尚未超越純 Java 並剛開始(或即將開始)進入開放世界的人所有這些技術、框架和其他陌生的詞彙。 Maven、Spring、MySQL、Hibernate 和第一個 CRUD 應用程式簡介(第 1 部分)- 1

內容:

介紹

透過研究各種使用它們的範例,我開始熟悉對我來說陌生的技術和框架,因為通常當我使用成熟的應用程式範例看到它的實際運行時,我才能最好地理解它。通常,此類範例是CRUD應用程式(建立讀取更新刪除),網路上充滿了此類不同複雜程度的範例。問題是,他們通常不會詳細解釋如何、做了什麼以及為什麼做了,為什麼添加了這樣那樣的依賴項,為什麼需要這樣那樣的類別等等。在大多數情況下,他們會採用一個完全完成的應用程序,帶有最終的POM 文件和類的最終版本,然後簡單地運行每個應用程序,而不關注對有經驗的人來說可能看似顯而易見的小事。我看過很多這樣的例子,通常很清楚一切是如何運作的,但他們是如何做到這一點的並不完全清楚。因此,我認為這樣的例子是有用的,不是從經驗豐富的開發人員的角度來看,而是從從未接觸過 Spring、Hibernate 和其他東西的初學者的角度來看。
Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 2
我將嘗試盡可能詳細地描述(在我的理解允許的範圍內)我創建 CRUD 應用程式的整個路徑,從最簡單的 Hello World 層級開始。首先,我這樣做是為了自己,因為當你嘗試描述、講述、解釋某件事時,它會更好地在你的頭腦中被吸收和組織。但如果這對某人有用並幫助他們解決問題,我會非常高興。在此範例中,讓我們嘗試使用MavenTomcatSpringHibernateMySQL建立一個簡單的 CRUD 應用程式。初步步驟如安裝MavenMySQL、使用Ultimate版本的 idea 等。我想不用詳細描述了,這應該沒問題。值得注意的是,在這個範例中,配置將使用 Java 類別(稱為 JavaConfig)進行配置,而不使用 xml。

創建專案

所以,由於我是新手,我們不會使用任何晦澀的原型。Spring Initializr 聽起來還是太可怕了。因此,我們將創建一個最普通的簡單Maven專案。我沒有域名,因此在 groupid 中我只寫testgroup,在 artifactid 中我寫名稱,例如filmography(這將是電影列表)。我們創建一個項目,並Enable auto-import在有想法時做出選擇。由於此,每次我們對 POM 檔案(專案物件模型,該檔案描述了 Maven 專案的整個結構)進行任何變更時,所有內容都會立即自動套用至專案。如果我們已經擁有這些庫,或者如果我們使用一些以前沒有處理過的新依賴項,則將從我們的本地存儲庫中獲取這些庫,Maven 將簡單地透過 Internet 從中央存儲庫下載它們。Maven還有下載原始碼和文件的功能(Download Sources and/or Documentation)。這也很方便,如果對某個類別或方法有不清楚的地方,可以去原始碼看看裡面是如何運作的。讓我們添加一些細節。這將是一個 Web 應用程序,我們將使用Tomcat。要將應用程式部署到 Tomcat,您需要將其以 war 存檔(Web 應用程式資源,Web 應用程式的特殊格式)的形式傳輸到 Tomcat。為此,請將以下行新增至 POM 檔案中,以便將應用程式編譯到 war 檔案中:
<packaging>war</packaging>
好吧,您還需要一個專門的 Web 來源目錄,在我們的例子中將有jsp頁面和一些 Web 資源。讓我們建立一個main目錄webapp。它的名稱和定位main方式應該與 完全相同javaresources因為這是標準的 Maven 目錄結構。一旦我們安裝了該套件war並確定這是一個 Web 項目,該目錄webapp將自動標記為 Web 應用程式來源(上面會有一個藍點),並且與 Web 相關的所有內容都會在此資料夾中搜尋。一會兒。預設情況下,Maven 使用語言版本 1.5,但我想使用版本 1.8 - Java 8(您可以採用 10 或 11,但仍然沒有計劃使用其中的任何功能,因此將其設為 8 )。這個問題可以很簡單地解決,我們在 Google 中編寫類似「Maven java 8」的內容,然後查看需要添加到 POM 檔案中的內容,以便 Maven 編譯我們的類別以獲得所需的版本。結果,我們有以下結果: Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 3

Spring MVC 連接

你必須從某個地方開始。按照計劃,我們將連接資料庫並使用Hibernate,但這一切目前聽起來有點太可怕了。我們需要先做一些更簡單的事情。Spring MVC,這個已經比較好了,我們已經熟悉MVC模式很久了,課程中一半的大型任務都用到了它。從這裡我們將開始跳舞。要使用 Spring MVC 建立 Web 應用程序,我們還需要一個 Servlet-API,即 請求-響應交互將在其幫助下發生的東西。讓我們嘗試連接這個。我們去 Google,在Maven 存儲庫中查找必要的依賴項,並將它們添加到pom.xml. Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 4在外部函式庫部分,您可以看到不僅載入了spring-webmvc,還載入了一堆其他東西。那些。我們不需要另外包含spring corecontextbeans等的依賴項。我們需要的一切都與spring-webmvc一起被拉起。

我們需要做一個小小的免責聲明。通常建議仍然為每個使用的庫單獨添加依賴項,即使它們已經與已添加的庫捆綁在一起,因為 這可以幫助避免一些問題和故障。

一個簡單的例子。假設我們新增了一個使用某些 API 的依賴項,同時它將拉出該 API 的某種實作。然後我們添加了另一個使用相同 API 的依賴項,並為此提取了一些實現,但這次有所不同。因此,我們將擁有同一 API 的 2 種不同實作。而如果我們自己想在某個地方使用這個API的某些方法,那麼就會出現一個問題,因為系統不會知道要使用哪個實現,它會隨機選擇,也許不是我們期望的。如果您明確指定其中一個實作的依賴關係,那麼將優先考慮它。

然而,這並不是一個嚴格的建議;它主要適用於使用來自不同公司的許多不同庫的大型專案。我們不會在這裡這樣做,以免加載過多的 POM 檔案;預計不會出現問題。但儘管如此,仍然值得牢記這一點。

還有一點注意。provided依賴是什麼意思javax.servlet-apiScope是依賴項的範圍,provided這意味著依賴項在編譯和測試應用程式的階段將可用,但不會被存檔。事實上,為了部署應用程序,我們將使用 servlet 容器 Tomcat,並且它內部已經有這樣的庫,因此無需將它們傳輸到那裡並給存檔帶來不必要的負載。展望未來,出於同樣的原因,我們將不使用通常的方法main,因為它已經存在於 Tomcat 中。

建立頁面和控制器

現在讓我們嘗試做一些簡單的事情。首先,讓我們建立一個webapp額外的目錄,例如pages,我們的視圖將儲存在其中,即 jsp 頁面,並建立幾個頁面。例如,我們將來需要一個頁面來顯示電影列表,films.jsp也許我們可以製作一個單獨的頁面進行編輯,就這樣吧editPage.jsp。我們暫時不會在其中填寫任何嚴肅的內容;只是為了測試,我們將在一個頁面上創建到另一個頁面的連結。 現在我們需要一個處理請求的類,即 控制器。讓我們添加一個新的套件controller並在其中創建一個類別FilmController(一般來說,沒有必要將所有內容都打包在不同的套件中,這個應用程式會非常小且簡單,但是在正常的專案中可以有很多控制器,配置類,模型等等,所以即使從小專案開始,最好立即習慣以有序和結構化的方式做所有事情,這樣就不會出現混亂)。在此類中,我們將創建一些方法來返回我們的視圖以回應請求。
package testgroup.filmography.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class FilmController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView allFilms() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("films");
        return modelAndView;
    }

    @RequestMapping(value = "/edit", method = RequestMethod.GET)
    public ModelAndView editPage() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("editPage");
        return modelAndView;
    }
}
重點是什麼?Spring MVC 有一個東西叫做DispatcherServlet. 這就像主控制器一樣,所有傳入請求都經過它,然後將它們傳遞到特定控制器。該註解@Controller只是告訴 Spring MVC 這個類別是一個控制器(嗯,一般來說是邏輯的),調度程序將檢查註解@RequestMapping以呼叫適當的方法。此註釋@RequestMapping可讓您設定控制器方法的位址,透過該位址它們將在客戶端(瀏覽器)中可用。它也可以應用於控制器類別來設定所有方法的根位址。此方法的allFilms()參數value設定為“ /”,因此在瀏覽器中輸入http://host:port/組合時(即預設為http://localhost:8080/http ://127.0 .0.1:8080/) 。此參數method指定支援什麼類型的請求(GET、POST、PUT 等)。由於這裡我們只接收數據,所以使用GET。稍後,當新增和編輯的方法出現時,已經有POST請求了。(順便說一句,您可以等效地使用註釋等來代替@RequestMapping指示方法的註釋))。在我們的方法中,我們建立一個物件並設定需要傳回的視圖的名稱。 @GetMapping@PostMapping@GetMapping@RequestMapping(method = RequestMethod.GETModelAndView

配置

讓我們繼續設定配置。讓我們在包中創建config一個類別WebConfig。它將只有一個傳回 type 物件的方法ViewResolver,這是按名稱查找表示所需的介面。
package testgroup.filmography.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "testgroup.filmography")
public class WebConfig {

    @Bean
    ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}
@Configurationbean告訴Spring這個類別是一個配置類,包含元件的定義和依賴關係。Bean是由 Spring 管理的對象。該註解用於定義 bean @Bean@EnableWebMvc允許您從WebMvcConfigurationSupport. 例如,您還可以實現一個WebMvcConfigurer具有大量方法的接口,並根據您的喜好自訂所有內容,但我們還不需要深入討論,標準設定就足夠了。 @ComponentScan告訴 Spring 在哪裡尋找它應該管理的元件,即 以註解@Component或其衍生標記的類,例如@Controller@Repository@Service。這些註解自動定義類別 bean。在該方法中,viewResolver()我們創建其實現並確定在webapp. 因此,當我們在控制器方法中設定名稱“ films”時,視圖將被發現為“ /pages/films.jsp”所以,我們有一個配置類,但現在它只是某種單獨的類,它不會以任何方式影響我們的應用程式. 我們需要在 Spring 上下文中註冊此配置。為此你需要一個類別AbstractAnnotationConfigDispatcherServletInitializer。在套件中,config我們創建它的後繼者,例如AppInitializer,並實現它的方法。
package testgroup.filmography.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}
最後一個方法註冊地址,還有另外 2 個方法用於註冊配置類別。ViewResolver定義 等的Web 配置位於getServletConfigClasses(). 最好在文件和各種指南中閱讀所有這些內容,但在我們的例子中,還沒有必要深入研究這一點,WebConfig原則上,我們的可以RootClasses在兩者中定義,您甚至可以同時定義兩者,它仍然可以工作。還有一件事。當從表單發送帶有俄語字元的值時,結果可能是亂碼,這可能會出現編碼問題。為了解決這個問題,我們將新增一個過濾器來預處理請求。我們轉到AppInitializer類別並重寫該方法getServletFilters,在該方法中我們指示所需的編碼,當然,它應該與其他地方相同,如頁面和資料庫中:
protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[] {characterEncodingFilter};
    }
好了,一切似乎都已設定完畢,您可以嘗試運行它,看看會發生什麼。 運行->運行->編輯配置->新增配置-> Tomcat 伺服器->本地 接下來,您需要選擇要部署的工件。這個想法本身就會給一個提示:Warning: Noartifactsmarkedfordeployment。點擊“修復”按鈕並選擇...:戰爭爆發。或者您可以轉到Deployment -> add -> Artifact -> ...: warexpededЗнакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 5您還需要轉到「部署」並將Applecation 上下文欄位(這將是應用程式在瀏覽器中可用的 url 位址的一部分)設為「/」。 然後我們的應用程式將立即在http://localhost:8080/Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 6上可用(但您也可以在那裡指定一些內容,例如“ ”,然後您只需將其添加到所有地址,即例如不會有“ http://localhost:8080/edit”,但它將是“http://localhost:8080/filmography/edit”)。點擊“運行”並等待其啟動。這就是我得到的: 一切似乎都很好,但有一個警告。事實是,我們的頁面現在可以公開訪問,並且可以透過在網址列中寫入路徑來直接訪問。我們輸入http://localhost:8080/pages/films.jsp,現在我們在控制器不知情的情況下收到了我們的頁面。不知怎的,這不是很正確,所以我們將創建一個特殊的目錄。裡面的內容將對公眾隱藏,只能透過控制器存取。我們將帶有視圖 ( )的目錄放置在 中,並相應地將其添加到前綴中: /filmographyЗнакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 7webappWEB-INFpagesWEB-INFViewResolver
viewResolver.setPrefix("/WEB-INF/pages/");
現在我們的頁面位於http://localhost:8080,但如果我們直接嘗試訪問http://localhost:8080/WEB-INF/pages/films.jsp ,我們會收到404 錯誤。好吧,太棒了,我們有最簡單的網頁應用程序,正如他們所說的“Hello World”。目前項目架構如下:
Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 8

模型

我們已經有了視圖和控制器,但在 MVC 中還有第三個字母,因此為了完成圖片,我們還將添加一個模型。在包中,model讓我們創建一個類Film,例如,具有以下字段:int idString title(標題)、int year(發行年份)、String genre(流派)和boolean watched(即您是否已經看過這部電影)。
package testgroup.filmography.model;

public class Film {
    private int id;
    private String title;
    private int year;
    private String genre;
    private boolean watched;
// + Getters and setters
}
沒什麼特別的,只是一個普通的類別、私有欄位、getter 和 setter。此類的物件也稱為POJO(Plain Old Java Object),即 「簡單的java對象」。現在讓我們嘗試建立這樣一個物件並將其顯示在頁面上。現在,我們不會太擔心如何創建它並初始化它。為了嘗試一下,讓我們直接在控制器中愚蠢地創建它,例如,如下所示:
public class FilmController {
    private static Film film;

    static {
        film = new Film();
        film.setTitle("Inception");
        film.setYear(2010);
        film.setGenre("sci-fi");
        film.setWatched(true);
    }
ModelAndView使用以下方法將此物件新增到我們的物件中addObject
@RequestMapping(method = RequestMethod.GET)
    public ModelAndView allFilms() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("films");
        modelAndView.addObject("film", film);
        return modelAndView;
    }
現在我們可以在頁面上顯示這個物件。films.jsp我們將編寫代替 Hello World 的內容,並且此處將替換${film}與屬性名稱「」相對應的物件。film讓我們嘗試運行它,看看發生了什麼(為了清楚地輸出對象,Film重新定義了類別toString()):
Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 9

模型-視圖-控制器

到了這個階段,我們似乎已經擁有了一個成熟的 Spring MVC 應用程式。在繼續之前,最好再次查看所有內容並弄清楚它是如何運作的。在網路上你可以找到很多關於這方面的圖片和圖表,我喜歡這個:
Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 10
當我們在瀏覽器行中編寫一個請求時,它被接受Dispatcher Servlet,然後它會找到一個合適的控制器來處理這個請求HandlerMapping(這是一個用於選擇控制器的接口,檢查哪個可用的控制器有接受這樣一個地址的方法) ,調用合適的方法並Controller返回有關視圖的信息,然後調度程序使用ViewResolver'a 按名稱找到所需的視圖,之後將模型數據傳輸到此視圖,我們將頁面作為輸出。像這樣的東西。 待續... Maven、Spring、MySQL、Hibernate 簡介和第一個 CRUD 應用程式(第 1 部分) Maven、Spring、MySQL、Hibernate 簡介和第一個 CRUD 應用程式(第 2 部分) Maven、Spring、MySQL 、Hibernate 簡介和第一個 CRUD 應用程式(第 3 部分) Maven、Spring、MySQL、Hibernate 簡介和第一個 CRUD 應用程式(第 4 部分)
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION