04.實踐練習(三層架構+MVC)

1.構建項目結構

我們以用戶登錄功能進行演示 <strong>三層架構 + MVC架構

如何實現。

1.1.創建項目

打開 <strong>IDEA ,在前述章節 <strong>stage2 文件夾下創建文件夾 <strong>login-demo,如下圖:

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

創建目錄


Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

目錄命名 login-demo

1.2.創建 POM 文件

創建文件夾後,在 <strong>login-demo 文件夾上 <strong>右擊,然後 <strong>New - <strong>File,新建一個 <strong>pom.xml 文件,文件內容如下:

<code><project>    <modelversion>4.0.0/<modelversion>    <groupid>net.work100.training.stage2/<groupid>    <artifactid>login-demo/<artifactid>    <version>1.0.0-SNAPSHOT/<version>    <packaging>war/<packaging>    <properties>        <java.version>1.8/<java.version>        <maven.compiler.source>${java.version}/<maven.compiler.source>        <maven.compiler.target>${java.version}/<maven.compiler.target>        <project.build.sourceencoding>UTF-8/<project.build.sourceencoding>        <project.reporting.outputencoding>UTF-8/<project.reporting.outputencoding>    /<properties>    <dependencies>        <dependency>            <groupid>javax.servlet/<groupid>            <artifactid>javax.servlet-api/<artifactid>            <version>4.0.1/<version>        /<dependency>    /<dependencies>/<project>/<code>

1.3.創建目錄結構

接下來,在 <strong>login-demo 文件夾下創建如下目錄結構:


Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

目錄結構含義說明


Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

目錄結構

1.4.託管 POM 文件到 Maven

將 <strong>pom.xml 託管到 <strong>Maven,操作方式如下:

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

POM託管到Maven

託管後,點擊 <strong>刷新 重新導入所有 <strong>Maven 項目,結果如下:

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

Maven識別後的目錄結構

1.5.創建包結構

在文件夾<strong> src/main/java 上<strong>右擊 - <strong>New - <strong>Package,包名為:<strong>net.work100.training.stage2.login.demo

然後創建我們的 <strong>三層 + MVC 包架構:


Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

包含義說明


Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

包結構

2.代碼實現

2.1.定義實體類

在 <strong>entity 包上 <strong>右擊 - <strong>New - <strong>Java Class 創建名為 <strong>User 的類。

<strong>User.java 文件代碼如下:

<code>package net.work100.training.stage2.login.demo.entity;import java.io.Serializable;/** * 

Title: User

*

Description: 用戶表

* * @author liuxiaojun * @date 2020-02-09 10:43 * ------------------- History ------------------- * <date> <author> <desc> * 2020-02-09 liuxiaojun 初始創建 * ----------------------------------------------- */public class User implements Serializable { private String userName; private String loginId; private String loginPwd; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getLoginId() { return loginId; } public void setLoginId(String loginId) { this.loginId = loginId; } public String getLoginPwd() { return loginPwd; } public void setLoginPwd(String loginPwd) { this.loginPwd = loginPwd; } @Override public String toString() { return "User{" + "userName='" + userName + '\\'' + ", loginId='" + loginId + '\\'' + '}'; }}/<desc>/<author>/<date>/<code>

2.2.實現dao層

創建 UserDao 接口

在包 <strong>dao 上<strong>右擊 - <strong>New - <strong>Java Class,<strong>Kind 選擇 <strong>Interface,接口命名為 <strong>UserDao

<strong>UserDao.java 代碼如下:

<code>package net.work100.training.stage2.login.demo.dao;import net.work100.training.stage2.login.demo.entity.User;/** * 

Title: UserDao

*

Description: 用戶數據訪問

* * @author liuxiaojun * @date 2020-02-09 10:49 * ------------------- History ------------------- * <date> <author> <desc> * 2020-02-09 liuxiaojun 初始創建 * ----------------------------------------------- */public interface UserDao { /** * 登錄驗證 * * @param loginId 登錄ID * @param loginPwd 登錄密碼 * @return */ User login(String loginId, String loginPwd);}/<desc>/<author>/<date>/<code>

接口實現 UserDaoImpl

在包<strong>dao 上<strong>右擊 - <strong>New - <strong>Package,類包名稱為 <strong>impl,然後在包<strong>impl上<strong>右擊 - <strong>New - <strong>Java Class,新建類 <strong>UserDaoImpl

<strong>UserDaoImpl.java 文件代碼如下:

<code>package net.work100.training.stage2.login.demo.dao.impl;import net.work100.training.stage2.login.demo.dao.UserDao;import net.work100.training.stage2.login.demo.entity.User;/** * 

Title: UserDaoImpl

*

Description:

* * @author liuxiaojun * @date 2020-02-09 11:04 * ------------------- History ------------------- * <date> <author> <desc> * 2020-02-09 liuxiaojun 初始創建 * ----------------------------------------------- */public class UserDaoImpl implements UserDao { @Override public User login(String loginId, String loginPwd) { // 根據 loginId 查詢出用戶信息 User user = getUserByLoginId(loginId); if (user!=null) { // 驗證 loginPwd 是否正確(區分大小寫) if(user.getLoginPwd().equals(loginPwd)){ return user; } } return null; } private User getUserByLoginId(String loginId){ // 模擬 DB 存在的用戶數據 User dbUser = new User(); dbUser.setUserName("Xiaojun"); dbUser.setLoginId("admin"); dbUser.setLoginPwd("admin"); // 判斷是否存在 loginId 的用戶(忽略大小寫) if(dbUser.getLoginId().equalsIgnoreCase(loginId)){ return dbUser; } return null; }}/<desc>/<author>/<date>/<code>

2.3.實現service層

創建 UserService 接口

在包 <strong>service 上<strong>右擊 - <strong>New - <strong>Java Class,<strong>Kind

選擇 <strong>Interface,接口命名為 <strong>UserService

<strong>UserService.java 代碼如下:

<code>package net.work100.training.stage2.login.demo.service;/** * 

Title: UserService

*

Description:

* * @author liuxiaojun * @date 2020-02-09 11:20 * ------------------- History ------------------- * <date> <author> <desc> * 2020-02-09 liuxiaojun 初始創建 * ----------------------------------------------- */public interface UserService { /** * 登錄驗證 * * @param loginId 登錄ID * @param loginPwd 登錄密碼 * @return */ boolean login(String loginId, String loginPwd);}/<desc>/<author>/<date>/<code>

接口實現 UserServiceImpl

在包 <strong>service 上<strong>右擊 - <strong>New - <strong>Package,類包名稱為 <strong>impl,然後在包<strong>impl上<strong>右擊 - <strong>New - <strong>Java Class,新建類 <strong>UserServiceImpl

<strong>UserServiceImpl.java 文件代碼如下:

<code>package net.work100.training.stage2.login.demo.service.impl;import net.work100.training.stage2.login.demo.dao.UserDao;import net.work100.training.stage2.login.demo.dao.impl.UserDaoImpl;import net.work100.training.stage2.login.demo.service.UserService;/** * 

Title: UserServiceImpl

*

Description:

* * @author liuxiaojun * @date 2020-02-09 11:22 * ------------------- History ------------------- * <date> <author> <desc> * 2020-02-09 liuxiaojun 初始創建 * ----------------------------------------------- */public class UserServiceImpl implements UserService { // 數據訪問層的具體實現 private UserDao userDao = new UserDaoImpl(); @Override public boolean login(String loginId, String loginPwd) { return userDao.login(loginId, loginPwd) != null; }}/<desc>/<author>/<date>/<code>

2.4.實現Web控制器

在包 <strong>web.controller 上<strong>右擊

- <strong>New - <strong>Java Class,新建一個 <strong>LoginController 控制器。

<strong>LoginController.java 代碼如下:

<code>package net.work100.training.stage2.login.demo.web.controller;import net.work100.training.stage2.login.demo.service.UserService;import net.work100.training.stage2.login.demo.service.impl.UserServiceImpl;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * 

Title: LoginController

*

Description: 登錄控制器

* * @author liuxiaojun * @date 2020-02-09 11:36 * ------------------- History ------------------- * <date> <author> <desc> * 2020-02-09 liuxiaojun 初始創建 * ----------------------------------------------- */public class LoginController extends HttpServlet { private UserService userService = new UserServiceImpl(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String loginId = req.getParameter("loginId"); String loginPwd = req.getParameter("loginPwd"); boolean success = userService.login(loginId, loginPwd); // 登錄失敗 if (!success) { req.getRequestDispatcher("/fail.jsp").forward(req, resp); } // 登錄成功 else { req.getRequestDispatcher("/success.jsp").forward(req, resp); } }}/<desc>/<author>/<date>/<code>

因 LoginController 需要擴展繼承 HttpServlet,所以我們需要在 pom.xml 文件中引入依賴的類包 javax.servlet-api

3.網站實現

3.1.構建網站目錄結構


Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

目錄結構解釋


Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

目錄結構

3.2.網站配置文件

<strong>WEB-INF/web.xml 配置文件代碼如下:

<code><web-app>   <display-name>login-demo/<display-name>   <servlet>      <servlet-name>LoginController/<servlet-name>      <servlet-class>net.work100.training.stage2.login.demo.web.controller.LoginController/<servlet-class>   /<servlet>   <servlet-mapping>      <servlet-name>LoginController/<servlet-name>      <url-pattern>/login/<url-pattern>   /<servlet-mapping>/<web-app>/<code>

3.3.登錄頁

<strong>index.jsp 文件代碼如下:

<code>    <title>登錄/<title>/<code>

3.4.登錄成功頁

<strong>success.jsp 文件代碼如下:

<code>    <title>成功/<title>登錄成功/<code>

3.5.登錄失敗頁

<strong>fail.jsp 文件代碼如下:

<code>    <title>失敗/<title>登錄失敗/<code>

4.測試運行

4.1.配置Tomcat

打開 <strong>Run/Debug Configurations,點擊 <strong>+ - <strong>Tomcat Server - <strong>Local ,然後點擊 <strong>OK 確認

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

添加 Tomcat Server

為 <strong>Tomcat-Server 命名 <strong>login-demo,選擇安裝好的 <strong>Application Server:

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

添加 Tomcat Server

切換到 <strong>Deployment 選項卡,添加 <strong>Artifact,有兩種方式:

方式一

點擊 <strong>+ - <strong>Artifact

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

添加 Artifact 方式1

彈出畫面中選擇 <strong>login-demo:war exploded

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

選擇附加

方式二

右下角選擇 <strong>Fix

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

添加 Artifact 方式2

彈出畫面中選擇 <strong>login-demo:war exploded

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

選擇附加

設置 <strong>Application context 為 <strong>/,即為根目錄:

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

配置 Application context

4.2.運行

點擊下圖 <strong>運行 按鈕:

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

運行

運行成功後將打開瀏覽器,或者您手動打開瀏覽器,輸入地址:

http://localhost:8080/

運行效果如下圖:

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

登錄

表單輸入以下錯誤的登錄數據:


Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

錯誤數據


頁面將轉向 <strong>登錄失敗 頁面,如下圖:

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

登錄失敗

表單輸入以下正確的登錄數據:


Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

正確數據


頁面將轉向 <strong>登錄成功 頁面,如下圖:

Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)

登錄成功

5.總結

如上詳細講解了 <strong>三層 + MVC 架構的典型實現方式,課件將每個步驟都進行了截圖,請認真閱讀文檔並實踐練習。

通過練習做到深刻理解三層架構及MVC架構,同時熟練掌握 <strong>IntelliJ IDEA 構建 <strong>Maven 項目的詳細步驟。

後續的章節將不再對通過 IntelliJ IDEA 構建 Maven 項目的步驟進行講解,將主要以代碼實現為講解內容。


分享到:


相關文章: