springmvc实现文件上传书本管理CRUD

news/2024/5/4 20:53:41/文章来源:https://blog.csdn.net/Bugxiu_fu/article/details/126621138

今天小编给大家分享文件上传,和对书本管理进行新增、修改、删除、查询。

效果展示

首页

新增 

修改

 

一、书本管理CRUD 

1.开发前必做的配置

1.1 导入pom.xml文件依赖

实现CRUDspringmvc的jar包

<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version>
</dependency>

 jstl标签库与c标签导入依赖

<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>
防止Spring内存溢出监听器 
<listener><listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>

 中文编码处理

随后小编为大家提供的web.xml,在文章最后部分,将入项目并在web.xml中配置,以便于处理中文编码。

<!-- 中文乱码处理 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!--web.xml 3.0的新特性,是否支持异步--><async-supported>true</async-supported><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

开发之前必须要写一个springmvc配置文件,文章最后会附上完整的sringmvc.xml文件

springmvc.xml有以下要点:

1.扫描指定类与包,use-default-filter表示只扫描该类
<context:component-scan base-package="com.zking" use-default-filters="false">

2.ViewResolver表示控制器读取显示项目目标位置, prefix:项目路径名前部分 suffix:项目路径名后部分

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar --><property name="viewClass"value="org.springframework.web.servlet.view.JstlView"></property><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/>
</bean>

2.以下是后台实现代码

以下注解:

//生成set,get和toStirng方法
@Data
//表示无参构造器
@NoArgsConstructor
//表示有参构造器
@AllArgsConstructor

@Repository:表示它是数据访问层

@Service:表示它是业务逻辑层

model层

 mapper层

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.zking.mybatis.mapper.Ibookmapper"><insert id="addBooks">insert into t_book(bname,price,type,info)values(#{bName},#{price},#{type},#{info})</insert><update id="editBooks">update t_book set bName=#{bName},price=#{price},type=#{type},info=#{info}where bid =#{bid}</update><delete id="delBooks">delete from t_book where bid=#{bid}</delete><select id="listBook" resultType="com.zking.mybatis.model.Book">select bid,bname bName,price,type,info from t_book<where><if test="bName != null and bName !=''">and bname like concat('%',#{bName},'%')</if></where></select><select id="cxdg" resultType="com.zking.mybatis.model.Book">select bid,bname bName,price,type,info from t_book where bid=#{bid}</select>
</mapper>

Connllert层

以下注解:

  • @Controller:该注解在springmvc中用于标记一个控制器,类似的注解还有@RestController:相当于@ResponseBody + @Controller合在一起的作用。
  • @RequestMapping:该用于标记请求路径,在有些参考资料中也称之为服务端点。该注释可以用在方法上也可以用在类上。

新增页面

 修改页面

 删除页面

编写一个简单的controller

@Controller
public class BookController {@Autowiredprivate Ibookservice service;@RequestMapping("listBook")public String listBook(Book book, Model model){List<Book> bookList = service.listBook(book);model.addAttribute("listBook",bookList);return "book/index";}@RequestMapping("addBook")public String addBook(){return "book/add";}@RequestMapping("addsBook")public String addsBook(Book book){service.addBooks(book);return "redirect:/listBook";}@RequestMapping("opendel")public String delBook(Book book){service.delBooks(book);return "redirect:/listBook";}@RequestMapping("updbook")public String updBook(Book book,Model model){Book book1 = service.cxdg(book);model.addAttribute("book",book1);return "book/update";}@RequestMapping("updsbook")public String updsBook(Book book){service.editBooks(book);return "redirect:/listBook";}}

service层

@Service
public class Bookserviceimpl implements Ibookservice{@Autowiredprivate Ibookmapper bookmapper;@Overridepublic List<Book> listBook(Book book){return  bookmapper.listBook(book);}@Overridepublic void addBooks(Book book) {bookmapper.addBooks(book);}@Overridepublic void editBooks(Book book) {bookmapper.editBooks(book);}@Overridepublic void delBooks(Book book) {bookmapper.delBooks(book);}@Overridepublic Book cxdg(Book book) {return bookmapper.cxdg(book);}
}

3.以下是前台实现代码 

index

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>书本首页</title>
</head>
<body>
<div style="text-align: center"><h2>小欣书本首页</h2>
<form action="<%=request.getContextPath()%>/listBook" method="get"><label>书本名称:</label><input type="text" name="BName"><input type="submit" value="查询" ><a href="<%=request.getContextPath()%>/addBook">添加</a>
</form>
<table border="1" width="100%"><thead><tr><th>ID</th><th>名称</th><th>价格</th><th>类型</th><th>操作</th></tr></thead><tbody><c:forEach items="${listBook}" var="b"><tr><td>${b.bid}</td><td>${b.BName}</td><td>${b.price}</td><td>${b.type}</td><td>${b.info}</td><td><a href="<%=request.getContextPath()%>/opendel?bid=${b.bid}">删除</a><a href="<%=request.getContextPath()%>/updbook?bid=${b.bid}">修改</a></td></tr></c:forEach></tbody>
</table>
</div>
</body>
</html>

add

update

最...

后小遍给大家 

附上完整的springmvc文件

<?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"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 通过context:component-scan元素扫描指定包下的控制器--><!--1) 扫描com.zking.zf及子子孙孙包下的控制器(扫描范围过大,耗时)--><!--<context:component-scan base-package="com.zking.zf"/>--><!--1) use-dafault-filters="false"的情况下,根据表达式包含(include-filter)或排除(exclude-filter)指定包--><context:component-scan base-package="com.zking" use-default-filters="false"><!--<context:include-filter type="regex" expression=".+\.controller\..*"/>--><!--<context:exclude-filter type="regex" expression=".+\.controller2\..*"/>--><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter --><!--两个bean,这两个bean是spring MVC为@Controllers分发请求所必须的。并提供了数据绑定支持,--><!--@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)--><mvc:annotation-driven></mvc:annotation-driven><!--3) ViewResolver     prefix:项目路径名前部分     suffix:项目路径名后部分  --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar --><property name="viewClass"value="org.springframework.web.servlet.view.JstlView"></property><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean><!--4) 单独处理图片、样式、js等资源 --><mvc:resources location="/static/" mapping="/static/**" cache-period="31536000"/></beans>

  附上完整的web文件

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"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_3_1.xsd"version="3.1"><display-name>Archetype Created Web Application</display-name><!-- Spring和web项目集成start --><!-- spring上下文配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:applicationContext*.xml</param-value></context-param><!-- 读取Spring上下文的监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- Spring和web项目集成end --><!-- 防止Spring内存溢出监听器 --><listener><listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class></listener><!-- 中文乱码处理 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!--web.xml 3.0的新特性,是否支持异步--><async-supported>true</async-supported><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- Spring MVC servlet --><servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:/spring-mvc.xml</param-value></init-param><!--表示容器启动时就加载该servlet--><load-on-startup>1</load-on-startup><!--web.xml 3.0的新特性,是否支持异步--><async-supported>true</async-supported></servlet><servlet-mapping><servlet-name>SpringMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

二、文件上传、下载 

1、编写数据库生成模型

后面编写mapper层,会对t_book表进行修改操作

后面编写mapper层,会对t_book_file表进行新增操作

 

t_book_file数据库

create table t_book_file
(file_id varchar(32) primary key comment '文件ID',real_name varchar(50) not null comment '文件名称',content_type varchar(50) not null comment '文件类型',url varchar(256) not null comment '文件路径'
);

2.在pom.xml文件中导入依赖的包:

代码如下 

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version>
</dependency>

3. 配置文件上传解析器

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 必须和用户JSP 的pageEncoding属性一致,以便正确解析表单的内容 --><property name="defaultEncoding" value="UTF-8"></property><!-- 文件最大大小(字节) 1024*1024*50=50M--><property name="maxUploadSize" value="52428800"></property><!--resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常--><property name="resolveLazily" value="true"/></bean>

4..编写mapper层

    int addUploadRecord(BookFile bookFile);int updatBook(Book book);BookFile loadBookFile(BookFile bookFile);
<insert id="addUploadRecord">insert into t_book_file(file_id, real_name, content_type, url)values(#{fileId}, #{realName},#{contentType},#{url})</insert><update id="updatBook">update t_book set file_id = #{FileId} where bid = #{bid}</update><select id="loadBookFile" resultType="com.zking.spring.model.BookFile">select file_id fileId,real_name realName, content_type contentType, urlfrom t_book_file where file_id=#{fileId}</select>

5.编写controller控制器

@Controller
public class UoloadController {//设置文件上传地址private final  String UPLOAD_PATH="/upload";@Autowiredprivate IBookservice bookservice;@RequestMapping("/openUploadPage")public String openUploadPage(Book book, Model model,HttpServletRequest req){//获取index页面传来的id对象String bid = req.getParameter("id");model.addAttribute("bid",Integer.valueOf(bid));return "Book/upload";//跳转到文件上传页面(修改方法)}@RequestMapping("/upload")public  String upload(MultipartFile img, HttpServletRequest req) throws IOException {/*MultipartFile img 上传图片路径*///获取虚拟图片名字String fname = img.getOriginalFilename();//生成随机字符串String uuid = UUID.randomUUID().toString().replace("-", "");//获取相对路径String path = UPLOAD_PATH + File.separatorChar + fname;//获取绝对路径(将相对路径放到绝对路径下)String realPath = req.getServletContext().getRealPath(path);//获取文件目标方法File targetFile = new File(realPath);//保存文件img.transferTo(targetFile);//更新文件(修改t_book表数据)String bid = req.getParameter("bid");Book book=new Book();book.setBid(Integer.parseInt(bid));book.setFileId(uuid);//修改方法bookservice.updatBook(book);//添加到t_book_file表String contentType = img.getContentType();BookFile bookFile = new BookFile();bookFile.setFileId(uuid);bookFile.setRealName(fname);bookFile.setContentType(contentType);bookFile.setUrl(path);//新增方法bookservice.addUploadRecord(bookFile);return  "redirect:/listBook";//跳转到index页面}

upload.jsp文件上传

 

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h2>图片上传</h2><form action="<%=request.getContextPath()%>/upload" enctype="multipart/form-data" method="post"><input type="hidden" name="bid" value="${bid}"><input type="file" name="img"><input type="submit" value="上传"></form>
</body>
</html>

6.上传成功后验证

上传完后进行查询,如果数据库出现这些数据说明上传成功

t_book表与t_file表关联属性file_id 

t_book_file表新增的数据 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.实现redis哨兵,模拟master故障场景

3.实现redis哨兵,模拟master故障场景 实验拓扑图 3.1 哨兵的准备实现主从复制架构 哨兵的前提是已经实现了一个redis的主从复制的运行环境,从而实现一个一主两从基于哨兵的高可用redis架构。 注意: master 的配置文件中的masterauth 和slave的都必须相同 所有主从节点的redis…

小波神经网络的基本原理,小波神经网络功能分析

小波神经网络的优势是什么&#xff1f;谢谢 小波神经网络相比于前向的神经网络,它有明显的优点:首先小波神经网络的基元和整个结构是依据小波分析理论确定的,可以避免BP神经网络等结构设计上的盲目性;其次小波神经网络有更强的学习能力,精度更高。 总的而言&#xff0c;对同样…

数据结构初步(一)- 时间与空间复杂度

目录前言1. 数据结构与算法1.1 数据结构是啥1.2 算法是啥2. 算法效率2.1 如何衡量一个算法的效率2.2 算法的复杂度3. 时间复杂度3.1 概念3.2 大O的渐进表示法3.3 例子分析计算Func2的时间复杂度计算Func3的时间复杂度计算Func4的时间复杂度计算strchr的时间复杂度计算冒泡排序的…

端口号被占用解决办法(超详细)

文章目录问题描述java.net.BindException: Address already in use: JVM_BindWeb server failed to start. Port 8899 was already in use.解决方案问题描述 java.net.BindException: Address already in use: JVM_Bind Web server failed to start. Port 8899 was already in…

极几何,本质矩阵,基础矩阵,单应矩阵

什么是三角化&#xff1f; 三角化就是下图的红字部分&#xff1a; 什么是极几何&#xff1f; 极几何描述了同一场景或者物体在两个视点图像间的对应关系。 下图中的O1和O2分别是两个相机的光心&#xff0c;即摄像机坐标系的原点。由下图可知给定了一个三维空间下的P点&…

07-Linux基本权限

1. 权限基本概述 1.1 什么是权限&#xff1f; 权限: 操作系统对用户能够执行的功能所设立的限制, 主要用于约束用户能对系统所做的操作, 以及内容访问的范围, 或者说, 权限是指某个特定的用户具有特定的系统资源使用权力.1.2 为什么要有权限&#xff1f; 因为系统中不可能只…

最详解消息队列以及RabbbitMQ之HelloWorld

1、消息队列 1、MQ的相关概念 1、什么是MQ MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。 在互联…

webpack中的插件

1.webpack插件的作用通过安装和配置第三方插件,可以拓展webpack的能力,从而让webpack用起来更方便。最常用的webpack插件如下有两个:webpack-dev-server 类似于node.js阶段用到的nodemon工具 每当修改了源代码,webpack会自动进行项目的打包和构建html-webpack-pluginwebpac…

(分布式缓存)Redis哨兵

对应的教程视频&#xff1a; 高级篇Day3-03-Redis哨兵_哔哩哔哩_bilibili 目录&#xff1a; 哨兵的作用和原理搭建哨兵集群RedisTemplate的哨兵模式 一、哨兵的作用和原理 二、搭建哨兵集群 1.集群结构 这里我们搭建一个三节点形成的Sentinel集群&#xff0c;来监管之前的Re…

C++版本的OpenCV 5.x编译生成opencv-python==5.x(GPU版本)接口并进行调用

实现文章连接&#xff1a;强力推荐】基于Nvidia-Docker-Linux(Ubuntu18.04)平台&#xff1a;新版OpenCV5.x(C)联合CUDA11.1(GPU)完美配置视觉算法开发环境 目录1、关于有粉丝私信问我怎么调用的问题2、opencv5.x&#xff08;GPU&#xff09;测试成功opencv-python5.x测试代码Op…

黑马C++ 02 核心6 —— 类和对象_继承(重难点)

文章目录1.1 继承基本语法普通实现(重复率高)继承实现(减少重复代码)1.2 继承方式公共继承保护继承私有继承1.3 继承中的对象模型1.4 继承中构造与析构顺序1.5 继承同名成员处理方法同名成员属性同名成员函数1.6 继承同名静态成员处理方式1.6.1 同名静态成员属性通过对象访问通…

第9章 Spring的数据库编程

目录/Contents第9章 Spring的数据库编程学习目标学习内容1 Spring JDBC1.1 JDBCTemplate概述1.1.1 JDBCTemplate作用1.1.2 抽象类JdbcAccessor的属性1.2 Spring JDBC的配置1.2.1 Spring JDBC中的4个包说明1.2.2 dataSource配置4个属性的含义1.2.3 dataSource属性值的设定要求2 …

【中秋怎么过】许一个愿,希望成都不要在静默管理中过中秋

今年的中秋又要到啦&#xff0c;诚邀亲爱的博主参与投稿&#xff0c;分享“程序员”视角下的中秋夜之美&#xff01; 内容可以是&#xff1a; 程序员过中秋的正确方式&#xff1a;团圆、赏月、还是惨兮兮地加班&#xff1f;互联网大厂的中秋仪式感&#xff1a;壕无人性&#…

嵌入式Linux入门-Linux文件IO讲解并实现copy程序

嵌入式Linux入门学习教程汇总&#xff1a;嵌入式Linux教程—裸机、应用、驱动完整教程目录 在Linux系统中&#xff0c;一切都是“文件”&#xff1a;普通文件、驱动程序、网络通信等等。所有的操作&#xff0c;都是通过“文件IO”来操作的。 IO就是input和output&#xff0c;…

[PostgreSQL的 SPI_接口函数]

Server Programming Interface&#xff08;SPI&#xff09;是PostgreSQL内核中的一个模块&#xff0c;这个模块让内核开发者可以在C函数中执行SQL语句&#xff0c;并具备管理事务的能力。通过它我们可以用C语言去调用数据库里的各种SQL。 这个SPI_比较便利的一点在于&#xff…

如何使用 Bootstrap 处理 CSS

如何使用 Bootstrap 处理 CSS 大家好!如果您像我一样开始使用 CSS 编码并使用它进行任何大型项目,那么您肯定会因为响应式布局、溢出和选择器特异性而感到数不清的头痛。这就是几周前我决定学习 Bootstrap 的原因,这里是它的文档和主要功能的简短描述,所以你也可以。引导程…

一、Azkaban简明笔记

1、azkaban部署 主要是集群部署安装。 1.1 准备安装包Downloads (azkaban.github.io)1.2 配置MySQL启动mysql mysql -uroot -proot创建azkaban数据库 create database azkaban;创建azkaban用户并赋予权限(可以不设置账号,继续使用root账号) -- 显示相关变量 SHOW VARIABLES …

实体店主最爱的中秋活动方案,直接照搬就能轻松爆单!

中秋将至&#xff0c;传统佳节和营销好时机一起到了&#xff01;利用氛围浓厚的节日进行营销活动&#xff0c;是吸引客户、增粉卖货的最佳手段之一&#xff0c;商户老板们可千万不能错过&#xff01; 但是&#xff0c;活动人人都能做&#xff0c;如何在一片节日促销中脱颖而出&…

JVM详解

1. 源文件 源文件就是我们编写Java代码的文件。文件扩展名为.java 2. 字节码文件 字节码文件是源文件编译后的文件。字节码文件是二进制文件&#xff0c;需要通过特定的工具才能查看。里面存放了源文件编译后的字节码指令。 3. 类加载器 Class Loader Java 程序运行时会由…

USB转GPIO应用方案

概述 沁恒提供的多款USB转接系列芯片均提供GPIO引脚功能&#xff0c;各引脚支持独立的输出输入&#xff0c;GPIO功能的使用需要与计算机端厂商驱动程序和应用软件配合使用。各芯片的默认GPIO引脚状态有所区别&#xff0c;可查阅芯片技术手册或参考方案中附表。 型号 CH344Q …