JavaWeb servlet jsp 上传图片,图片存入数据库,图片从数据库中取出,页面显示图片

前言

本篇其实写的不够好,具体可以看我后来的改进:
JavaWeb servlet jsp 使用七牛云API上传图片
本篇是图片直接存到数据库里面,改进是用对象存储来存图片,然后把url存到数据库中,这样就速度会快很多

通过javaBean创建表结构,通过jsp界面录入数据,具备上传图片的功能,并提供一个列表界面,用分页及表格形式显示这些数据,在列表界面点击某条记录,跳到详细信息界面,能把上传的照片显示出来

效果:

image-20211031211048364

image-20211031211150163

首先,代码仅供参考,本人水平有限,没有用jsp写过太多代码,很多地方我自己都觉得很不好,好在功能算是勉强完成了,如果有想交流的可以在评论留言,欢迎交流

简单说,这次作业就是一个巨型缝合怪,东凑凑西凑凑,页面用了layui的表格,强行从后台传json到页面,以及layui的bug,分页操作,前端的数据无法传到后端,导致徒有其表无法分页…
(除了分页其他都做了,分页其实也是可以的,只要它能将limit和page两个参数放到url上就行,我在sql那里有注释的一个版本就是)

因为作业是放在一块的,很难弄…
里面存留了一些方法,可能是调试或者没有用的,但是我没删掉

如果有些不太懂的,可以看最底下的参考,我很多代码都是参考里面的

DBUtil

数据库工具类,里面只有两个有用的方法ConnectioncloseConn

package top.sehnsucht.Util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * @Description:
 * @Author: Cai
 * @CreateTime: 2021/10/29
 */

public class DBUtil {
   
    // 定义数据库连接参数
    public static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
    public static final String URL = "jdbc:mysql://localhost:3306/xxxx";
    public static final String USERNAME = "root";
    public static final String PASSWORD = "xxxxxx";


    // 注册数据库驱动
    static {
   
        try {
   
            Class.forName(DRIVER_CLASS_NAME);
        } catch (ClassNotFoundException e) {
   
            System.out.println("注册失败!");
            e.printStackTrace();
        }
    }

    // 获取连接
    public static Connection getConn() throws SQLException {
   
        return DriverManager.getConnection(URL, USERNAME, PASSWORD);
    }

    // 关闭连接
    public static void closeConn(Connection conn) {
   
        if (null != conn) {
   
            try {
   
                conn.close();
            } catch (SQLException e) {
   
                System.out.println("关闭连接失败!");
                e.printStackTrace();
            }
        }
    }
    //测试
    public static void main(String[] args) throws SQLException {
   
        System.out.println(DBUtil.getConn());
    }
}

ImageUtil

特殊变量it,在ImageDBUtil.readImage2DB中数据库表进行id自增

里面2个方法,最主要的是readBin2Image,用来读取表中图片获取输出流,然后存入本地

package top.sehnsucht.Util;


import java.io.*;
import java.sql.Blob;

/**
 * @Description:
 * @Author: Cai
 * @CreateTime: 2021/10/29
 */

public class ImageUtil {
   
    public static Integer it = 1;
    /**
     * 读取本地图片获取输入流
     * @param path
     * @return
     * @throws IOException
     */
    public static FileInputStream readImage(String path) throws IOException {
   
        return new FileInputStream(new File(path));
    }

    /**
     * 读取表中图片直接存到本地
     * @param in
     * @param targetPath
     */
    public static void readBin2Image(Blob in, String targetPath) throws Exception{
   
        File file = new File(targetPath);
        OutputStream outputStream = new FileOutputStream(file);
        outputStream.write(in.getBytes(1,(int)in.length()));
    }
}

UrlUtil

url工具类,不过没有用上,因为参数根本没传过来…

package top.sehnsucht.Util;

import java.util.HashMap;
import java.util.Map;

/**
 * @Description:
 * @Author: Cai
 * @CreateTime: 2021/10/31
 */

public class UrlUtil {
   
    /**
     * 获取请求地址中的某个参数
     *
     * @param url
     * @param name
     * @return
     */
    public static String getParam(String url, String name) {
   
        return urlSplit(url).get(name);
    }

    /**
     * 去掉url中的路径,留下请求参数部分
     *
     * @param url url地址
     * @return url请求参数部分
     */
    private static String truncateUrlPage(String url) {
   
        String strAllParam = null;
        String[] arrSplit = null;
        url = url.trim().toLowerCase();
        arrSplit = url.split("[?]");
        if (url.length() > 1) {
   
            if (arrSplit.length > 1) {
   
                for (int i = 1; i < arrSplit.length; i++) {
   
                    strAllParam = arrSplit[i];
                }
            }
        }
        return strAllParam;
    }

    /**
     * 将参数存入map集合
     *
     * @param url url地址
     * @return url请求参数部分存入map集合
     */
    public static Map<String, String> urlSplit(String url) {
   
        Map<String, String> mapRequest = new HashMap<String, String>();
        String[] arrSplit = null;
        String strUrlParam = truncateUrlPage(url);
        if (strUrlParam == null) {
   
            return mapRequest;
        }
        arrSplit = strUrlParam.split("[&]");
        for (String strSplit : arrSplit) {
   
            String[] arrSplitEqual = null;
            arrSplitEqual = strSplit.split("[=]");
            //解析出键值
            if (arrSplitEqual.length > 1) {
   
                //正确解析
                mapRequest.put(arrSplitEqual[0], arrSplitEqual[1]);
            } else {
   
                if (arrSplitEqual[0] != "") {
   
                    //只有参数没有值,不加入
                    mapRequest.put(arrSplitEqual[0], "");
                }
            }
        }
        return mapRequest;
    }
}

ImageDBUtil

两个方法readImage2DBreadDB2Image,2就是to,即数据库和图片的相互转换

package top.sehnsucht.Util;


import 
为了创建一个简单的Java Web项目,我们将需要以下步骤: 1. **设置环境**: - 使用Eclipse或IntelliJ IDEA等IDE - 安装Tomcat作为应用服务器 - 配置Maven或Gradle作为构建工具 2. **项目结构**: - 创建一个`webapp`目录,包括`WEB-INF`, `jsp`, 和 `java` (存放Servlets) 等文件夹。 3. **数据库配置**: - 创建一个MySQL数据库创建一个表用于存储图片链接,比如`images`表,字段可能有`:id INT PRIMARY KEY AUTO_INCREMENT, src VARCHAR(255)`。 4. **JDBC连接**: - 在`java`文件夹下创建一个`DBConnection.java`,包含`Connection` 和 `Statement` 的实例,以及用于插入和查询图片链接的方法。 5. **JSP页面**: - 在`jsp`文件夹下创建一个HTML页面(如`upload.jsp`),包含一个表单,有一个`<form>`标签,`<input type="file" multiple/>`用于选择多张图片,以及一个按钮提交表单。在`<head>`部分引入Servlet的URL。 6. **Servlet编写**: - 创建一个名为`ImageUploadServlet.java`的文件,继承自`HttpServlet`。在`doPost`方法中,处理表单提交,图片源,然后使用JDBC存储到数据库。同时,从数据库查询图片显示页面上。 ```java // ImageUploadServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ImageUploadServlet extends HttpServlet { //...省略了导入和连接数据库的部分 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // 获取上传图片 List<File> files = getUploadedFiles(request); // 插入图片链接到数据库 for (File file : files) { String path = saveToDatabase(file, connection); insertIntoImagesTable(path, statement); } // 查询数据库显示图片 List<String> imageUrlsFromDb = queryImageUrls(connection); displayImages(imageUrlsFromDb, response.getWriter()); } catch (SQLException e) { e.printStackTrace(); } } private List<String> queryImageUrls(Connection conn) { //... } private void displayImages(List<String> urls, PrintWriter out) { for (String url : urls) { out.println("<img src='" + url + "' alt='Uploaded Image'/>"); } } private List<File> getUploadedFiles(HttpServletRequest request) { //... } private String saveToDatabase(File file, Connection conn) { //... } //...其他方法和关闭资源等 } ``` 7. **部署项目**: - 将整个`webapp`目录复制到Tomcat的webapps目录下 - 启动Tomcat,访问`http://localhost:8080/your-app-name/upload.jsp`来测试上传显示图片功能。 完成以上步骤后,用户可以上传多张图片,它们的链接会存储到数据库页面上通过查询数据库生成的`img`元素展示出来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值