java文件上传资料 ctrl C + ctrl V again sorry everybody~

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

apache fileupload:

common-fileupload是jakarta项目组开发的一个功能很强大的上传文件组件

下面先介绍上传文件到服务器(多文件上传):

 

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
import org.apache.commons.fileupload.*;

public class upload extends HttpServlet {
    
private static final String CONTENT_TYPE = "text/html; charset=GB2312";

    
// Process the HTTP Post request
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        response.setContentType(CONTENT_TYPE);
        PrintWriter out 
= response.getWriter();
        
try {
            DiskFileUpload fu 
= new DiskFileUpload();
            
// 设置允许用户上传文件大小,单位:字节,这里设为2m
            fu.setSizeMax(2 * 1024 * 1024);
            
// 设置最多只允许在内存中存储的数据,单位:字节
            fu.setSizeThreshold(4096);
            
// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
            fu.setRepositoryPath("c:/windows/temp");
            
// 开始读取上传信息
            List fileItems = fu.parseRequest(request);
            
// 依次处理每个上传的文件
            Iterator iter = fileItems.iterator();

            
// 正则匹配,过滤路径取文件名
            String regExp = ".+//(.+)$";

            
// 过滤掉的文件类型
            String[] errorType = { ".exe", ".com", ".cgi", ".asp" };
            Pattern p 
= Pattern.compile(regExp);
            
while (iter.hasNext()) {
                FileItem item 
= (FileItem) iter.next();
                
// 忽略其他不是文件域的所有表单信息
                if (!item.isFormField()) {
                    String name 
= item.getName();
                    
long size = item.getSize();
                    
if ((name == null || name.equals("")) && size == 0)
                        
continue;
                    Matcher m 
= p.matcher(name);
                    
boolean result = m.find();
                    
if (result) {
                        
for (int temp = 0; temp < errorType.length; temp++) {
                            
if (m.group(1).endsWith(errorType[temp])) {
                                
throw new IOException(name + ": wrong type");
                            }

                        }

                        
try {

                            
// 保存上传的文件到指定的目录

                            
// 在下文中上传文件至数据库时,将对这里改写
                            item.write(new File("d:/" + m.group(1)));

                            out.print(name 
+ "&nbsp;&nbsp;" + size + "<br>");
                        }
 catch (Exception e) {
                            out.println(e);
                        }


                    }
 else {
                        
throw new IOException("fail to upload");
                    }

                }

            }

        }
 catch (IOException e) {
            out.println(e);
        }
 catch (FileUploadException e) {
            out.println(e);
        }


    }

}

现在介绍上传文件到服务器,下面只写出相关代码:

以sql2000为例,表结构如下:

字段名:name    filecode

类型: varchar     image

数据库插入代码为:PreparedStatement pstmt=conn.prepareStatement("insert into test values(?,?)");

代码如下:

。。。。。。

           try{
             //item.write(new File("d://" + m.group(1)));//这段代码如果不去掉,将一同写入到服务器中

             int byteread=0;

             InputStream inStream=item.getInputStream();  //读取输入流,也就是上传的文件内容
             pstmt.setString(1,m.group(1));
             pstmt.setBinaryStream(2,inStream,(int)size);
             pstmt.executeUpdate();
             inStream.close();

             out.println(name+"&nbsp;&nbsp;"+size+"<br>");
           }

。。。。。。

这样就实现了上传文件至数据库

文件上传原理:

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.PageContext;

//确定您的环境中存在如上包
public class upload {
    
private ServletRequest request;

    
private ServletResponse response;

    
private ServletConfig config;

    ServletInputStream DATA;

    
int FormSize;

    File f1;

    FileOutputStream os;

    DataInputStream is;

    String filename;

    
byte[] b;

    
byte t;

    
boolean flag = false;

    
public upload() {
    }


    
// 初始化
    public void initialize(ServletConfig config, HttpServletRequest request,
            HttpServletResponse response) 
throws IOException {
        
this.request = request;
        
this.response = response;
        
this.config = config;
        DATA 
= request.getInputStream();
        FormSize 
= request.getContentLength();
    }


    
public void initialize(PageContext pageContext) throws IOException {
        request 
= pageContext.getRequest();
        response 
= pageContext.getResponse();
        config 
= pageContext.getServletConfig();
        DATA 
= request.getInputStream();
        FormSize 
= request.getContentLength();
    }


    
public boolean setFilename(String s) {
        
try {
            File f1 
= new File(s);
            os 
= new FileOutputStream(f1);
        }
 catch (IOException e) {
            
return (false);
        }

        
return (true);
    }


    
public void getByte() {
        
int i = 0;
        
try {
            is 
= new DataInputStream(DATA);
            b 
= new byte[FormSize];

            
while (true) {
                
try {
                    t 
= is.readByte();
                    b[i] 
= t;
                    i
++;
                }
 catch (EOFException e) {
                    
break;
                }

            }

            is.close();
        }
 catch (IOException e) {
        }

    }


    
public boolean save() {
        
int i = 0, start1 = 0, start2 = 0;
        String temp 
= "";
        
if (!flag) {
            getByte();
            flag 
= true;
        }

        
try {
            temp 
= new String(b, "ISO8859_1");
        }
 catch (UnsupportedEncodingException e) {
            
return (false);
        }


        start1 
= temp.indexOf("image/");
        temp 
= temp.substring(start1);

        start1 
= temp.indexOf(" ");

        temp 
= temp.substring(start1 + 4);
        start2 
= temp.indexOf("; ");
        
if (start2 != -1) {
            temp 
= temp.substring(0, start2);
        }

        
try {
            
byte[] img = temp.getBytes("ISO8859_1");
            
for (i = 0; i < img.length; i++) {
                os.write(img[i]);
            }

            os.close();
        }
 catch (IOException e) {
            
return (false);
        }


        
return (true);

    }

新的:

在通过使用FileUpload组件上传的过程中,通过自己的调试,总结如下:
1)使用之前的准备,我用的是commons-fileupload-1.1-dev.jar和commons-io-1.1-dev.jar。
   解释一下:尽管有的资料解释是commons-fileupload-1.0-beta.jar和commons-beanutils.jar,通过调试的结果
   显示并不是需要commons-beanutils.jar文件,而是由于在parseRequest(request)的类有关继承于DiskFileItem
类。而他有private  org.apache.commons.io.output.DeferredFileOutputStream dfos。这样的就必须使用到commons-io-1.1-dev.jar。因此需要导入该包。否则就出classNotFound:.DeferredFileOutputStream的错误。

2)由于涉及文件,就涉及到文件系统。然而在java或应用服务器中对于文件系统的访问,就有一定的安全策略。
  需要将下列权限添加到您应用程序服务器的安全策略文件中:
permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete";
具体是添加到../bea/weblogic81/server/lib/weblogic.policy中的.
否则会可能出如下异常错误:
 org.apache.commons.fileupload.FileUploadException:
java.lang.reflect.InvocationTargetException
at
org.apache.commons.fileupload.FileUpload.createItem(FileUpload.java:615)
at
org.apache.commons.fileupload.FileUpload.parseRequest(FileUpload.java:474)
at
org.apache.commons.fileupload.FileUpload.parseRequest(FileUpload.java:355)
....

3)对于不同的服务器,在调试的过程中会出各种不一样的结果。这个与具体的服务器有关。

4)由于FileUpload在不断的更新版本,它的很多方法已经不推荐使用了(这与该组件的不断的改进有关)。通过对最新的帮助文档和网上的资料写了一个标准的程序如下:

 

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.*;
import java.util.*;
import java.util.regex.*;
import java.io.*;
import org.apache.commons.fileupload.servlet.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;

/*
 * 创建日期 2005-4-10
 *
 * TODO 要更改此生成的文件的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 
*/


/**
 * 
@author gaolong1
 * 
 * TODO 要更改此生成的类型注释的模板,请转至 窗口 - 首选项 - Java - 代码样式 - 代码模板
 
*/

public class FileUpload2 extends HttpServlet {

    
/**
     * Destruction of the servlet. <br>
     
*/

    
private String uploadPath = "D:/addnetFile/"; // 用于存放上传文件的目录

    
private File tempPath = new File("D:/addnetFile/tmp/"); // 用于存放临时文件的目录

    
public void destroy() {
        
super.destroy(); // Just puts "destroy" string in log
        
// Put your code here
    }


    
/**
     * The doPost method of the servlet. <br>
     * 
     * This method is called when a form has its tag value method equals to
     * post.
     * 
     * 
@param request
     *            the request send by the client to the server
     * 
@param response
     *            the response send by the server to the client
     * 
@throws ServletException
     *             if an error occurred
     * 
@throws IOException
     *             if an error occurred
     
*/

    
public void doPost(HttpServletRequest req, HttpServletResponse res)
            
throws ServletException, IOException {
        res.setContentType(
"text/html; charset=GB2312");
        PrintWriter out 
= res.getWriter();
        System.out.println(req.getContentLength());
        System.out.println(req.getContentType());
        DiskFileItemFactory factory 
= new DiskFileItemFactory();
        
// maximum size that will be stored in memory
        factory.setSizeThreshold(4096);
        
// the location for saving data that is larger than getSizeThreshold()
        factory.setRepository(new File("d:/File/addnetFile/temp"));

        ServletFileUpload upload 
= new ServletFileUpload(factory);
        
// maximum size before a FileUploadException will be thrown
        upload.setSizeMax(1000000);
        
try {
            List fileItems 
= upload.parseRequest(req);
            
// assume we know there are two files. The first file is a small
            
// text file, the second is unknown and is written to a file on
            
// the server
            Iterator iter = fileItems.iterator();

            
// 正则匹配,过滤路径取文件名
            String regExp = ".+//(.+)$";

            
// 过滤掉的文件类型
            String[] errorType = { ".exe", ".com", ".cgi", ".asp" };
            Pattern p 
= Pattern.compile(regExp);
            
while (iter.hasNext()) {
                FileItem item 
= (FileItem) iter.next();
                
// 忽略其他不是文件域的所有表单信息
                if (!item.isFormField()) {
                    String name 
= item.getName();
                    
long size = item.getSize();
                    
if ((name == null || name.equals("")) && size == 0)
                        
continue;
                    Matcher m 
= p.matcher(name);
                    
boolean result = m.find();
                    
if (result) {
                        
for (int temp = 0; temp < errorType.length; temp++) {
                            
if (m.group(1).endsWith(errorType[temp])) {
                                
throw new IOException(name + ": wrong type");
                            }

                        }

                        
try {

                            
// 保存上传的文件到指定的目录

                            
// 在下文中上传文件至数据库时,将对这里改写
                            item.write(new File("d:/" + m.group(1)));

                            out.print(name 
+ "&nbsp;&nbsp;" + size + "<br>");
                        }
 catch (Exception e) {
                            out.println(e);
                        }


                    }
 else {
                        
throw new IOException("fail to upload");
                    }

                }

            }

        }
 catch (IOException e) {
            out.println(e);
        }
 catch (FileUploadException e) {
            out.println(e);
        }


        
// 保存上传的文件到指定的目录

        
// 在下文中上传文件至数据库时,将对这里改写

    }


    
/**
     * Initialization of the servlet. <br>
     * 
     * 
@throws ServletException
     *             if an error occure
     
*/

    
public void init() throws ServletException {
        
// Put your code here
    }


}

VMware16虚拟机:下载和安装教程 VMware16 虚拟机 下载和安装教程 阅读详情

相关推荐

手把手教你搞定JBI投稿:从Statement of Significance到Declaration Statement的保姆级避坑指南

本文提供了一份详细的JBI投稿指南,重点解析Statement of Significance和Declaration of Interests的撰写技巧,帮助研究者避开常见格式陷阱。通过实战案例和检查清单,确保投稿符合JBI的学术严谨性和临床转化价值要求,提升稿件通过率。

weixin_29278805的博客 626

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 302

利用DRONEKIT-SITL + MAVPROXY + QGroundControl模拟飞行

dronekit: 一种用于无人机控制的python库。 dronekit-sitl:一种本地仿真工具,相当于本地虚拟化了一个无人机。 mavproxy:数据转发软件(类似于插线板的感觉,一个输入,多个相同的输出)。打开一个Anaconda prompt 首先激活相应的环境 然后运行如下命令: 保持2中的Anaconda prompt处于运行状态,另打开一个Anaconda prompt窗口,运行如下命令: tcp:127.0.0.1:5760: SITL默认端口,作为mavproxy的输入,把输入数据转发

Done___的博客 4344

第三篇 第 6 课

前置:第三篇第 1 课(stdx 引入),第二篇第 1 课(std.regex)。环境:仓颉 SDK 1.2.0。本文所有代码与输出均逐行实测。

weixin_41618057的博客 526

Pwntools不只是PWN:用它写个自动化Fuzz脚本,挖掘Linux命令行工具漏洞

本文探讨了如何利用Pwntools构建自动化Fuzz脚本,挖掘Linux命令行工具中的漏洞。通过详细的代码示例和实战案例,展示了Pwntools在Fuzzing中的高效性和灵活性,特别适合快速验证特定场景的安全问题。文章还提供了进阶技巧和避坑指南,帮助安全研究人员快速上手并提升测试效率。

weixin_28718345的博客 222

关于动态存储器dram中rank,bank,device之间的关系

DEVICE_WIDTH表示设备的带宽(单位bit),每个列(column)包含DEVICE_WIDTH 位(bit),每一行(row)包含NUM_COLS个column。   而每一个bank包含NUM_ROWS个行(row)。所以一个设备(device)的存储容量为PER_DEVICE_STORAGE =NUM_ROWS*NUM_COLS*DEVICE_WIDTH*NUM_BANKS (i

wyj7260的专栏 4733

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 355

SAP中成本估算没有找到工艺路线消息处理实例

在针对成品的标准成本核算处理过程中,系统中会经由设定好的策略来收集成品相关成本组成,最终计算出产成品的标准成本。关于成本组成,可以归纳为三个基本要素,料,工,费。即标准成本就是要知道,生产一件成品,需要消耗多少钱的原材料?消耗多少钱的人工?以及其它的间接消耗? 某日,接到CO同事的反馈,在用CK11N做产成品标准价格核算时,提示没有工艺路线确定,但该消息为绿灯,可以通过。基于业务上的谨慎,提出分析。 从提示可以看出问题与工艺路线有关。因为,成品工艺路线中设定有成品生产所耗工时,所以,在计算产成品标准

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 6280

信创环境下PageOffice文档控件适配与实践

信创适配做到文档控件这一层,拼的已经不是"有没有国产版本",而是同一个功能在两类终端上是否真的等价。等价的标准很具体:同一次点击能得到同样的结果,同一份公文能得到同样的版式,同一个项目不需要维护两套代码。这背后是三件并不轻松的工作:服务端用一套接口同时支撑两类终端,客户端把两种系统与四种芯片的安装包分发清楚,文档内核层由产品侧跟着 WPS 的版本走。浏览器这一层的压力,则被收进了产品自己的窗口里——升级节奏由产品掌握,不再交给运气。

zi_wu_xian的专栏 331

常见图像加密性能评价指标(详解加python实现)

前言 本文目的 介绍一些常见的用于图像加密的评价指标并予以代码实现,方便以后做实验时参考查阅。 图像加密领域所有常见的安全分析技术汇总如下图。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7N8tbKNx-1618308894314)(%E5%B8%B8%E8%A7%81%E5%9B%BE%E5%83%8F%E5%8A%A0%E5%AF%86%E6%80%A7%E8%83%BD%E8%AF%84%E4%BB%B7%E6%8C%87%E6%A0%87/1-s2.0-S0165

z2bns的博客 3万+

MaxEnt运行报错的各种问题及解决方法

由于我使用的环境数据并不是大部分人常用的worldclim上下载的气候数据,而是使用不同的四类环境数据,分别包括:降雨数据、气温数据、氮沉降数据和大气CO2浓度数据,数据需要分别从不同的网站下载,因此并不能得到非常一致的数据文件,导致MaxEnt运行时出现了各种各样的错误。文件终于能够读取了,然而计算到一半又弹出第三种问题,根据弹出的报错提示,找到错误所在那一行,用Notepad++打开,可以发现,这一行确实存在nan值,导致文件读取无法正常进行。出现上图所述的问题时,检查环境变量是否具有相同的行列号。

guye322的博客 1万+

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 561

手把手教你学simulink(40.1)--水力发电场景示例:基于 Simulink 的抽水蓄能电站水力发电

项目背景抽水蓄能电站是一种重要的储能技术,广泛应用于电力系统的调峰填谷、频率调节和备用电源。它通过在电力负荷低谷时将水从下水库抽到上水库储存,在电力负荷高峰时释放水进行发电,从而实现电能的高效利用。与传统的水电站不同,抽水蓄能电站可以在短时间内快速响应电网的需求,具有良好的灵活性和可靠性。本项目旨在使用 MATLAB/Simulink 模拟一个完整的抽水蓄能电站的水力发电过程,包括水泵-涡轮机系统、发电机、水道系统、控制系统等,并实现对电站的精确控制,确保其在不同工况下都能稳定运行。

MHD0815的博客 886

Java 集合容器高频面试题全解:HashMap 树化阈值、1.7 死循环与 ConcurrentHashMap 演进(2026 招聘 JD 真题复盘)

HashMap 树化阈值 8 的泊松分布依据、退化阈值 6 的防抖设计、JDK 1.7 头插成环死循环的排查与修复、1.8 尾插后为何仍线程不安全、ConcurrentHashMap 放弃分段锁的原因与 ForwardingNode 协作扩容、computeIfAbsent 死锁陷阱、大集合找重复的场景题选型,附三层追问链自测。题目来源为 38 期公开招聘 JD 样本与字节、拼多多、建行、美团、快手公开面经。

蒙眼过河 422

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

spdlog 同步日志库使用详解

spdlog是一个轻量级 C++ 日志库,支持同步日志、异步日志、多线程日志、日志文件轮转和自定义日志格式。对于嵌入式 Linux 应用开发,我建议先使用。它可以帮我们完成:日志级别过滤。时间戳和线程 ID 输出。日志格式化。终端和文件输出。多线程安全写入。日志文件按大小或时间轮转。我们不需要自己实现互斥锁、文件写入、日志格式化和轮转等底层功能。

zengjiajun2006的博客 1121

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JavaSE通关手册:数据类型与变量

代码无需额外处理,编译时编译器自动完成转换。

xys_678的博客 231

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 368

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 176

Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

【代码】Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

m0_64476639的博客 341

动态代理两大流派:JDK 代理与子类代理

业务类想加日志,最直白的写法是侵入式修改: 问题很明显:每个方法都要改一遍,改一个业务要动十处。代理模式的解法是:调用方不直接依赖 ,而是依赖一个代理对象。代理对象长得跟目标一模一样,调用它 → 代理先执行增强逻辑 → 再转调真实对象。 关键在于:代理对象的类型是哪来的?这就是"动态"二字的含义:代理类在运行时才诞生。两个角色: 承载增强逻辑, 负责生成代理类。 组装代理并调用: 输出: 业务代码 一行没动,增强逻辑全在 里。这就是 AOP 的味道。 内部四步: 第 2 步 内部:先查 (同一个接口

Android的专栏 603

c++ explicit关键字详解

explicit。

拒绝AI文,努力在AI时代写出感动人心的好文章 166

TRingBuffer两端都能增删(快递站版)

TRingBuffer 是一个支持两端增删、下标访问且容量动态增长的环形双端队列。它通过无符号索引的永不归零设计,利用减法自动模运算实现空满判断与元素计数,避免了传统环形缓冲浪费格子的问题。内部以票号(索引)标记首尾,扩容时重排元素为连续存储,保证 O(1) 操作与高缓存效率。虽不线程安全,但其高效性使其成为游戏开发中事件队列、命令缓冲等场景的理想选择。

u013768914的博客 312

Teamcenter Java SOA 开发:连接、查询与保存

本文介绍如何通过 Java 调用 Teamcenter SOA 接口实现外部系统对接,涵盖连接登录、查询保存等核心操作。以最小闭环示例展示 Connection、Service、ModelObject 等关键组件的使用,强调错误处理与事务管理要点。梳理了 DataManagement、Query、File Management 等 API 模块分工,并结合“工作移交WebService”案例,说明幂等性设计与流程状态返回的重要性。适用于 Web 门户、ERP 集成等场景,建议批量操作用 bulk 接口优化性

软件工程师文艺 257

Mac上装了最新版本的Android Studio,但是没找到jdk的设置选项也没找到jbr的目录

新版Android Studio(2025.3.1+)因三项变更导致常见问题:一、JDK设置移至“DaemonJVM criteria”,新项目默认自动探测或下载JDK;二、JBR目录改名为带版本号的jbr-21等,需进入.app/Contents/查看,或通过About窗口确认运行时;三、命令行缺adb因platform-tools未加入PATH,需在SDK Manager中勾选并配置~/.zshrc中的ANDROID_HOME及PATH。重装或清理残留可解决缺失问题,切勿手动设JAVA_HOME或安装冲

Programming is a highly artistic endeavor 387

Java Arrays.asList 常见坑详解|UnsupportedOperationException、数组联动、基本类型 bug

解析 Arrays.asList 常见开发陷阱,演示 UnsupportedOperationException、底层数组引用共享、基本类型数组问题,区分 Arrays 内部 ArrayList 与 java.util.ArrayList,给出数组转 List 的各种场景正确代码。

weixin_42617033的博客 503
上一篇: java实现javascript escape unescap
下一篇: oracle连接池配置
nobody_java
博客等级 码龄20年 2粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值