Java中创建一个对象object,并用List对象list的add方法保存object。
object再次调用set方法,list再次添加后会发现之前添加的内容和第二次set内容相同,第一次set的对象被覆盖了。
这是因为内存只创建了一次object对象,之后每次set并add,之前的object对象也会被更新。
因此当在写代码时,当在循环内部object调用set方法,list添加object对象时要在循环内创建object对象。这样的object在内存中并不是独一份了。
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;
}
我在代码中使用了 FileItem.getName方法,获取上传文件的名字。
String fileName = fileItem.getName();
但是后端的在调用getName方法时,不同浏览器返回给后端的文件名也不尽相同,分为带绝对路径的文件名和不带绝对路径的文件名这两种。所以可能存在在A浏览器可以上传成功,但是到B就报错这种情况。自己测试过上传的浏览器Microsoft Edge(带绝对路径的文件名),Chrome(不带绝对路径的文件名)。
如何做到万无一失,每个浏览器都可以上传呢?可以通过subString的方法截取字符串获取不带绝对路径的文件名
fileName=fileName.substring(fileName.lastIndexOf("\\")+1);
实现下载文件的话,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"));