案例-基于MVC和三層架構實現商品表的增刪改查

文章目錄

      • 0. 項目介紹
      • 1. 環境準備
      • 2. 查看所有
        • 2.1 編寫BrandMapper接口
        • 2.2 編寫服務類,創建BrandService,用于調用該方法
        • 2.5 編寫Servlet
        • 2.4 編寫brand.jsp頁面
        • 2.5 測試
      • 3.添加
        • 3.1 編寫BrandMapper接口 添加方法
        • 3.2 編寫服務
        • 3.3 改寫Brand.jsp頁面,添加新增按鈕,并跳轉到新的jsp頁面(addBrand頁面)
        • 3.4 編寫Servlet
        • 3.5 測試

0. 項目介紹

其他項目-用戶登錄注冊頁面:https://blog.csdn.net/meini32/article/details/132305323

項目介紹
需求:完成品牌數據的增刪改查操作
在這里插入圖片描述

技術框架說明

三層架構是將我們的項目分成了三個層面,分別是 表現層 、 業務邏輯層 、 數據訪問層。
整個流程是,瀏覽器發送請求,表現層的Servlet接收請求并調用業務邏輯層的方法進行業務邏輯處理,而業務邏輯層方法調用數據訪問層方法進行數據的操作,依次返回到serlvet,然后servlet將數據交由 JSP 進行展示。

  • 數據訪問層:Mybatis、mysql
  • 業務邏輯層:JAVA
  • 表現層:JSP、Servlet

在這里插入圖片描述

實現步驟

1. 環境準備

環境準備

    1. 創建新的項目 brand_demo,引入坐標配置pom文件()
    1. 創建三層架構的包結構
    1. 數據庫表 tb_brand
    1. 實體類 Brand
    1. MyBatis 基礎環境配置

      • Mybatis-config.xml

      • BrandMapper.xml

      • BrandMapper接口

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
Mybatis-config.xml

<?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.itheima.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="123456"/></dataSource></environment></environments><mappers><!--掃描mapper--><package name="com.itheima.mapper"/></mappers>
</configuration>

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>brand-demo</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><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></project>

工具類 SqlsessionFactoryUtils

package com.itheima.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{InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream("mybatis-config.xml");} catch (IOException e) {e.printStackTrace();}SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}public static SqlSessionFactory getSqlSessionFactory(){return sqlSessionFactory;}
}

屬性名稱對應不上解決方法
在這里插入圖片描述
在BrandMapper映射文件里,定義映射關系

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--
namespace:名稱空間
--><mapper namespace="com.itheima.mapper.BrandMapper"><!--    resultMap 標簽定義映射關系--><resultMap id="brandRseultMap" type="brand"><result column="brand_name" property="brandName"></result><result column="company_name" property="companyName"></result></resultMap></mapper>

在接口方法中指定該映射

public interface BrandMapper {//查看所有@ResultMap("brandResultMap")@Select("select * from tb_brand;")List<Brand> selectAll();
}

在這里插入圖片描述

2. 查看所有

說明:當我們點擊 index.html 頁面中的 查詢所有 這個超鏈接時,就能查詢到上圖右半部分的數據。
在這里插入圖片描述

2.1 編寫BrandMapper接口

public interface BrandMapper {//查看所有@Select("select * from tb_brand;")List<Brand> selectAll();
}

2.2 編寫服務類,創建BrandService,用于調用該方法

package com.itheima.service;import com.itheima.mapper.BrandMapper;
import com.itheima.pojo.Brand;
import com.itheima.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import java.util.List;public class BrandService {SqlSessionFactory sqlSessionFactory =SqlSessionFactoryUtils.getSqlSessionFactory();//查所有public List<Brand> selectAll(){//調用BrandMapper中的selectAll方法//獲取SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//獲取MapperBrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//調用方法List<Brand> brands = brandMapper.selectAll();sqlSession.close();return brands;}
}

2.5 編寫Servlet

package com.itheima.web;import com.itheima.pojo.Brand;
import com.itheima.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("/brand.jsp").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

2.4 編寫brand.jsp頁面

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page isELIgnored="false" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<input type="button" value="新增"><br>
<hr>
<table border="1" cellspacing="0" width="800"><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>${brand.id}</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==0}"><td>禁止</td></c:if><td><a href="/brand-demo/selectByIdServlet?id=${brand.id}">修改</a> <a href="#">刪除</a></td></tr></c:forEach></table></body>
</html>

2.5 測試

在這里插入圖片描述

3.添加

3.1 編寫BrandMapper接口 添加方法

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

3.2 編寫服務

public class BrandService {SqlSessionFactory sqlSessionFactory =SqlSessionFactoryUtils.getSqlSessionFactory();//添加數據public void add(Brand brand){//調用BrandMapper中的selectAll方法//獲取SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//獲取MapperBrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);//調用方法brandMapper.add(brand);//提交事務sqlSession.commit();sqlSession.close();}
}

3.3 改寫Brand.jsp頁面,添加新增按鈕,并跳轉到新的jsp頁面(addBrand頁面)

在這里插入圖片描述

<%--Created by IntelliJ IDEA.User: 11445Date: 2023/8/18Time: 20:31To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>添加品牌</title>
</head>
<body>
<h3>添加品牌</h3>
<form action="" 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>

在這里插入圖片描述

3.4 編寫Servlet

在 web 包下創建 AddServlet 的 servlet ,該 servlet 的邏輯如下:

  • 設置處理post請求亂碼的字符集
  • 接收客戶端提交的數據
  • 將接收到的數據封裝到 Brand 對象中
  • 調用 BrandService 的 add() 方法進行添加的業務邏輯處理
  • 跳轉到 selectAllServlet 資源重新查詢數據
package com.itheima.web;import com.itheima.pojo.Brand;
import com.itheima.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("/addServlet")
public class AddServlet extends HttpServlet {private BrandService service = new BrandService();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//處理post請求的亂碼問題req.setCharacterEncoding("utf-8");//1. 接收表單提交的數據,封裝為一個Brand對象String brandName = req.getParameter("brandName");String companyName = req.getParameter("companyName");String ordered = req.getParameter("ordered");String description = req.getParameter("description");String status = req.getParameter("status");//封裝為一個Brand對象Brand brand = new Brand();brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setOrdered(Integer.parseInt(ordered));brand.setDescription(description);brand.setStatus(Integer.parseInt(status));//2. 調用service 完成添加service.add(brand);//3. 轉發到查詢所有Servletreq.getRequestDispatcher("/selectAllServlet").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}
}

3.5 測試

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42178.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42178.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42178.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CMake教程6:調用lib、dll

之前我們學到了如何編寫一個可執行程序和Library&#xff0c;在繼續學習之前&#xff0c;需要解釋下target&#xff0c;在cmake中我們可以給executable和library設置一個target名字&#xff0c;這樣可以方便我們在后續對target進行更加詳細的屬性設置。 本節我們將學習如何在項…

利用logstash/filebeat/插件,將graylog日志傳輸到kafka中

1.graylog配置輸出 在System-outputs&#xff0c;選擇GELF Output&#xff0c;填寫如下內容&#xff0c;其它選項默認 在要輸出的Stream中&#xff0c;選擇Manage Outputs 選擇GELF Output&#xff0c;右邊選擇剛才創建好的test。 2.安裝logstash&#xff0c;作為中間臨時…

LeetCode 786. 第 K 個最小的素數分數

&#x1f517; 原題鏈接&#xff1a;786. 第 K 個最小的素數分數 本題可以暴力求解&#xff1a; class Solution { public:vector<int> kthSmallestPrimeFraction(vector<int>& arr, int k) {int n arr.size();vector<pair<int, int>> frac;for …

Vue使用jspdf和html2canvas組件庫結合導出PDF文件

效果圖&#xff1a; 1、安裝依賴&#xff1a; npm install html2canvas --save npm install jspdf --save 或 yarn add html2canvas --save yarn add jspdf --save 2、封裝全局調用方法&#xff1a;this.$exportPDF(#id,文件名) 新建js文件&#xff1a;/utils/html2Pdf.js&am…

在linux中,使用sh文件腳本啟動jar項目

使用方法 sh 執行腳本.sh [start|stop|restart|status]sh文件內容 APP_NAMEXXXX.jar#使用說明&#xff0c;用來提示輸入參數 usage() { echo "Usage: sh 執行腳本.sh [start|stop|restart|status]" exit 1 }#檢查程序是否在運行 is_exist(){ pidps -ef|grep $APP_N…

數據結構:選擇排序

簡單選擇排序 選擇排序是一種簡單直觀的排序算法。首先在未排序序列中找到最大&#xff08;最小&#xff09;的元素&#xff0c;存放到排序學列的其實位置&#xff0c;然后在剩余的未排序的元素中尋找最小&#xff08;最大&#xff09;元素&#xff0c;存放在已排序序列的后面…

高等數學:牛頓迭代發解方程

現在高數也要介紹牛頓法了&#xff0c;一般都是從幾何上直接以“切線法”直接引入的。這種引入方式的確很簡單&#xff0c;但如果脫離深入一點的分析就不大容易解釋后面的事情。所以就在想怎么更直接地從分析的角度來一條線貫穿&#xff0c;把整個過程說一說。 文章目錄 一、牛…

【深度學習】PyTorch快速入門

【深度學習】學習PyTorch基礎 介紹PyTorch 深度學習框架是一種軟件工具&#xff0c;旨在簡化和加速構建、訓練和部署深度學習模型的過程。深度學習框架提供了一系列的函數、類和工具&#xff0c;用于定義、優化和執行各種深度神經網絡模型。這些框架幫助研究人員和開發人員專注…

漏洞+常見漏洞修復建議

一、漏洞級別 高級別漏洞&#xff1a;大部分遠程和本地管理員權限漏洞 中級別漏洞&#xff1a;大部分普通用戶權限、權限提升、讀懂受限文件、遠程和本杜漏洞、拒絕服務漏洞 低級別漏洞&#xff1a;大部分遠程非授權文件存取、口令恢復、欺騙、信息泄露漏洞 二、漏洞掃描的…

Kotlin Lambda和高階函數

Lambda和高階函數 本文鏈接&#xff1a; 文章目錄 Lambda和高階函數 lambda輸出&#xff08;返回類型&#xff09;深入探究泛型 inline原理探究 高階函數集合、泛型自己實現Kotlin內置函數 擴展函數原理companion object 原理 > 靜態內部類函數式編程 lambda 1、lambda的由…

Flink流批一體計算(13):PyFlink Tabel API之SQL DDL

1. TableEnvironment 創建 TableEnvironment from pyflink.table import Environmentsettings, TableEnvironment# create a streaming TableEnvironmentenv_settings Environmentsettings.in_streaming_mode()table_env TableEnvironment.create(env_settings)# or create…

嵌入式Linux開發實操(九):CAN接口開發

前言: CAN網絡在汽車中的使用可以說相當廣泛。而CAN網絡需要的收發器最常用的就是NXP 的TJA1042: CAN網絡:

605. 種花問題

鏈接 假設有一個很長的花壇&#xff0c;一部分地塊種植了花&#xff0c;另一部分卻沒有。可是&#xff0c;花不能種植在相鄰的地塊上&#xff0c;它們會爭奪水源&#xff0c;兩者都會死去。給你一個整數數組 flowerbed 表示花壇&#xff0c;由若干 0 和 1 組成&#xff0c;其中…

8/16總結

WebSocket是雙向通信協議&#xff0c;模擬Socket協議&#xff0c;可以雙向發送或者接收信息 而Http是單向的 WebSocket是需要瀏覽器和服務器握手進行建立連接的 而http是瀏覽器發起向服務器的連接&#xff0c;服務器預先并不知道這個連接 WebSocket在建立握手時&#xff0c;數…

Python3內置函數大全

吐血整理 Python3內置函數大全 1.abs()函數2.all()函數3.any()函數4.ascii()函數5.bin()函數6.bool()函數7.bytes()函數8.challable()函數9.chr()函數10.classmethod()函數11.complex()函數12.complie()函數13.delattr()函數14.dict()函數15.dir()函數16.divmod()函數17.enumer…

注解@JsonInclude

注解JsonInclude 1. 注解由來 JsonInclude是一個用于Java類中字段或方法的注解&#xff0c;它來自于Jackson庫。Jackson庫是一個用于處理JSON數據的流行開源庫&#xff0c;在Java對象和JSON之間進行序列化和反序列化時經常被使用。 2. 注解示例 下面是JsonInclude注解的一個…

【kubernetes】Pod控制器

目錄 Pod控制器及其功用 pod控制器有多種類型 1、ReplicaSet ReplicaSet主要三個組件組成 2、Deployment 3、DaemonSet 4、StatefulSet 5、Job 6、Cronjob Pod與控制器之間的關系 1、Deployment 查看控制器配置 查看歷史版本 2、SatefulSet 為什么要有headless&…

2023-08-18力扣每日一題

鏈接&#xff1a; 1388. 3n 塊披薩 題意&#xff1a; 一個長度3n的環&#xff0c;選n次數字&#xff0c;每次選完以后相鄰的數字會消失&#xff0c;求選取結果最大值 解&#xff1a; 這波是~~&#xff08;ctrl&#xff09;CV工程師了~~ 核心思想是選取n個不相鄰的元素一定…

無涯教程-Perl - splice函數

描述 此函數從LENGTH元素的OFFSET元素中刪除ARRAY元素,如果指定,則用LIST替換刪除的元素。如果省略LENGTH,則從OFFSET開始刪除所有內容。 語法 以下是此函數的簡單語法- splice ARRAY, OFFSET, LENGTH, LISTsplice ARRAY, OFFSET, LENGTHsplice ARRAY, OFFSET返回值 該函數…

Vue 項目運行 npm install 時,卡在 sill idealTree buildDeps 沒有反應

解決方法&#xff1a;切換到淘寶鏡像。 以下是之前安裝的 xmzs 包&#xff0c;用于控制切換淘寶鏡像。 該截圖是之前其他項目切換淘寶鏡像的截圖。 切換鏡像后&#xff0c;順利執行 npm install 。