[记录]Java使用中的问题

1. Java一个对象多次调用set方法

Java中创建一个对象object,并用List对象list的add方法保存object。
object再次调用set方法,list再次添加后会发现之前添加的内容和第二次set内容相同,第一次set的对象被覆盖了。
这是因为内存只创建了一次object对象,之后每次set并add,之前的object对象也会被更新。
因此当在写代码时,当在循环内部object调用set方法,list添加object对象时要在循环内创建object对象。这样的object在内存中并不是独一份了。

2. Response对象进行页面跳转没有效果

if(pageEntity==null){
        System.out.println("请求顺序出错,请先访问当前项目下/ThreeTierArchitectureJSP/QueryStudentByPage");
        response.sendRedirect("QueryStudentByPage");
    }

判断pageEntity为空时,使页面用response对象进行页面跳转时发现,不管怎么改 response.sendRedirect(“QueryStudentByPage”);中的url对象都不会跳转,进而执行后面代码造成对pageEntity这个空对象的操作。原来是在判断语句末尾没加return。如下就好了

  if(pageEntity==null){
        System.out.println("请求顺序出错,请先访问当前项目下/ThreeTierArchitectureJSP/QueryStudentByPage");
        response.sendRedirect("QueryStudentByPage");
        return;
    }

3. 上传文件提示“文件名、目录名或卷标语法不正确”

我在代码中使用了 FileItem.getName方法,获取上传文件的名字。

 String fileName = fileItem.getName();

但是后端的在调用getName方法时,不同浏览器返回给后端的文件名也不尽相同,分为带绝对路径的文件名和不带绝对路径的文件名这两种。所以可能存在在A浏览器可以上传成功,但是到B就报错这种情况。自己测试过上传的浏览器Microsoft Edge(带绝对路径的文件名),Chrome(不带绝对路径的文件名)。
如何做到万无一失,每个浏览器都可以上传呢?可以通过subString的方法截取字符串获取不带绝对路径的文件名

      fileName=fileName.substring(fileName.lastIndexOf("\\")+1);

4. 下载文件大体步骤以及出现乱码解决

实现下载文件的话,doGet方法内先给response设置响应头

resp.addHeader("content-Type","application/octet-stream");
resp.addHeader("content-Disposition","attachment;fileName="+ fileName);

先使用getServletContext().getResourceAsStream()方法获得文件输入流

InputStream inputStream = getServletContext().getResourceAsStream(fileFatherPath+fileName);

再通过resp.getOutputStream()获得对用户响应的输出流后

ServletOutputStream servletOutputStream = resp.getOutputStream();

之后把 inputStream 内读到的内容写入到 servletOutputStream 里就完成了下载。
之后会发现下载中文文件会出现和实际文件名字不完全相同的现象,比如下载图片 “杨超越.jpg”,下载提示文件名却是 _.jpg_ 这样,这时对文件名设置响应编码格式就好了(不同浏览器内核设置方式不尽相同,此方法支持浏览器Microsoft Edge, Chrome)

resp.addHeader("content-Disposition","attachment;fileName="+ URLEncoder.encode(fileName,"utf-8"));

最后, 觉得文章对你有用的话,右侧边栏点个打赏吧 !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值