1.構建項目結構
我們以用戶登錄功能進行演示 <strong>三層架構 + MVC架構
如何實現。1.1.創建項目
打開 <strong>IDEA ,在前述章節 <strong>stage2 文件夾下創建文件夾 <strong>login-demo,如下圖:
![Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)](http://p2.ttnews.xyz/loading.gif)
創建目錄
![Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)](http://p2.ttnews.xyz/loading.gif)
目錄命名 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 文件夾下創建如下目錄結構:
目錄結構含義說明
目錄結構
1.4.託管 POM 文件到 Maven
將 <strong>pom.xml 託管到 <strong>Maven,操作方式如下:
POM託管到Maven
託管後,點擊 <strong>刷新 重新導入所有 <strong>Maven 項目,結果如下:
Maven識別後的目錄結構
1.5.創建包結構
在文件夾<strong> src/main/java 上<strong>右擊 - <strong>New - <strong>Package,包名為:<strong>net.work100.training.stage2.login.demo
然後創建我們的 <strong>三層 + 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.構建網站目錄結構
目錄結構解釋
目錄結構
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 確認
添加 Tomcat Server
為 <strong>Tomcat-Server 命名 <strong>login-demo,選擇安裝好的 <strong>Application Server:
添加 Tomcat Server
切換到 <strong>Deployment 選項卡,添加 <strong>Artifact,有兩種方式:
方式一:
點擊 <strong>+ - <strong>Artifact
添加 Artifact 方式1
彈出畫面中選擇 <strong>login-demo:war exploded
選擇附加
方式二:
右下角選擇 <strong>Fix
添加 Artifact 方式2
彈出畫面中選擇 <strong>login-demo:war exploded
選擇附加
設置 <strong>Application context 為 <strong>/,即為根目錄:
配置 Application context
4.2.運行
點擊下圖 <strong>運行 按鈕:
運行
運行成功後將打開瀏覽器,或者您手動打開瀏覽器,輸入地址:
http://localhost:8080/
運行效果如下圖:
登錄
表單輸入以下錯誤的登錄數據:
錯誤數據
頁面將轉向 <strong>登錄失敗 頁面,如下圖:
登錄失敗
表單輸入以下正確的登錄數據:
正確數據
頁面將轉向 <strong>登錄成功 頁面,如下圖:
登錄成功
5.總結
如上詳細講解了 <strong>三層 + MVC 架構的典型實現方式,課件將每個步驟都進行了截圖,請認真閱讀文檔並實踐練習。
通過練習做到深刻理解三層架構及MVC架構,同時熟練掌握 <strong>IntelliJ IDEA 構建 <strong>Maven 項目的詳細步驟。
後續的章節將不再對通過 IntelliJ IDEA 構建 Maven 項目的步驟進行講解,將主要以代碼實現為講解內容。
閱讀更多 光束雲 的文章