天天看點

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

原文位址: http://www.work100.net/training/monolithic-architecture-test.html 更多教程: 光束雲 - 免費課程

實踐練習

請參照如上

章節導航

進行閱讀

1.建構項目結構

我們以

使用者登入

功能進行示範

三層架構 + MVC架構

如何實作。

1.1.建立項目

打開

IDEA

,在前述章節

stage2

檔案夾下建立檔案夾

login-demo

,如下圖:

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

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 測試源碼
Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)實踐練習

1.4.托管 POM 檔案到 Maven

pom.xml

托管到

Maven

,操作方式如下:

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

托管後,點選

重新整理

重新導入所有 Maven 項目,結果如下:

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

1.5.建立包結構

在檔案夾

src/main/java

右擊

New

Package

,包名為:

net.work100.training.stage2.login.demo

然後建立我們的

三層 + MVC

包架構:

dao 資料通路層
entity 實體類
service 服務層
web.controller Web控制器
Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)實踐練習

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

接口

在包

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

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

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

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 登入失敗
Java單體應用 - 架構模式 - 04.實踐練習(三層架構+MVC)實踐練習

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

确認

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

Tomcat-Server

命名

login-demo

,選擇安裝好的

Application Server

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

切換到

Deployment

頁籤,添加

Artifact

,有兩種方式:

方式一:

點選

+

Artifact

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

彈出畫面中選擇

login-demo:war exploded

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

方式二:

右下角選擇

Fix

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

login-demo:war exploded

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

設定

Application context

/

,即為根目錄:

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

4.2.運作

點選下圖

運作

按鈕:

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

運作成功後将打開浏覽器,或者您手動打開浏覽器,輸入位址:

http://localhost:8080/

運作效果如下圖:

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

表單輸入以下錯誤的登入資料:

名稱
使用者名 admin
密碼 123456

頁面将轉向

登入失敗

頁面,如下圖:

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

表單輸入以下正确的登入資料:

登入成功

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

4.3.源碼擷取

執行個體源碼已經托管到如下位址:

5.總結

如上詳細講解了

三層 + MVC

架構的典型實作方式,課件将每個步驟都進行了截圖,請認真閱讀文檔并實踐練習。

通過練習做到深刻了解三層架構及MVC架構,同時熟練掌握

IntelliJ IDEA

建構

Maven

項目的詳細步驟。

後續的章節将不再對通過

IntelliJ IDEA

Maven

項目的步驟進行講解,将主要以代碼實作為講解内容。

上一篇:

通路者模式