基本的Java的MVC入门案例

2023-11-20

概念:

MVC:Model View Controller:模型、视图、控制器。他是一种专门设计web程序的模式

高内聚、低耦合(高内聚:专人干专事;低耦合:让类与类之间的关系不能太紧密)

模型(Model):是应用程序中与处理应用程序数据逻辑的部分。存数据、处理数据

视图 (View):是应用程序中处理数据显示的部分。展示数据

控制器(Controller):是应用程序中处理用户交互的部分。接收数据或者跳转页面

在MVC设计模式基础之上进一步的提出了java web的三层架构的思想:

表示层(web层):包含jsp、servlet等web相关的内容

业务逻辑层(service层):处理业务

数据库访问层(Dao层:DataBase Access Object):也就叫做持久层,封装一些对数据库的访问细节。

项目:

如上图:

dao层是数据库访问,

service层是业务逻辑层,

web是数据展示层,用于展示。

util层一般是作为工具类的存放地点,在这里我们存放了是一个BeanFactory类(就是加载配置文件的key值,通过反射机制获取一个javabean)

加载的配置文件就是在resources下面的bean.properties

首先我们先编辑web层

package com.qf.bigdata;

import com.qf.bigdata.web.LoginServlet;

import java.util.Scanner;

public class Application {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("username:");
        String username = scanner.nextLine();
        System.out.println("password:");
        String password = scanner.nextLine();
        new LoginServlet().login(username,password);
    }
}

从Application中引入controller

package com.qf.bigdata.web;

import com.qf.bigdata.service.UserService;
import com.qf.bigdata.util.BeanFactory;

//controller
public class LoginServlet {
    private UserService userService = BeanFactory.getBean("userservice");
    public void login(String user,String pwd){
        boolean isok = userService.login(user,pwd);
        if (isok) System.out.println("登录成功");
        else System.out.println("登录失败");
    }
}

下面编写逻辑层

其实一般的逻辑层和dao层都是使用一个接口编写抽象方法,然后通过实现类去实现

package com.qf.bigdata.service;

public interface UserService {
    boolean login(String username,String password);
}

实现类

package com.qf.bigdata.service;

import com.qf.bigdata.dao.UserDao;
import com.qf.bigdata.util.BeanFactory;

public class UserServiceImpl implements UserService {
    private UserDao userDao = BeanFactory.getBean("userdao");
    @Override
    public boolean login(String username, String password) {
        return userDao.select(username,password);
    }
}

通过UserServiceImpl引入一个BeanFactory

package com.qf.bigdata.util;

import java.util.Properties;

public class BeanFactory {

    public static <T> T getBean(String key) {
        T t = null;
        Properties properties = new Properties();
        try {
            properties.load(BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties"));
            String value = properties.getProperty(key);
            Class clazz = Class.forName(value);
            t = (T) clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t;
    }
}

这里面的配置文件放在resources文件夹中

bean.properties

userservice=com.qf.bigdata.service.UserServiceImpl
userdao=com.qf.bigdata.dao.UserDaoImpl

 最后是dao层

package com.qf.bigdata.dao;

public interface UserDao {
    public boolean select(String user,String pwd);
}
package com.qf.bigdata.dao;

public class UserDaoImpl implements UserDao {
    @Override
    public boolean select(String user, String pwd) {
        if (user.equals("admin") && pwd.equals("123456")) return true;
        return false;
    }
}

笔者在程序中设置的用户名和密码是admin 和123456

Test

升级版本,使用springframework替换掉javabeanFactory

添加依赖,在pom.xml文件中复制

<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
    <artifactId>MVC</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.version>1.8</java.version>
        <fastjson.version>1.2.68</fastjson.version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from com.qf.bigdata.repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

        <dependency>
            <groupId>org.ujmp</groupId>
            <artifactId>ujmp-core</artifactId>
            <version>0.3.0</version>
        </dependency>

        <dependency>
            <groupId>com.facebook.presto</groupId>
            <artifactId>presto-jdbc</artifactId>
            <version>0.235</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-shaded-client</artifactId>
            <version>1.3.6</version>
        </dependency>

        <dependency>
            <groupId>io.milvus</groupId>
            <artifactId>milvus-sdk-java</artifactId>
            <version>0.8.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>ru.yandex.clickhouse</groupId>
            <artifactId>clickhouse-jdbc</artifactId>
            <version>0.2.4</version>
            <exclusions>
                <exclusion>
                    <artifactId>guava</artifactId>
                    <groupId>com.google.guava</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.jpmml</groupId>
            <artifactId>pmml-evaluator</artifactId>
            <version>1.5.1</version>
        </dependency>

        <dependency>
            <groupId>org.jpmml</groupId>
            <artifactId>pmml-evaluator-extension</artifactId>
            <version>1.5.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.vaadin.external.google</groupId>
                    <artifactId>android-json</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <repositories>

        <repository>
            <id>alimaven</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <updatePolicy>never</updatePolicy>
            </releases>
            <snapshots>
                <updatePolicy>never</updatePolicy>
            </snapshots>
        </repository>
    </repositories>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

在resources中新建一个新文件

新建一个ApplicationContext.xml

以下是内容

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 1.annotation配置文件的方式来创建对象——ioc : 将创建UserServiceImpl的对象交给了spring的ioc容器-->
    <!-- 开启spring的ioc的注解方式开发,但是在现在新版本的spring中,这句话可以省略 -->
    <!--<context:annotation-config />-->

    <!-- 组件扫描:配置一个包路径,在这个包路径下的被spring标识的类会被ioc容器自动创建 -->
    <context:component-scan base-package="com.qf.bigdata" />
</beans>

 组件扫描那个一定是项目的包名(以下是获取包名的步骤)

 dao层的实现类我只是标记了一下,没有其他变化

package com.qf.bigdata.dao;

import org.springframework.stereotype.Repository;

@Repository  //标记dao层
public class UserDaoImpl implements UserDao {
    @Override
    public boolean select(String user, String pwd) {
        if (user.equals("admin") && pwd.equals("123")) return true;
        return false;
    }
}

至于service层的实现类 UserDao的实例化对象删了(使用注解加载对象),添加了一个setUserDao方法

package com.qf.bigdata.service;

import com.qf.bigdata.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

/*
 * 以下四个注解都是用于对类进行标记额,只要被这四个注解其中任意一个标记都可以被spring的ioc容器创建
 * 这四个注解几乎没有区别:
 * 但是你可以明显看出来他们的单词不一样,就表示未来他们可能有区别
 */
//@Controller : 一般在web层的ioc
//@Service : 业务层
//@Repository : dao层
//@Component : 以上三者之外
@Service
public class UserServiceImpl implements UserService {

    @Autowired // 自动装配,会在ioc容器去找有没有userDao接口的子类对象,有的话就创建
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public boolean login(String username, String password) {
        return userDao.select(username, password);
    }
}

 其他方法没有变化

至于web层的TestDemo,添加了一个spring framework入口,加载配置文件

package com.qf.bigdata.web;
import com.qf.bigdata.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDemo {
    public static void main(String[] args) {
        //1. spring framework的入口类, 生成这个入口类的时候加载了我们的spring的核心配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:ApplicationContext.xml");
        //2. 得到对象
        UserService userService = (UserService) applicationContext.getBean(UserService.class);
        //3. 测试userService是否可用
        boolean isok = userService.login("admin", "123456");
        System.out.println(isok);
    }
}

运行代码

成功了

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基本的Java的MVC入门案例 的相关文章

随机推荐

  • 继承,重载函数,派生函数

    继承是类与类之间的关系 是一个很简单很直观的概念 与现实世界中的继承 例如儿子继承父亲财产 类似 继承 Inheritance 可以理解为一个类从另一个类获取成员变量和成员函数的过程 例如类B继承于类A 那么B就拥有A的成员变量和成员函数
  • 【软硬件通信】ESP32 Arduino 服务端 控制舵机

    1 安装esp32开发环境 搭建ESP32开发环境 2 编写舵机驱动程序 include
  • javaScript基础面试题---找出多维数组最大值

    function fnArr arr var newArr arr forEach item index gt newArr push Math max item return newArr console log fnArr 4 5 1
  • python 猫狗二分类简单实现

    1 数据集介绍 需要数据集可以在下面留言 数据集一共有猫图片 6000张 有狗图片 6000张 图片已经被命名为 0 1 jpg 0 6000 jpg 猫 1 0 jpg 1 6000 jpg 狗 照片读取代码如下 import numpy
  • C/C++在线编译器

    一直以来都喜欢用手机看书 尤其是在上班时 看的最多的是编程一类的书 主要是C 看着就想写写代码 可是电脑用不能用 怎么办 于是想到用UC浏览器找找看网上有没有在线的编译器 想什么时候写代码都可以验证 于是就找了几个 各有千秋吧 中文的我没找
  • python中用于返回元组中元素最小值的是_10个示例带你掌握python中的元组

    数据结构是任何编程语言的关键部分 为了创建强大而性能良好的产品 必须非常了解数据结构 在本文中 我们将研究Python编程语言的重要数据结构 元组 元组是用逗号分隔并括在括号中值的集合 与列表不同 元组的元素是不可变的 不变性可以视为元组的
  • 阿里巴巴开发手册-并发处理

    强制 获取单例对象要线程安全 在单例对象里面做操作也要保证线程安全 说明 资源驱动类 工具类 单例工厂类都需要注意 强制 线程资源必须通过线程池提供 不允许在应用中自行显式创建线程 说明 使用线程池的好处是减少在创建和销毁线程上所花的时间以
  • 图像数据压缩方法

    数据压缩方法 数据能够进行压缩 是因为数据中存在或多或少的冗余信息 而对于视频和音频等多媒体信息 更可以利用人类自身的感知冗余 失真 特点来实现更高的压缩比例 衡量压缩算法的三个主要性能指标如下 压缩比 压缩质量 失真 压缩与解压缩效率 注
  • 企业如何实现上云、选云和买云的三步走

    云计算的发展进入稳定期后 客户的关注点已经聚焦到了混合云 从混合云的视角出发来看 公有云厂家的产品已经琳琅满目非常成熟了 从传统的虚拟服务器 存储 网络 到数据库 中间件到 Docker 等 各大主流公有云厂商都推出了具有相当竞争力的产品
  • 交叉连接查询课程号

  • C++的引用

    C 的引用 一 什么是引用 1 1声明方法 1 2为什么C 要加入引用类型的变量 引用类型与指针类型的比较 二 引用类型在函数中的实际使用 2 1传参数时特殊情况 临时变量 三 引用的更多使用 3 1 常引用 C 引用就是一个变量的别名 一
  • Java实现文件传输

    Java实现文件传输 在Java编程中 我们可以使用各种方法实现文件传输 文件传输是将文件从一个位置传输到另一个位置的过程 可以用于各种应用场景 如文件备份 文件共享等 下面我将介绍一种基于Socket的Java文件传输实现方法 首先 我们
  • C++程序中使用openpose预测关节点坐标的简易实现

    C 程序中使用openpose预测关节点坐标的简易实现 虽然在openpose的官网上已经给出了很多可用的demo 但是如果我们在自己的C 项目中想要使用openpose来预测三维关键点官网给出的例子不是很适用 所以我现在给出了C 程序中使
  • Go切片排序

    Go 语言标准库提供了sort包 用于对切片和用户定义的集合进行排序 具体示例如下 基本排序 package main import fmt sort func main float 从小到大排序 f float64 5 2 1 3 0 7
  • 解决elementUI的对话框(Dialog)组件点击自动跳转到页面顶部问题

  • Python身份运算符(is , is not) 和比较运算符(==,!=)区别

    学习的时候无意中翻到 就在这里稍微记录一下 从名字上看 身份运算符的意思是 运算 两个对象的身份的 那怎么 运算 两个对象的身份呢 那么就自然而然想到比较两个对象的身份是否是相同的 在这里的身份就是他们的id 也就是内存地址 所以身份运算符
  • 【数据结构】哈夫曼编码与前缀编码

    1 前缀编码 首先对于一个串可以用等长的二进制位表示 这样就叫做固定长度编码 如果可以用不等长的二进制位表示 则称之为可变长度编码 那么对于那些频度高的字符我们采用短二进制位编码 出现频度低的采用长二进制位编码的话 将会极大地减少编码长度
  • Win2012服务器 远程桌面帐户允许多用户同时登录的配置方法(2个用户)

    打开任务栏左下角的 服务器管理器 在左侧列表中选中 本地服务器 然后将右侧 远程桌面 功能的选项修改为 启用 注意取消下面复选框的选中状态 修改本地组策略 允许远程桌面帐户的多用户访问 同时按住 Win键 R 组合键调出运行窗口 输入 gp
  • MySQL cmd窗口输入密码后闪退

    最近重新使用回 MySQL 到官网下载客户端版 MySQL Installer 进行安装时 已经设置过 root 密码为 123456 第一次用 cmd 登录时成功 然后再安装 MySQL Workbench 进行连接 却报了错误 auth
  • 基本的Java的MVC入门案例

    概念 MVC Model View Controller 模型 视图 控制器 他是一种专门设计web程序的模式 高内聚 低耦合 高内聚 专人干专事 低耦合 让类与类之间的关系不能太紧密 模型 Model 是应用程序中与处理应用程序数据逻辑的