【JavaWeb开发-Servlet】拾起海中的漂流瓶超强版

news2024/11/19 10:43:36

目录

原版: 

一、思路:

二、实现:

三、资源分享

四、部署服务器时记得修改文件路径



原版: 

【JavaWeb开发-Servlet】拾起海中的漂流瓶增强版_代码骑士的博客-CSDN博客【代码】【JavaWeb开发-Servlet】拾起海中的漂流瓶增强版。https://blog.csdn.net/qq_51701007/article/details/128275638?spm=1001.2014.3001.5501

基于上次的版本,我又新增了上传显示图片功能。

思路和上传文字类似,也是插入一条数据然后随机显示,只不过处理图片数据和文字略有不同。

        先说思路,在看实现过程。

一、思路:

        在dao层实现数据的查询和插入功能,在业务层copy数据插入功能并实现随机显示功能,新建一个jsp前端页面,然后在servlet中完成请求处理。img.jsp是默认界面,showimg.do是显示图片路径,addimg.do是添加图片路径。

        显示时比较简单,直接从数据库中获取图片名,然后在前端进行拼接,从而显示数据。

        添加时比较复杂,需要导入上传文件时的专用jar包,然后新建一个文件夹保存图片到服务器(但是有个问题就是每次重启服务器图片都会消失数据库中的名字还在),然后把名字保存到数据库即可。

二、实现:

        新建一张表

        先什么都不要加

         创建实体类

package oms.ck.entity;

import java.util.Objects;

public class imgs {
	
	private int id;
	private String imgPath;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getImgPath() {
		return imgPath;
	}
	public void setImgPath(String imgPath) {
		this.imgPath = imgPath;
	}
	@Override
	public int hashCode() {
		return Objects.hash(id);
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		imgs other = (imgs) obj;
		return id == other.id;
	}
	@Override
	public String toString() {
		return "imgs [id=" + id + ", imgPath=" + imgPath + "]";
	}
	
	
}

       dao层

//----------------------------------图片-------------------------------------------------------
	
	//获取图片张数
	public int getImgCount()
	{
		int count = 0;
		try {
			
			Connection conn = DBUtil.getConnection();
			String sql = "select count(*) c from imgs";
			PreparedStatement prep=conn.prepareStatement(sql);
			ResultSet rs=prep.executeQuery();
			if(rs.next()){
				count=rs.getInt("c");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return count;
	}
	//获取图片
	public String getImg(int id) {
		String imgPath = null;
		try {
			Connection conn = DBUtil.getConnection();
			String sql = "select img from imgs where id = ?";
			PreparedStatement prep=conn.prepareStatement(sql);
			prep.setInt(1,id);
			ResultSet rs=prep.executeQuery();
			if(rs.next()){
				imgPath=rs.getString("img");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return imgPath;
	}
	//插入图片
	public void addImg(imgs img,int id) {
		try {
			Connection conn = DBUtil.getConnection();
			//定义SQL语句
			String sql = "insert into imgs(id,img)values(?,?)";
			//获取PreparedStatement对象
			PreparedStatement prep = conn.prepareStatement(sql);
			//添加占位符参数
			prep.setInt(1, id);
			prep.setString(2, img.getImgPath());
			//执行SQL
			prep.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

        service层

//抽取一个随机图片
	public String randomImg() {
		//定义一个图片路径
		String img = null;
		//获取图片总数
		int n = dao.getImgCount();
		//获取随机id
		Random rad=new Random();
		int id=rad.nextInt(n+1);//从1到n
		if(id==0) {
			id=1;
		}
		//查询
		img = dao.getImg(id);
		return img;
	}
	//将图片添加到数据库
	public void addImg(imgs img) {
		int id = 0;
		id = dao.getImgCount()+1;//实现顺序+1排列
		dao.addImg(img,id);
	}

        Servlet层

else if(path.equals("/showimg")){
			//从数据库中获取一张图片路径
			path = service.randomImg();
			System.out.println("取出"+path);
			request.setAttribute("path", path);
			//2、获取转发器
			RequestDispatcher dis=request.getRequestDispatcher("img.jsp");
			//3、转发
			dis.forward(request, response);	
		}else if(path.equals("/addimg")){
			//step1 创建一个工厂类型的实例 该实例的作用是为解析器提供了默认的配置
			DiskFileItemFactory facotry=new DiskFileItemFactory();
			//step2 创建一个解析器
			ServletFileUpload sfu=new ServletFileUpload(facotry);
			String fileName="";
			//step3使用解析器 解析数据
			try {
				//解析之后,会将表单中的数据转换成一个个FileItem对象。一个表单域中的数据对应于一个FileItem对象
				List<FileItem>items=sfu.parseRequest(request);
				//step4 遍历items集合
				for(int i=0;i<items.size();i++){
					//读取表单域中的数据时,要先区分表单域的类型
					FileItem item=items.get(i);
					if(item.isFormField()){
						//如果时普通表单域 先不做任何处理
					}else{
						//如果不是普通表单域  那就是文件上传表单域
						ServletContext sctx=this.getServletContext();
						//通过ServletContext对象的getRealPath方法来或文件的实际路径
						String savePath=sctx.getRealPath("uploadimgs");
						//获取文件名
						fileName=item.getName();
						File file = new File(savePath+"\\"+fileName);
						//保存文件至文件夹
						item.write(file);
						
						//将文件名保存在数据库中
						imgs img = new imgs();
						img.setImgPath(fileName);
						service.addImg(img);
						System.out.println("存入相对路径"+img.getImgPath()+"\n"+"绝对路径"+savePath+"\\"+fileName);
					}
				}
				response.sendRedirect("img.jsp");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

        前端

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>海边拾起一个漂流瓶,是谁的祝愿呢?</title>
<link rel="stylesheet" type="text/css"href="statics/css/bootstrap.css" />
</head>
<body background="statics/image/1.png">
	<div class="panel">
		<h1 class="text-center">
			海边拾起一个漂流瓶,是谁的祝愿呢?
		</h1>
	</div>
	<%
		String say=(String)request.getAttribute("say");
	%>
	<div class="container">
		<form action="showimg.do" method="post" class="text-center">
			<input type="button" value="回到海边" onclick="location='main.jsp'" class="btn btn-default"/>
    		<input type="button" value="换一张" onclick="location='showimg.do'" class="btn btn-default"/>
		</form>
	</div>
	<br>
	<div class="text-center">
	<%
		String path=(String)request.getAttribute("path");
	%>
		<img src="<%="uploadimgs/"+((path==null)?("3.png"):(path)) %>" alt="" width=500px height=500px class="img-thumbnail">
	</div>
	<div class="container">
		<form action="addimg.do" method="post" class="text-center" enctype="multipart/form-data">
			<div>
					<input type="file" name="file" style="height:40px;line-height:40px;width:100%">
					<br>
					<input type="submit" value="上传我的"> 
    		</div>
		</form>
	</div>
</body>
</html>

        新建文件夹

        导入的jar包

 

三、资源分享

 获取连接:

【JavaWeb开发-Servlet】文件上传功能(UpLoad)_代码骑士的博客-CSDN博客

完整项目源码:

https://download.csdn.net/download/qq_51701007/87269047

四、部署服务器时记得修改文件路径

 

else{
						//如果不是普通表单域  那就是文件上传表单域
						ServletContext sctx=this.getServletContext();
						//通过ServletContext对象的getRealPath方法来或文件的实际路径
						String savePath=sctx.getRealPath("/uploadimgs");
						//获取文件名
						fileName=item.getName();
						File file = new File(savePath+"/"+fileName);
						//保存文件至文件夹
						item.write(file);
						
						//将文件名保存在数据库中
						imgs img = new imgs();
						img.setImgPath(fileName);
						service.addImg(img);
						System.out.println("存入相对路径"+img.getImgPath()+"\n"+"绝对路径"+savePath+"\\"+fileName);
					}

之前图片上传不了原来是路径写错了!记得有问题就去查日志!

有问题就去查日志!

有问题就去查日志!

有问题就去查日志!

 

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

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

相关文章

SMART PLC运动超驰功能编程应用(含V2.7版本固件下载)

什么是运动控制超驰功能,运动超驰功能如何开启,请参看下面的导图部分: 下面一步步教大家如何更新CPU固件版本。 S7-200 SMART PLC自定义脉冲控制功能块相关详细组态设置,请参看下面的博客。链接如下: S7-200 SMART PLC自定义脉冲轴控功能块AxisControl_FB(梯形图)_RXX…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:MapView MaptrimView

本文简述如何在Smobiler中使用MapView和MaptrimView。 Mapview MapView 地图插件&#xff0c;可用于显示指定地点地图&#xff0c;显示轨迹等。 Step 1. 新建一个SmobilerForm窗体&#xff0c;再拖入MapView和Button&#xff0c;MapView.Size设置&#xff08;300,300&#xf…

Spring Batch 批处理入门案例解析

引言 书接上篇 Spring Batch 批处理入门案例 &#xff0c;上篇带小伙伴们写了一个Spring Batch 入门案例&#xff0c;里面有哪些注意要点呢&#xff1f;本篇一起来分析分析~ 案例解析 整个入门案例核心点有5个&#xff0c;一一来讲解一下 EnableBatchProcessing 批处理启动…

AD8226组成的高精度放大电路之一

工业设备中常常需要用到高速、高精度的模拟前端方案,而其中控制系统中的信号电平通常为以下几类之一:单端电流(4 mA 至 20 mA)、单端差分电压(0 V 至 5V、0 V 至10 V、5 V、10 V)或者来自热电偶或称重传感器等传感器的小信号输入。大共模电压摆幅也非常典型,尤其是小信号…

Spring Cloud Zuul过滤器介绍及使用(传递数据、拦截请求和异常处理)

在教程《Zuul网关的介绍及使用》中一开始就介绍过&#xff0c;Zuul 可以实现很多高级的功能&#xff0c;比如限流、认证等。想要实现这些功能&#xff0c;必须要基于 Zuul 给我们提供的核心组件“过滤器”。下面我们一起来了解一下 Zuul 的过滤器。 过滤器类型 Zuul 中的过滤…

问题来了,拔掉网线几秒,再插回去,原本的 TCP 连接还存在吗?

今天&#xff0c;聊一个有趣的问题&#xff1a;拔掉网线几秒&#xff0c;再插回去&#xff0c;原本的 TCP 连接还存在吗&#xff1f; 可能有的同学会说&#xff0c;网线都被拔掉了&#xff0c;那说明物理层被断开了&#xff0c;那在上层的传输层理应也会断开&#xff0c;所以原…

MarkDown 项目中如何引入开源MarkDown? 史上最简单教程

目录 一、少不了的东西 editor.md ① 下载链接 ② 将其引入到自己的项目中 引入依赖 二、代码部分 一些小细节 1. 编辑页 2. 展示页 一、少不了的东西 如果想要在一个页面中使用MarkDown &#xff0c;那么你首先就要引入MarkDown editor.md ① 下载链接 GitHub下…

Flutter和Rust如何优雅的交互

前言 文章的图片链接都是在github上&#xff0c;可能需要...你懂得&#xff1b;本文含有大量关键步骤配置图片&#xff0c;强烈建议在合适环境下阅读 Flutter直接调用C层还是蛮有魅力&#xff0c;想想你练习C&#xff0c;然后直接能用flutter在上层展示出效果&#xff0c;是不…

【中级ECharts技术】transform进行数据转换和dataZoom在项目中的使用(可视化非常的强劲)

transform 进行数据转换 数据转换是这样一个公式:outData=f(inputData)。F是转换方法,例如filter、sort、region、boxplot、cluster、aggregate(todo)等。有了数据转换功能,我们至少可以做到以下几点: 将数据分成多个部分,并在不同的饼图中显示它们。 执行一些数据统计…

C++ 注释

&#x1f4d2;博客主页&#xff1a; ​​开心档博客主页​​ &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由开心档原创&#xff01; &#x1f4c6;51CTO首发时间&#xff1a;&#x1f334;2022年12月12日&#x1f334; ✉…

Httpd服务进阶知识-HTTP协议详解

一.WEB开发概述 1>.C/S编程 CS即客户端、服务器编程。 客户端、服务端之间需要使用Socket&#xff0c;约定协议、版本(往往使用的协议是TCP或者UDP)&#xff0c;指定地址和端口&#xff0c;就可以通信了。客户端、服务端传输数据&#xff0c;数据可以有一定的格式&#xff…

Go开发中配置一个Logger日志的功能实现(结合zap日志库)

为什么需要Logger 一般在开发项目的时候我们都是需要一个存储日志的文件&#xff0c;因为在部署项目以后&#xff0c;我们只能通过去筛查日志进行检索问题&#xff0c;这时候日志是否可以呈现清晰这个对于我们进行排查工作是十分重要的&#xff0c;所以Logger能否展示出我们最…

基于PHP的中华诗歌网的设计与实现

目 录 Abstract 2 目 录 3 1 绪论 5 1.1 研究背景 5 1.2诗歌鉴赏网站的意义 5 1.3网站开发的设计思想 5 2 系统相关技术 7 2.1 MySQL数据库介绍 7 2.2 PHP技术介绍 8 3 系统需求分析 10 3.1 系统需求分析 10 3.2系统可行性分析 10 3.3 系统用例分析 11 4 系统的详细设计 12 4.1…

QT 短时间大量图片传输,实现监控效果 (实时视屏传输) (暴力模式)

1.首先需要知道的知识 1.我使用的是 TCP 协议传输 &#xff0c;因为传输数据准确一点&#xff0c; 2. 然后是 套接字的 信号 , readyRead( ) ,这个信号的功能是只要套接字里面的 缓存区有数据&#xff0c;他就会发出这个信号。 3.我们传输数据有时候&#xff0c;会出现 粘…

[附源码]计算机毕业设计公共台账管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于intel+fpga平台实现设备AI 和数据转换智能化

通过 AI 和数据转换实现智能设备数字化 数据收集、可视化、自动控制和 AI 分析有效促进了设备智能化 &#xff08;M2I&#xff09; 和工业 AI的螺丝&#xff0c;是推动智能制造向前发展的两个齿轮。通过"设备智能化 "和"工业AI"赋能智能设备功能&#xff…

Kafka如何实现延迟队列?

Kafka并没有使⽤JDK⾃带的Timer或者DelayQueue来实现延迟的功能&#xff0c;⽽是基于时间轮自定义了⼀个⽤于实现延迟功能的定时器&#xff08;SystemTimer&#xff09;。JDK的Timer和DelayQueue插⼊和删除操作的平均时间复杂度为O(nlog(n))&#xff0c;并不能满⾜Kafka的⾼性能…

centOS配置ss5并解决部分出现的问题

文章目录代理服务器socks5协议搭建ss5代理服务器安装ss5修改配置文件添加用户名和密码修改ss5端口修改ss5启动权限启动ss5服务配置socks全局使用qq验证参考代理服务器 实际的工作的有时候需要用到代理服务器&#xff0c;通过代理服务器可以一定程度上隐藏自己的真实IP&#xf…

聚焦 | 千海金与大工科技园“喜结连理” 正式达成战略合作

为贯彻国家碳达峰碳中和相关工作要求&#xff0c;加快实施可再生能源替代行动&#xff0c;推动可再生能源加快步入高质量跃升发展新阶段。12月9日&#xff0c;由千海金集团、大连理工大学科技园联合成立的低碳科技与绿色金融研究中心举行揭牌仪式。 大连市西岗区科工贸副局长李…

nacos--基础--1.3--理论--架构

nacos–基础–1.3–理论–架构 1、基本架构及概念 1.1、服务 (Service) 是指一个或一组软件功能(例如特定信息的检索或一组操作的执行)&#xff0c;其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态&#xff0c;举例如下 Kuber…