MVC模式和三层架构(附综合案例增删改查)

news/2025/1/7 21:16:35/

MVC模式和三层架构

MVC模式

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

  • M:Model,业务模型,处理业务

  • V:View,视图,界面展示

  • C:Controller,控制器,处理请求,调用模型和视图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dol7M8Hq-1648441269211)(image/jsp/image-20220327212553189.png)]

控制器(serlvlet)用来接收浏览器发送过来的请求,控制器调用模型(JavaBean)来获取数据,比如从数据库查询数据;控制器获取到数据后再交由视图(JSP)进行数据展示。

MVC 好处:

  • 职责单一,互不影响。每个角色做它自己的事,各司其职。
  • 有利于分工协作。
  • 有利于组件重用

三层架构

三层架构是将我们的项目分成了三个层面,分别是 表现层业务逻辑层数据访问层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FvZRLEdw-1648441269212)(image/jsp/image-20220327212619697.png)]

  • 数据访问层:对数据库的CRUD基本操作
  • 业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能。例如 注册业务功能 ,我们会先调用 数据访问层selectByName() 方法判断该用户名是否存在,如果不存在再调用 数据访问层insert() 方法进行数据的添加操作
  • 表现层:接收请求,封装数据,调用业务逻辑层,响应数据

而整个流程是,浏览器发送请求,表现层的Servlet接收请求并调用业务逻辑层的方法进行业务逻辑处理,而业务逻辑层方法调用数据访问层方法进行数据的操作,依次返回到serlvet,然后servlet将数据交由 JSP 进行展示。

三层架构的每一层都有特有的包名称:

  • 表现层: com.itheima.controller 或者 com.itheima.web
  • 业务逻辑层:com.itheima.service
  • 数据访问层:com.itheima.dao 或者 com.itheima.mapper

后期我们还会学习一些框架,不同的框架是对不同层进行封装的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UhyAs5UO-1648441269213)(image/jsp/image-20220327212630913.png)]

MVC 和 三层架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ys12WfD6-1648441269213)(image/jsp/image-20220327212644168.png)]

如上图上半部分是 MVC 模式,上图下半部分是三层架构。 MVC 模式 中的 C(控制器)和 V(视图)就是 三层架构 中的表现层,而 MVC 模式 中的 M(模型)就是 三层架构 中的 业务逻辑层 和 数据访问层。

可以将 MVC 模式 理解成是一个大的概念,而 三层架构 是对 MVC 模式 实现架构的思想。 那么我们以后按照要求将不同层的代码写在不同的包下,每一层里功能职责做到单一,将来如果将表现层的技术换掉,而业务逻辑层和数据访问层的代码不需要发生变化。

综合案例练习

需求:完成品牌数据的增删改查操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OcWTkc3J-1648441269214)(image/jsp/image-20220327212707678.png)]

这个功能我们之前一直在做,而这个案例是将今天学习的所有的内容(包含 MVC模式 和 三层架构)进行应用,并将整个流程贯穿起来。

1、环境准备

环境准备工作,我们分以下步骤实现:

  • 创建新的模块 brand_demo,引入坐标

    <dependencies><!-- mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.34</version></dependency><!--servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--jsp--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope></dependency><!--jstl--><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin></plugins></build>
    
  • 创建三层架构的包结构

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-niH2syrL-1648441269214)(image/jsp/image-20220327215027861.png)]

    作用:

    web:web相关的包

    service:服务器

    mapper:存放mybatis接口的

    pojo:放实体类

    util:放工具类

  • 数据库表 tb_brand

    -- 删除tb_brand表
    drop table if exists tb_brand;
    -- 创建tb_brand表
    create table tb_brand
    (-- id 主键id           int primary key auto_increment,-- 品牌名称brand_name   varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered      int,-- 描述信息description  varchar(100),-- 状态:0:禁用  1:启用status       int
    );
    -- 添加数据
    insert into tb_brand (brand_name, company_name, ordered, description, status)
    values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),('小米', '小米科技有限公司', 50, 'are you ok', 1);SELECT * FROM tb_brand;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qGEnTX4N-1648441269215)(image/jsp/image-20220327215534355.png)]

  • 实体类 Brand

    package com.zcl.pojo;/*** 品牌实体类*/public class Brand {// id 主键private Integer id;// 品牌名称private String brandName;// 企业名称private String companyName;// 排序字段private Integer ordered;// 描述信息private String description;// 状态:0:禁用  1:启用private Integer status;public Brand() {}public Brand(Integer id, String brandName, String companyName, String description) {this.id = id;this.brandName = brandName;this.companyName = companyName;this.description = description;}public Brand(Integer id, String brandName, String companyName, Integer ordered, String description, Integer status) {this.id = id;this.brandName = brandName;this.companyName = companyName;this.ordered = ordered;this.description = description;this.status = status;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getBrandName() {return brandName;}public void setBrandName(String brandName) {this.brandName = brandName;}public String getCompanyName() {return companyName;}public void setCompanyName(String companyName) {this.companyName = companyName;}public Integer getOrdered() {return ordered;}public void setOrdered(Integer ordered) {this.ordered = ordered;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}@Overridepublic String toString() {return "Brand{" +"id=" + id +", brandName='" + brandName + '\'' +", companyName='" + companyName + '\'' +", ordered=" + ordered +", description='" + description + '\'' +", status=" + status +'}';}
    }
  • MyBatis 基础环境

    • Mybatis-config.xml

      存放在resources文件下

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration><!--起别名--><typeAliases><package name="com.zcl.pojo"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///db1?useSSL=false&amp;useServerPrepStmts=true"/><property name="username" value="root"/><property name="password" value="1234"/></dataSource></environment></environments><mappers><!--扫描mapper--><package name="com.zcl.mapper"/></mappers>
      </configuration>
      

      根据自己的环境修改包名和连接配置

      包扫描pojo按住ctrl+左键点击鼠标变成小手就是正确了

    • BrandMapper.xml

      在resources文件下创建包结构

      com/zcl/mapper
      
      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="com.zcl.mapper.BrandMapper"><!--映射查询数据的品牌名称和企业名称--><!--映射实体属性名称和数据库名称不一致的方法--><resultMap id="brandResultMap" type="brand"><result column="brand_name" property="brandName"></result><result column="company_name" property="companyName"></result></resultMap>
      </mapper>
      

      namespace报错,创建BrandMapper接口解决

    • BrandMapper接口

      com.zcl.mapper目录下

      package com.zcl.mapper;/*** TODO:** @author zcl* @date 2022/3/27 22:00*/
      public interface BrandMapper {
      }
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lte52Csb-1648441269216)(image/jsp/image-20220327220151339.png)]

2、查询所有数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qr75KbZ4-1648441269216)(image/jsp/image-20220327221032735.png)]

当我们点击 index.html 页面中的 查询所有 这个超链接时,就能查询到上图右半部分的数据。

对于上述的功能,点击 查询所有 超链接是需要先请后端的 servlet ,由 servlet 跳转到对应的页面进行数据的动态展示。而整个流程如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FvYR4Qb1-1648441269217)(image/jsp/image-20220327221011560.png)]

编写BrandMapper查询语句【Dao层】

mapper 包下创建创建 BrandMapper 接口,在接口中定义 selectAll() 方法

/*** 查询所有* @return*/
@Select("select * from tb_brand")
@ResultMap("brandResultMap")
List<Brand> selectAll();
创建工具类减少代码重复

util包下的:SqlSessionFactoryUtils

package com.zcl.util;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;public class SqlSessionFactoryUtils {private static SqlSessionFactory sqlSessionFactory;static {//静态代码块会随着类的加载而自动执行,且只执行一次try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}public static SqlSessionFactory getSqlSessionFactory(){return sqlSessionFactory;}
}
编写BrandService【Service层】
package com.zcl.service;import com.zcl.mapper.BrandMapper;
import com.zcl.pojo.Brand;
import com.zcl.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import java.util.List;/*** TODO:** @author zcl* @date 2022/3/27 22:14*/
public class BrandService {// 调用SqlSessionFactoryUtils根据类里面的方法【所有成员都会访问】SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();/*** 查询所有功能* @return*/public List<Brand> selectAll(){// 获取SqlSessionSqlSession sqlSession = factory.openSession();// 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);// 调用具体的方法List<Brand> brandList = mapper.selectAll();// 释放资源sqlSession.close();return brandList;}
}

【Web层】

启动执行流程:启动项目默认访问index.html页面,点击a标签跳转到SelectAllServlet控制器,获取所有数据储存到域中再请求转发到brand2.jsp中遍历数据输出

创建index.html页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<a href="/brand_demo/selectAllServlet">查询所有</a>
</body>
</html>

web包下创建SelectAllServlet

数据库查询的数据储存到域在中

请求转发路径

package com.zcl.web; /*** TODO:** @author zcl* @date 2022/3/28 7:04*/import com.zcl.pojo.Brand;
import com.zcl.service.BrandService;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.List;@WebServlet("/selectAllServlet")
public class SelectAllServlet extends HttpServlet {private BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 调用BrandService完成查询List<Brand> brands = service.selectAll();//2. 存入request域中request.setAttribute("brands",brands);//3. 转发到brand.jsprequest.getRequestDispatcher("/brand2.jsp").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

创建brand.jsp页面获取域中的数据并使用jstl标签遍历生成表格

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<input type="button" value="新增" id="add"><br>
<hr>
<table border="1" cellspacing="0" width="80%"><tr><th>序号</th><th>品牌名称</th><th>企业名称</th><th>排序</th><th>品牌介绍</th><th>状态</th><th>操作</th></tr><c:forEach items="${brands}" var="brand" varStatus="status"><tr align="center"><%--<td>${brand.id}</td>--%><td>${status.count}</td><td>${brand.brandName}</td><td>${brand.companyName}</td><td>${brand.ordered}</td><td>${brand.description}</td><c:if test="${brand.status == 1}"><td>启用</td></c:if><c:if test="${brand.status != 1}"><td>禁用</td></c:if><td><a href="/brand-demo/selectByIdServlet?id=${brand.id}">修改</a> <a href="#">删除</a></td></tr></c:forEach></table><script>document.getElementById("add").onclick = function (){location.href = "/brand-demo/addBrand.jsp";}</script>
</body>
</html>

启动项目默认到index页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1adDdN9U-1648441269217)(image/jsp/image-20220328064745091.png)]

点击查询所有遍历数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Htdg2eBB-1648441269218)(image/jsp/image-20220328064807385.png)]

项目文件结构顺序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xCbe8FUV-1648441269218)(image/jsp/image-20220328095620986.png)]

3、添加所有数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CWQarrAc-1648441269219)(image/jsp/image-20220328094910248.png)]

上图是做 添加 功能流程。点击 新增 按钮后,会先跳转到 addBrand.jsp 新增页面,在该页面输入要添加的数据,输入完毕后点击 提交 按钮,需要将数据提交到后端,而后端进行数据添加操作,并重新将所有的数据查询出来。整个流程如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VC4zHOxL-1648441269220)(image/jsp/image-20220328094924175.png)]

3.1、 编写BrandMapper方法

【dao层】

BrandService 类中定义添加品牌数据方法 add(Brand brand)

/*** 添加数据* @param brand*/
@Insert("insert into tb_brand values (null,#{brandName},#{companyName},#{ordered},#{description},#{status})")
void add(Brand brand);

【service层】

在service包下的BrandService类中添加

增删改方法都需要提交事务,再释放资源

/*** 添加数据* @param brand*/
public void add(Brand brand){// 获取SqlSessionSqlSession sqlSession = factory.openSession();// 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);// 调用具体的方法mapper.add(brand);// 提交事务sqlSession.commit();// 释放资源sqlSession.close();
}

【Web层】

在brand.jsp页面的新增按钮添加点击事件跳转到新增的页面

<script>document.getElementById("add").onclick = function (){location.href = "/brand-demo2/addBrand.jsp";}</script>

创建addBrand.html页面

设置action路径在通过控制器请求转发到查询页面

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>添加品牌</title>
</head>
<body>
<h3>添加品牌</h3>
<form action="/brand-demo2/addServicelet" method="post">品牌名称:<input name="brandName"><br>企业名称:<input name="companyName"><br>排序:<input name="ordered"><br>描述信息:<textarea rows="5" cols="20" name="description"></textarea><br>状态:<input type="radio" name="status" value="0">禁用<input type="radio" name="status" value="1">启用<br><input type="submit" value="提交">
</form>
</body>
</html>

在web包下创建AddServlet控制器

需要处理post请求乱码问题

// 处理post请求乱码问题
request.setCharacterEncoding("utf-8");
package com.zcl.web; /*** TODO:** @author zcl* @date 2022/3/28 10:10*/import com.zcl.pojo.Brand;
import com.zcl.service.BrandService;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;@WebServlet("/addServlet")
public class AddServlet extends HttpServlet {// 创建BrandService对象调用方法private BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 处理post请求乱码问题request.setCharacterEncoding("utf-8");// 1、接收表单数据String brandName = request.getParameter("brandName");String companyName = request.getParameter("companyName");String ordered = request.getParameter("ordered");String description = request.getParameter("description");String status = request.getParameter("status");// 2、封装为一个Brand对象Brand brand = new Brand();brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setOrdered(Integer.parseInt(ordered));brand.setDescription(description);brand.setStatus(Integer.parseInt(status));// 3、调用add添加方法service.add(brand);// 4、转发到查询所有的jsp页面request.getRequestDispatcher("/selectAllServlet").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sOKxV9Lh-1648441269220)(image/jsp/image-20220328102609512.png)]

文件编写顺序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2cIALcOy-1648441269221)(image/jsp/image-20220328103226916.png)]

4、修改数据回填显示

4.1、数据回填显示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDgWuQGP-1648441269222)(image/jsp/image-20220328104658951.png)]

上图就是回显数据的效果。要实现这个效果,那当点击 修改 按钮时不能直接跳转到 update.jsp 页面,而是需要先带着当前行数据的 id 请求后端程序,后端程序根据 id 查询数据,将数据存储到域对象中跳转到 update.jsp 页面进行数据展示。整体流程如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7RzuBQwI-1648441269222)(image/jsp/image-20220328104715465.png)]

4.2、编写BrandMapper方法【Dao层】

BrandMapper 接口,在接口中定义 selectById(int id) 方法

/*** 根据id查询信息* @param id* @return*/
@Select("select * from tb_brand where id = #{id}}")
@ResultMap("brandResultMap")
Brand selectById(int id);
4.3、编写BrandService方法【Service层】

BrandService 类中定义根据id查询数据方法 selectById(int id)

/*** 根据id查询信息回填表单页面* @return*/
public Brand selectById(int id){// 获取SqlSessionSqlSession sqlSession = factory.openSession();// 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);// 调用具体的方法Brand brandList = mapper.selectById(id);// 释放资源sqlSession.close();return brandList;
}
4.4、 编写servlet控制器【Web层】

改造修改页面,点击修改跳转查询数据回填

<td><a href="/brand-demo2/selectByIdServlet?id=${brand.id}">修改</a> <a href="#">删除</a></td>

创建SelectByIdServlet根据id查询信息控制器,并请求转发到修改页面

package com.zcl.web; /*** TODO:** @author zcl* @date 2022/3/28 7:04*/import com.zcl.pojo.Brand;
import com.zcl.service.BrandService;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;@WebServlet("/selectByIdServlet")
public class SelectByIdServlet extends HttpServlet {private BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1、接收idString id = request.getParameter("id");// 2、调用Servlet根据id查询数据Brand brand = service.selectById(Integer.parseInt(id));// 3、数据储存到request域中request.setAttribute("brand",brand);// 4、请求转发到修改回填页面request.getRequestDispatcher("/update.jsp").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

创建修改页面update.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>修改品牌</title>
</head>
<body>
<h3>修改品牌</h3>
<form action="/brand-demo2/addServlet" method="post">品牌名称:<input name="brandName" value="${brand.brandName}"><br>企业名称:<input name="companyName" value="${brand.companyName}"><br>排序:<input name="ordered" value="${brand.ordered}"><br>描述信息:<textarea rows="5" cols="20" name="description">${brand.description}</textarea><br>状态:<c:if test="${brand.status == 0}"><input type="radio" name="status" value="0" checked>禁用<input type="radio" name="status" value="1">启用<br></c:if><c:if test="${brand.status == 1}"><input type="radio" name="status" value="0">禁用<input type="radio" name="status" value="1" checked>启用<br></c:if><input type="submit" value="提交">
</form>
</body>
</html>

启动项目效果展示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fhcXy3bB-1648441269223)(image/jsp/image-20220328113505399.png)]

5、修改数据回填显示

在修改页面进行数据修改,点击 提交 按钮,会将数据提交到后端程序,后端程序会对表中的数据进行修改操作,然后重新进行数据的查询操作。整体流程如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gRKTjSBp-1648441269223)(image/jsp/image-20220328113801683.png)]

5.1、 编写BrandMapper方法【Dao层】

BrandMapper接口

/*** 修改* @param brand*/
@Update("update tb_brand set brand_name = #{brandName},company_name = #{companyName},ordered = #{ordered},description = #{description},status = #{status} where id = #{id}")
void update(Brand brand);
5.2、 编写BrandService方法【service层】

BrandService 类中定义根据id查询数据方法 update(Brand brand)

/*** 修改数据* @param brand*/
public void update(Brand brand){// 获取SqlSessionSqlSession sqlSession = factory.openSession();// 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);// 调用具体的方法mapper.update(brand);// 提交事务sqlSession.commit();// 释放资源sqlSession.close();
}
5.3、改造update.jsp页面【web层】
<form action="/brand-demo2/updateServlet" method="post"><input type="hidden" name="id" value="${brand.id}">品牌名称:<input name="brandName" value="${brand.brandName}"><br>企业名称:<input name="companyName" value="${brand.companyName}"><br>排序:<input name="ordered" value="${brand.ordered}"><br>描述信息:<textarea rows="5" cols="20" name="description">${brand.description}</textarea><br>状态:<c:if test="${brand.status == 0}"><input type="radio" name="status" value="0" checked>禁用<input type="radio" name="status" value="1">启用<br></c:if><c:if test="${brand.status == 1}"><input type="radio" name="status" value="0">禁用<input type="radio" name="status" value="1" checked>启用<br></c:if><input type="submit" value="提交">
</form>
5.4、创建UpdateServlet控制器【web层】

web包下

package com.zcl.web; /*** TODO:** @author zcl* @date 2022/3/28 10:10*/import com.zcl.pojo.Brand;
import com.zcl.service.BrandService;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/updateServlet")
public class UpdateServlet extends HttpServlet {// 创建BrandService对象调用方法private BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 处理post请求乱码问题request.setCharacterEncoding("utf-8");// 1、接收表单数据String id = request.getParameter("id");String brandName = request.getParameter("brandName");String companyName = request.getParameter("companyName");String ordered = request.getParameter("ordered");String description = request.getParameter("description");String status = request.getParameter("status");// 2、封装为一个Brand对象Brand brand = new Brand();brand.setId(Integer.parseInt(id));brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setOrdered(Integer.parseInt(ordered));brand.setDescription(description);brand.setStatus(Integer.parseInt(status));// 3、调用修改方法service.update(brand);// 4、转发到查询所有的jsp页面request.getRequestDispatcher("/selectAllServlet").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

6、删除数据

6.1、在 BrandService 类中定义根据id查询数据方法 selectById(int id) 【Dao层】

/*** 删除* @param id*/
@Update("delete from tb_brand where id = #{id}")
void deldate(int id);

6.2、在service包下调用方法【service层】

/*** 根据id删除信息* @return*/
public void deldate(int id){// 获取SqlSessionSqlSession sqlSession = factory.openSession();// 获取BrandMapperBrandMapper mapper = sqlSession.getMapper(BrandMapper.class);// 调用具体的方法mapper.deldate(id);// 提交事务sqlSession.commit();// 释放资源sqlSession.close();
}

6.3、【Web层】

修改brand2.jsp页面的删除标签

<td><a href="/brand-demo2/selectByIdServlet?id=${brand.id}">修改</a> <a href="/brand-demo2/delByIdServlet?id=${brand.id}">删除</a></td>

创建DelServlet删除控制器

@WebServlet("/delByIdServlet")
public class DelServlet extends HttpServlet {// 创建BrandService对象调用方法private BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1、接收表单数据String id = request.getParameter("id");// 3、调用修改方法service.deldate(Integer.parseInt(id));// 4、转发到查询所有的jsp页面request.getRequestDispatcher("/selectAllServlet").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

http://www.ppmy.cn/news/92734.html

相关文章

3天学会Pytest自动化测试框架,哭着都要给我看完

目录 Pytest和Unittest测试框架的区别&#xff1f; Pytest 安装 Pytest 示例 标记 固件&#xff08;Fixture) 预处理和后处理 作用域 自动执行 参数化 总结 Pytest和Unittest测试框架的区别&#xff1f; 如何区分这两者&#xff0c;很简单unittest作为官方的测试框架…

推箱子大冒险(SDL/C)

前言 欢迎来到小K的SDL专栏第三小节&#xff0c;本节将为大家带来小项目~C语言SDL版坤坤推箱子详细讲解&#xff0c;这里也为大家上传了源码和图片资源&#xff0c;需要的自取看完以后&#xff0c;希望对你有所帮助 ✨效果如下 文章目录 前言一、推箱子思路讲解二、加SDL绘图代…

从小白到大神之路之学习运维第28天

第二阶段基础 时 间&#xff1a;2023年5月24日 参加人&#xff1a;全班人员 内 容&#xff1a; ISCSI服务 目录 实验构建iscsi服务 实现步骤&#xff1a;以下实验为例 前提配置&#xff1a; 服务器端&#xff1a; 客户端&#xff1a; 注意事项&#xff1a; 实验构…

ggerganov/llama.cpp 编译

ggerganov/llama.cpp - 编译出main可执行程序依赖以下的源代码文件 如果想在 Windows 系统编译出 llama.cpp 项目&#xff08;这个是github上的仓库&#xff0c; ggerganov/llama.cpp &#xff09;&#xff0c;需要在Visual Studio上添加项目内的若干个源文件。这篇简陋的笔记…

transformers 的使用

一.配置环境 在 抱抱脸 网址 上发布了很多已经训练好的模型&#xff0c;基本上大量的NLP模型都在&#xff0c;一开始是发布 transformers 的开源库&#xff0c;但后来连接了开发者和使用者。 https://huggingface.co/ 在安装 transformers 前&#xff0c;需要先安装Flax&…

线程和进程区别

什么是线程和进程? 进程 一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间&#xff0c;一个进程可以有多个线程&#xff0c;比如在Windows系统中&#xff0c;一个运行的xx.exe就是一个进程。 线程进程中的一个执行任务&#xff08;控制单元&#xff09;&#…

百度松果菁英班--oj赛(第五次)

文章目录 百度松果菁英班--oj赛&#xff08;第五次&#xff09;一、附庸的附庸二、采蜜三、暧昧团四、上楼梯五、上楼梯2六、大厨小码哥七、纸带八、围栏木桩九、最长字段和十、旅费 百度松果菁英班–oj赛&#xff08;第五次&#xff09; 一、附庸的附庸 **题目&#xff1a;*…

TexSAW|2023|Cryptography&Misc|WP

Cryptography&#xff5c;Crack the crime 用 nc 连上后&#xff0c;直接得到第一题 是一个简单的base64加密&#xff0c;解密如下&#xff1a; Meet in dubai on Tuesday 填入之后可获得第二题 猜测是古典加密&#xff0c;随后经过N次尝试后发现是rot13加密&#xff0c;解密…