JavaWeb06-MVC和三层架构

news2024/11/17 14:20:23

目录

一、MVC模式

1.概述

2.好处

二、三层架构

1.概述

三、MVC与三层架构

四、练习


一、MVC模式

1.概述

MVC是一种分层开发的模式,其中

M:Model,业务模型,处理业务 V: View,视图,界面展示 C:Controller,控制器,处理请求,调用型和视图

2.好处

  • 职责单一,互不影响

  • 有利于分工协作

  • 有利于组件重用

二、三层架构

1.概述

View视图不只是JSP!

数据访问层(持久层):对数据库的CRUD基本操作

一般命名为反转公司网址/controller

业务逻辑层(业务层):对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能。

一般命名为反转公司网址/service

表现层:接收请求,封装数据,调用业务逻辑层,响应数据

一般命名为反转公司网址/dao或者mapper

三、MVC与三层架构

四、练习

给上次的数据添加一个状态字段,0禁用,1启用,2预售,设个默认值1即可

使用三层架构思想开发

参考下图:

java目录结构

代码,只写主要的了

service包下

public class ProductService {
    final SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
    public List<Product> selectAll(){
        final SqlSession sqlSession = sqlSessionFactory.openSession();
        final ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
        final List<Product> products = mapper.selectAll();
        sqlSession.close();
        return products;
    };
}

web包下

@WebServlet("/selectAll")
public class selectAll extends HttpServlet {
    private final ProductService productService = new ProductService();
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
​
        final List<Product> products = productService.selectAll();
        request.setAttribute("product",products);
        request.getRequestDispatcher("/jsp/product.jsp").forward(request,response);
    }
​
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

之后回到视图层

jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: LEGION
  Date: 2024/3/13
  Time: 13:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<%--<% final Object product = request.getAttribute("product");%>--%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>product列表</h1>
    <table border="1px solid black">
        <tr>
            <th>商品序号</th>
            <th>商品id</th>
            <th>商品名</th>
            <th>商品图片</th>
            <th>商品价格</th>
            <th>商品评论数</th>
            <th>商品分类</th>
            <th>商品状态</th>
            <th>商品发布时间</th>
            <th>商品更新时间</th>
        </tr>
        <c:forEach items="${product}" var="product" varStatus="status">
            <tr>
                    <%--                index从0开始,count从1开始--%>
                <td>${status.count}</td>
                    <%--                ${user.id} => Id => getId()--%>
                <td>${product.id}</td>
                <td>${product.title}</td>
                <td><img src="${product.imgUrl}" alt="" width="75px" height="75px"></td>
                <td>${product.price}</td>
                <td>${product.comment}</td>
                <td>${product.category}</td>
                <td>${product.status}</td>
                <td>${product.gmtCreate}</td>
                <td>${product.gmtModified}</td>
            </tr>
        </c:forEach>
​
        </table>
​
    </body>
</html>

预览图:

添加:

html

<form action="/product_demo_war/add" method="post">
      <input type="text" name="title" placeholder="商品名称"><br>
      <input type="text" name="price" placeholder="商品价格"><br>
<!--        图片上传在这里就先不写了-->
        <input type="number" name="category" placeholder="商品类型(数字就好)"><br>
        <input type="radio" name="status">启用
        <input type="radio" name="status">禁用
        <br>
        <input type="submit" value="添加">
    </form>

service:

/**
 * 添加商品
 * @param product 商品对象
 */
public void add(Product product){
    final SqlSession sqlSession = sqlSessionFactory.openSession();
    final ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
    mapper.add(product);
    sqlSession.commit();
    sqlSession.close();
}

web:

@WebServlet("/add")
public class Add extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ProductService productService = new ProductService();
        final String title = request.getParameter("title");
        final String price = request.getParameter("price");
        final Integer status = Integer.parseInt(request.getParameter("status"));
        final Integer category = Integer.parseInt(request.getParameter("category"));
        Product product = new Product(title,price,category,status);
        productService.add(product);
        request.getRequestDispatcher("/selectAll").forward(request,response);
    }
​
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

预览:

修改:

有两步:

  • 显示原先的数据:回显

  • 修改现有的数据:修改

第一部分回显:根据id显示值

service:

public Product selectById(Long id){
    final SqlSession sqlSession = sqlSessionFactory.openSession();
    final ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
    final Product product = mapper.selectById(id);
    sqlSession.close();
    return product;
}

web:

@WebServlet("/selectById")
public class SelectById extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        final String id = request.getParameter("id");
        ProductService productService = new ProductService();
        final Product product = productService.selectById(Long.parseLong(id));
        request.setAttribute("product",product);
        System.out.println(id);
        request.getRequestDispatcher("/jsp/productUpdate.jsp").forward(request,response);
    }
​
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

显示层:productUpdate.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>修改</title>
  <style>
    .text {
      width: 100%;
    }
  </style>
</head>
<body>
<form action="/product_demo_war/updateById" method="post">
  <input type="hidden" name="id" value="${product.id}">
  <input class="text" type="text" name="title" placeholder="商品名称" value="${product.title}"><br>
  <input class="text" type="text" name="price" placeholder="商品价格" value="${product.price}"><br>
  <!--        图片上传在这里就先不写了-->
  <input class="text" type="number" name="category" placeholder="商品类型(数字就好)" value="${product.category}"><br>
  <c:if test="${product.status == 1}">
    <input type="radio" name="status" value="1" checked>启用
    <input type="radio" name="status" value="0">禁用
  </c:if>
  <c:if test="${product.status == 0}">
    <input type="radio" name="status" value="1">启用
    <input type="radio" name="status" value="0" checked>禁用
  </c:if>
​
  <br>
  <input type="submit" value="修改">
</form>
</body>
</html>

第二部分修改:

service:

public void UpdateById(Product product){
    final SqlSession sqlSession = sqlSessionFactory.openSession();
    final ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
    mapper.updateById(product);
    sqlSession.commit();
}

servlet:

@WebServlet("/updateById")
public class Update extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
​
        final Long id = Long.parseLong(request.getParameter("id"));
        final String title = request.getParameter("title");
        final String price = request.getParameter("price");
        final Integer category = Integer.parseInt(request.getParameter("category"));
        final Integer status = Integer.parseInt(request.getParameter("status"));
        Date gmtModified = new Date();
​
        Product product = new Product(id,title,price,category,status,gmtModified);
        ProductService productService = new ProductService();
        productService.UpdateById(product);
​
        request.getRequestDispatcher("/selectAll").forward(request,response);
​
    }
​
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

测试:

删除:不写了,jsp知道怎么写就行了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1515311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈HTTP 和 HTTPS (中间人问题)

前言 由于之前的文章已经介绍过了HTTP , 这篇文章介绍 HTTPS 相对于 HTTP 做出的改进 开门见山: HTTPS 是对 HTTP 的加强版 主要是对一些关键信息 进行了加密 一.两种加密方式 1.对称加密 公钥 明文 密文 密文 公钥 明文 2.非对称加密 举个例子就好比 小区邮箱 提供一…

学习SSM的记录(八)-- SSM整合项目《任务列表案例》

前端程序搭建和运行 项目预览 接口分析 1.学习计划分页查询 需求&#xff1a;查询对应数据页数据 uri&#xff1a;schedule/{pageSize}/{currentPage} 请求方式&#xff1a;get 响应数据&#xff1a;json {"code":200,"flag":true,"data"…

MVP 聚技站|生成式 AI 系列(六):关于嵌入和 RAG 的那些有趣的事

点击蓝字 关注我们 MVP 聚技站 微软最有价值专家推出“MVP 聚技站”系列主题专栏&#xff0c;邀请多位微软最有价值专家&#xff0c;针对初学者、开发者感兴趣的技术话题&#xff0c;带来专业的技术课程讲解与实践经验分享&#xff0c;帮助大家更快掌握最新的技术技能。 随着人…

前端框架的发展史介绍框架特点

目录 1.前端框架的发展历程 2.官网、优缺点、使用场景 2.1 jQuery 2.2 AngularJS 2.3 React 2.4 Vue.js 2.5 Angular 1.前端框架的发展历程 jQuery&#xff08;2006年&#xff09;&#xff1a;jQuery是一个非常流行的JavaScript库&#xff0c;用于简化DOM操作和事件处理…

从零开始学习深度学习库-1:前馈网络

你好&#xff01;欢迎来到这个系列的第一篇文章&#xff0c;我们将尝试用Python构建自己的深度学习库。在这篇文章中&#xff0c;我们将开始编写一个简单的前馈神经网络。我们将仅在这篇文章中处理前向传播&#xff0c;并在下一篇文章中处理网络的训练。这篇文章将介绍基本的前…

3.2 Beautiful Soup 的使用

目录 一、Beautiful Soup 的简介 二、解析器 三、基本使用 四、节点选择器 1 选择元素 2 获取名称、属性、文本内容 五、方法选择器 1 find_all 传入 name 节点名 传入 attrs 属性 传入 text 2 find 六、CSS 选择器 1 实例 2 获取属性 3 获取文本 七、结语 一…

TQ15EG开发板教程:运行MPSOC+AD9361

目录 1&#xff0c;下载工程需要使用的文件 2&#xff0c;编译以及修改工程 3&#xff0c;获取生成BOOT.BIN所需要的3个文件 3.1生成bit文件 3.2生成elf文件 3.3生成fsbl文件 4&#xff0c;生成boot.bin文件 5&#xff0c;上板测试 6&#xff0c;切换FMC接口 7&#…

JAVA的编译过程

1.通过使用 javac.exe 对 xxx.java文件进行编译&#xff0c;生成相应的 xxx.class&#xff08;字节码文件&#xff09; 2.使用 java.exe 对 xxx.class 进行相应解码&#xff0c;并将结果送给JVM&#xff08;java虚拟机&#xff09;中的类装载器 3. 字节码验证器会判断代码类…

Vue组件中引入jQuery

两种在vue中引入jQuery的方式 1、普通html中使用jQuery 将jQuer的文件导入到项目中&#xff0c;然后直接使用<script src"jQuery.js"></script>即可。 <script src"jQuery.js"></script> 2、vue组件中使用jQuery 安装依赖 c…

华为OD机试 - 运输时间(Java 2023 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

【分明集合】特征函数、关系与运算

经典的集合论中&#xff0c;对于一个给定的集合&#xff0c;任意一个元素&#xff0c;或者属于这个集合&#xff0c;或者不属于这个集合&#xff0c;二者必居其一&#xff0c;且仅居其一&#xff0c;为了加以区分&#xff0c; 通常将这样的集合称为分明集合、经典集合或者普通集…

MySQL的事务隔离是如何实现的?

目录 从一个例子说起 快照读和当前读 事务的启动时机和读视图生成的时刻 MVCC 隐藏字段 Undo Log回滚日志 Read View - 读视图 可重复读(RC)隔离级别下的MVCC 读提交(RR)隔离级别下的MCC 关于MVCC的一些疑问 1.为什么需要 MVCC &#xff1f;如果没有 MVCC 会怎样&am…

矢量场的通量和散量

矢量与矢量场 矢量&#xff1a;又有大小又有方向的量。&#xff08;力、速度、电场强度等&#xff09; 矢量场&#xff1a;如果空间中处处都有矢量存在&#xff0c;则称形成了一个矢量场。 表示矢量场的方法&#xff1a; 1、数学表达式&#xff1a; 此表达式为直角坐标系下表…

腾讯云轻量服务器地域选择方法整理,选择不能修改!

腾讯云轻量应用服务器地域如何选择&#xff1f;地域就近选择&#xff0c;北方选北京地域、南方选广州地域&#xff0c;华东地区选上海地域。广州上海北京地域有什么区别&#xff1f;哪个好&#xff1f;区别就是城市地理位置不同&#xff0c;其他的差不多&#xff0c;不区分好坏…

全球首位AI软件工程师诞生,未来程序员会被取代吗?

今天早上看到一条消息&#xff0c;Cognition发布了世界首位AI程序员Devin&#xff0c;直接把我惊呆了&#xff0c;难道程序员是真要失业了吗&#xff1f; 全球首位AI软件工程师一亮相&#xff0c;直接引爆整个互联网圈。只需要一句指令&#xff0c;Devin就可以通过使用自己的s…

QT----基于QT的人脸考勤系统(未完成)

目录 1 编译opencv库1.1 下载源代码1.2 qt编译opencv1.3 执行Cmake一直卡着data: Download: face_landmark_model.dat 2 编译SeetaFace2代码2.1 遇到报错By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has2.2遇到报错Model missing 3 测试…

Android 13 源码编译及报错修复

下载AOSP指定分支 repo init -u git://aosp../platform/manifest -b android-13.0.0_r83 同步代码到本地 repo sync -c 初始化编译环境, 选择构建目标 source build/envsetup.sh lunch 选择需要构建的目标&#xff0c;此处以aosp_arm64-eng为例 进行固件编译 make -j12 期间编译…

蓝桥杯 填空 卡片

蓝桥杯 填空题 卡片 解题思路&#xff1a; 我们只需要消耗完卡片的个数即可。 代码示例&#xff1a; #include<bits/stdc.h> using namespace std; int a[10]; bool isEnd(){for(int i0;i<10;i){if(a[i]-1)return false;}return true; } bool getN(int x){while(x){i…

第13届软件与计算技术国际会议(ICSCT 2024)即将召开!

2024年第13届软件与计算技术国际会议(ICSCT 2024)将于7月26-28日在越南岘港召开。本次大会由维新大学主办&#xff0c;岘港大学、胡志明市科技大学联合协办。ICSCT 2024旨在为来自业界和学术界的研究人员、学者和专业人士提供一个论坛&#xff0c;分享他们最新的研究成果。欢迎…

Docker 中 MySQL 的部署与管理

目录 一、Docker 中部署 MySQL1.1 部署 MySQL1.2 进入容器并创建数据库1.3 Navicat 可视化工具连接 二、可能存在的问题2.1 1130 - Host ‘172.17.0.1‘ is not allowed to connect to this MySQL server 参考资料 一、Docker 中部署 MySQL 1.1 部署 MySQL 首先&#xff0c;从…