学习笔记:javaEE基础5 文件处理

来源于从网页搭建入门Java Web

论如何实现简单的验证码以及处理Word,Excel


并不想写太多,就大概记录一下处理的思路

思路

首先是验证码,大体的流程就是前端向后端发起一个get请求,然后后端生成随机的图片,将正确的答案放到session中,而生成的图片以流的形式传回给前端,用户在看到图片之后将答案填写到form中提交给后端,后端把用户提交的数据和当前session中的数据相比对,而生成验证码图片可以使用java原生的awt类,也可以使用第三方的库

而对于word,excel的处理,都是用apache提供的第三方组件,对于文件的读入操作,就是交由第三方组件处理之后将其解析封装成为对象,这样便于用户操作,而创建并写入文件也是同理的,先使用第三方组件的类将数据写入其中,在交由它转化为文件流写入磁盘或者提供给客户端下载。需要使用到如下jar包

  • commons-fileupload
  • commons-io
  • commons-poi
  • poi-3.16.jar
  • poi-ooxml-3.16.jar
  • poi-ooxml-schemas-3.16.jar
  • poi-scratchpad-3.16.jar
  • xmlbeans-2.6.0.jar

经验

对于第一个课程,要保证浏览器器端验证码的时效性,需要对请求的链接加时间戳,并设置response的header要求清除缓存,清除缓存代码如下

1
2
3
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setHeader("expires", "0");

使用js脚本对请求图片链接以请求参数的方式加时间戳,服务端可以无视这个参数

1
2
3
4
5
6
7
8
9
10
11
12
13
<img src="" alt="" id="code_img" onclick="changeCode()">
<form action="validationcode.jsp" method="POST">
<input type="text" placeholder="验证码" name="validationCode">
<button>提交</button>
</form>

<script>
var codeImgElem = document.getElementById("code_img");
codeImgElem.src = "validationcode.jsp?d=" + new Date().getTime();

function changeCode() {
codeImgElem.src = "validationcode.jsp?d=" + new Date().getTime();
}

对于第二个课程,我学到了两个开发技巧。

第一个就是对同名文件的处理,之前一个老师介绍的方式是使用UUID生成随机随机的文件名来替换,但是其实还是用有个解决方案的,和上面一样,加时间戳!

1
String filename = System.currentTimeMillis() + "_" + fileItem.getName();

这样既最大限度的保持了文件名原来的面貌,同时也避免的文件出现重名的情况

另外,对于前端提交过来的数据,可以将其封装成一个DTO,也就是数据传输对象,这样便于后端处理时数据结构的统一,在之后作业项目中我也是这样实战的,同时还把报错信息都封装进去了,觉得效果蛮好的。


其他的一些收获

  • 使用meta标签实现页面自动跳转,关于meta的更多信息
1
<meta http-equiv="refresh" content="0;url=<%=request.getContextPath()%>/product/list.do">
  • 比较两个对象是否相等,同时不用考虑是否为null
1
Objects.equals