java mvc建包结构_Java单体应用 - 架构模式 - 04.实践练习(三层架构+MVC)

实践练习

请参照如上章节导航进行阅读

我们以用户登录功能进行演示 三层架构 + MVC架构 如何实现。

1.1.创建项目

打开 IDEA ,在前述章节 stage2 文件夹下创建文件夹 login-demo,如下图:

082c4a2d8a6812201985cc206f875abc.png

3af13dcd2299748c20bb89927a359e47.png

1.2.创建 POM 文件

创建文件夹后,在 login-demo 文件夹上 右击,然后 New - File,新建一个 pom.xml 文件,文件内容如下:

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">

4.0.0

net.work100.training.stage2

login-demo

1.0.0-SNAPSHOT

war

1.8

${java.version}

${java.version}

UTF-8

UTF-8

javax.servlet

javax.servlet-api

4.0.1

1.3.创建目录结构

接下来,在 login-demo 文件夹下创建如下目录结构:

目录

含义

src/main/java

源码

src/main/resources

资源文件

src/main/webapp

网站文件

src/test/java

测试源码

b2217045d29b71fc2196ceaadc49e416.png

1.4.托管 POM 文件到 Maven

将 pom.xml 托管到 Maven,操作方式如下:

4c072601e060413a019a7d8041ad8dfe.png

托管后,点击 刷新 重新导入所有 Maven 项目,结果如下:

a54c775fecdbf78f2f01bc177234a4ba.png

1.5.创建包结构

在文件夹 src/main/java 上右击 - New - Package,包名为:net.work100.training.stage2.login.demo

然后创建我们的 三层 + MVC 包架构:

含义

dao

数据访问层

entity

实体类

service

服务层

web.controller

Web控制器

5d5d134a6a67ca04281ee113eb4e13c9.png

2.1.定义实体类

在 entity 包上 右击 - New - Java Class 创建名为 User 的类。

User.java 文件代码如下:

package net.work100.training.stage2.login.demo.entity;

import java.io.Serializable;

/**

*

Title: User

*

Description: 用户表

*

* @author liuxiaojun

* @date 2020-02-09 10:43

* ------------------- History -------------------

*

* 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;

/**

*

Title: UserDao

*

Description: 用户数据访问

*

* @author liuxiaojun

* @date 2020-02-09 10:49

* ------------------- History -------------------

*

* 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;

/**

*

Title: UserDaoImpl

*

Description:

*

* @author liuxiaojun

* @date 2020-02-09 11:04

* ------------------- History -------------------

*

* 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;

/**

*

Title: UserService

*

Description:

*

* @author liuxiaojun

* @date 2020-02-09 11:20

* ------------------- History -------------------

*

* 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;

/**

*

Title: UserServiceImpl

*

Description:

*

* @author liuxiaojun

* @date 2020-02-09 11:22

* ------------------- History -------------------

*

* 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;

/**

*

Title: LoginController

*

Description: 登录控制器

*

* @author liuxiaojun

* @date 2020-02-09 11:36

* ------------------- History -------------------

*

* 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.1.构建网站目录结构

目录

含义

WEB-INF/web.xml

网站配置文件

index.jsp

登录页

success.jsp

登录成功

fail.jsp

登录失败

70f4a7c6cb0edaacae156c7dc95b0af1.png

3.2.网站配置文件

WEB-INF/web.xml 配置文件代码如下:

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">

login-demo

LoginController

net.work100.training.stage2.login.demo.web.controller.LoginController

LoginController

/login

3.3.登录页

index.jsp 文件代码如下:

登录

3.4.登录成功页

success.jsp 文件代码如下:

成功

登录成功

3.5.登录失败页

fail.jsp 文件代码如下:

失败

登录失败

4.1.配置Tomcat

打开 Run/Debug Configurations,点击 + - Tomcat Server - Local ,然后点击 OK 确认

772dc253543f45ee69380b50500bb07f.png

为 Tomcat-Server 命名 login-demo,选择安装好的 Application Server:

99b13b43a2d05f7e3652669f3fa9f5e3.png

切换到 Deployment 选项卡,添加 Artifact,有两种方式:

方式一:

点击 + - Artifact

dd2b705d9987defe22764b39c58e815a.png

弹出画面中选择 login-demo:war exploded

001912cf8879dd769c4fbb194fd61752.png

方式二:

右下角选择 Fix

253e290b2aff305777cd8ce3efeb0a40.png

弹出画面中选择 login-demo:war exploded

d411e527800395da0a41e91c237e9996.png

设置 Application context 为 /,即为根目录:

61e0831db79692af62e8d220c290431e.png

4.2.运行

点击下图 运行 按钮:

8c6f8d9b76d28150406b615d0b3cc6f5.png

运行成功后将打开浏览器,或者您手动打开浏览器,输入地址:

运行效果如下图:

2cf314bbaab0c050910320a5b7e8ecde.png

表单输入以下错误的登录数据:

名称

用户名

admin

密码

123456

页面将转向 登录失败 页面,如下图:

c9cac9039f1ce188eea446cc4181a953.png

表单输入以下正确的登录数据:

名称

用户名

admin

密码

admin

页面将转向 登录成功 页面,如下图:

0bf828a215a32ee9b32ef1071bb14945.png

4.3.源码获取

实例源码已经托管到如下地址:

如上详细讲解了 三层 + MVC 架构的典型实现方式,课件将每个步骤都进行了截图,请认真阅读文档并实践练习。

通过练习做到深刻理解三层架构及MVC架构,同时熟练掌握 IntelliJ IDEA 构建 Maven 项目的详细步骤。

后续的章节将不再对通过 IntelliJ IDEA 构建 Maven 项目的步骤进行讲解,将主要以代码实现为讲解内容。

如果对课程内容感兴趣,可以扫码关注我们的 公众号 或 QQ群,及时关注我们的课程更新

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值