原文位址: http://www.work100.net/training/monolithic-architecture-test.html 更多教程: 光束雲 - 免費課程
實踐練習
請參照如上
章節導航
進行閱讀
1.建構項目結構
我們以
使用者登入
功能進行示範
三層架構 + MVC架構
如何實作。
1.1.建立項目
打開
IDEA
,在前述章節
stage2
檔案夾下建立檔案夾
login-demo
,如下圖:

1.2.建立 POM 檔案
建立檔案夾後,在
login-demo
檔案夾上
右擊
,然後
New
-
File
,建立一個
pom.xml
檔案,檔案内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<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>
1.3.建立目錄結構
接下來,在
login-demo
檔案夾下建立如下目錄結構:
目錄 | 含義 |
---|---|
src/main/java | 源碼 |
src/main/resources | 資源檔案 |
src/main/webapp | 網站檔案 |
src/test/java | 測試源碼 |
1.4.托管 POM 檔案到 Maven
将
pom.xml
托管到
Maven
,操作方式如下:
托管後,點選
重新整理
重新導入所有 Maven 項目,結果如下:
1.5.建立包結構
在檔案夾
src/main/java
上
右擊
New
Package
,包名為:
net.work100.training.stage2.login.demo
然後建立我們的
三層 + MVC
包架構:
包 | |
---|---|
dao | 資料通路層 |
entity | 實體類 |
service | 服務層 |
web.controller | Web控制器 |
2.代碼實作
2.1.定義實體類
在
entity
包上
右擊
New
Java Class
建立名為
User
的類。
User.java
檔案代碼如下:
package net.work100.training.stage2.login.demo.entity;
import java.io.Serializable;
/**
* <p>Title: User</p>
* <p>Description: 使用者表</p>
*
* @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 + '\'' +
'}';
}
}
2.2.實作dao層
建立 UserDao
接口
UserDao
在包
dao
右擊
New
Java Class
,
Kind
選擇
Interface
,接口命名為
UserDao
UserDao.java
代碼如下:
package net.work100.training.stage2.login.demo.dao;
import net.work100.training.stage2.login.demo.entity.User;
/**
* <p>Title: UserDao</p>
* <p>Description: 使用者資料通路</p>
*
* @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);
}
接口實作 UserDaoImpl
UserDaoImpl
dao
右擊
New
Package
,類包名稱為
impl
,然後在包
impl
右擊
New
Java Class
,建立類
UserDaoImpl
UserDaoImpl.java
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;
/**
* <p>Title: UserDaoImpl</p>
* <p>Description: </p>
*
* @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;
}
}
2.3.實作service層
UserService
UserService
service
右擊
New
Java Class
Kind
Interface
UserService
UserService.java
package net.work100.training.stage2.login.demo.service;
/**
* <p>Title: UserService</p>
* <p>Description: </p>
*
* @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);
}
UserServiceImpl
UserServiceImpl
service
右擊
New
Package
impl
impl
右擊
New
Java Class
UserServiceImpl
UserServiceImpl.java
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;
/**
* <p>Title: UserServiceImpl</p>
* <p>Description: </p>
*
* @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;
}
}
2.4.實作Web控制器
web.controller
右擊
New
Java Class
LoginController
控制器。
LoginController.java
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;
/**
* <p>Title: LoginController</p>
* <p>Description: 登入控制器</p>
*
* @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);
}
}
}
因需要擴充繼承
LoginController
,是以我們需要在
HttpServlet
檔案中引入依賴的類包
pom.xml
javax.servlet-api
3.網站實作
3.1.建構網站目錄結構
WEB-INF/web.xml | 網站配置檔案 |
index.jsp | 登入頁 |
success.jsp | 登入成功 |
fail.jsp | 登入失敗 |
3.2.網站配置檔案
WEB-INF/web.xml
配置檔案代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<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>
3.3.登入頁
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登入</title>
</head>
<body>
<form action="/login" method="post">
<input name="loginId" type="text" />
<input name="loginPwd" type="password" />
<input type="submit" value="登入" />
</form>
</body>
</html>
3.4.登入成功頁
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>成功</title>
</head>
<body>
登入成功
</body>
</html>
3.5.登入失敗頁
fail.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>失敗</title>
</head>
<body>
登入失敗
</body>
</html>
4.測試運作
4.1.配置Tomcat
Run/Debug Configurations
,點選
+
Tomcat Server
Local
,然後點選
OK
确認
為
Tomcat-Server
命名
login-demo
,選擇安裝好的
Application Server
:
切換到
Deployment
頁籤,添加
Artifact
,有兩種方式:
方式一:
點選
+
Artifact
彈出畫面中選擇
login-demo:war exploded
方式二:
右下角選擇
Fix
login-demo:war exploded
設定
Application context
/
,即為根目錄:
4.2.運作
點選下圖
運作
按鈕:
運作成功後将打開浏覽器,或者您手動打開浏覽器,輸入位址:
http://localhost:8080/運作效果如下圖:
表單輸入以下錯誤的登入資料:
名稱 | 值 |
---|---|
使用者名 | admin |
密碼 | 123456 |
頁面将轉向
登入失敗
頁面,如下圖:
表單輸入以下正确的登入資料:
登入成功
4.3.源碼擷取
執行個體源碼已經托管到如下位址:
- https://github.com/work100-net/training-stage2/tree/master/login-demo https://github.com/work100-net/training-stage2/tree/master/login-demo
- https://gitee.com/work100-net/training-stage2/tree/master/login-demo https://gitee.com/work100-net/training-stage2/tree/master/login-demo
5.總結
如上詳細講解了
三層 + MVC
架構的典型實作方式,課件将每個步驟都進行了截圖,請認真閱讀文檔并實踐練習。
通過練習做到深刻了解三層架構及MVC架構,同時熟練掌握
IntelliJ IDEA
建構
Maven
項目的詳細步驟。
後續的章節将不再對通過
IntelliJ IDEA
項目的步驟進行講解,将主要以代碼實作為講解内容。
Maven
上一篇:
通路者模式