步骤实现:
1、修改链接 left,jsp
${pageContext.request.contextPath}/AdminProductServlet?method=findAllProductsWithPage&num=1
2、AdminProductServlet—>findAllProductsWithPage
获取当前页
调用业务层功能查询全部商品信息
返回业务层全部商品信息返回PageModel
将PageModel放入request
转发到/admin/product/list.jsp
AdminProductServlet
public class AdminProductServlet extends BaseServlet {
// findAllProductsWithPage
public String findAllProductsWithPage(HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 获取当前页
int curNum = Integer.parseInt(request.getParameter(“num”));
// 调用业务层功能查询全部商品信息
// 返回业务层全部商品信息返回PageModel
ProductService productService = new ProductServiceImpl();
PageModel pm = productService.findAllProductsWithPage(curNum);
// 将PageModel放入request
request.setAttribute(“page”, pm);
// 转发到/admin/product/list.jsp
return “/admin/product/list.jsp”;
}
}
1、上传的准备工作
form method=“post”
form
form enctype=“multiprt/from-data”
2、上传协议格式
请求行
post/TestUpload/ServletDemo http/1.1
请求头
请求头
请求头
请求正文:
…multpart/form-data…;boundary=--------------544154484
ccontent-type:image/bmp
content-length:143214
.--------544154484
…name=“username”;
tom
.--------544154484
…name=“password”;
.--------544154484
1234
…name=“userhead”;filename=“11.bmp”
图片二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据--------544154484
结论:
1、如果在表单当中设置了enctype=multipart/form-data属性之后,在服务端利用request.getParameter(name);无法获取到数据
原因:request.getParameter(name);获取的是请求体当中键值对的数据或者路径之后键值对的数据
http://localhost:8080/TestUpload/ServletDemo?username=tom
2、request.getInputStream();可以获取到请求体中全部的内容,理论上就可以利用这个API实现手动上传
3、利用工具来实现上传的思路commons-fileupload.jar commons-io.jar
(1)导入commons-fileupload.jar jar包
(2)执行很简单的3句话
(3)获取到一个集合(< FileItem >)
将每对分隔线中间的内容都分装在FileItem对象上
(4)遍历集合
(5)如果当前的FileItem对象是普通项
将普通项上的name属性的值作为键,将获取到的内容作为值,放入MAP集合当中
{username《=》tom,password《=》1234}
(6)如果当前的FileItem对象是上传项
通过FileItem获取到输入流对象,通过输入流可以获取到图片二进制数据,在服务端创建一个空文件(后缀必须和上传到服务端的文件名后缀一致)
建立和空文件对应输出流
将输入流中的数据刷到输出流当中
释放资源
向map中存入一个键值对的数据 userhead《==》/image/11.bmp
{username《=》tom,password《=》1234,userhead《=》image/11.bmp}
(7)利用BeanUtils将MAP中的数据填充到user对象上
(8)调用service dao将user上携带的数据仓库,重定向到查询全部商品信息路径上
问题:
1、如果文件重名发送覆盖问题
可以使用UUID
2、同目录下文件/目录过多,性能问题
在image下最多创建16个目录,任意一个目录进入之后最多创建16个目录,最多创建8层目录。
====================================================================
===============================================================
1、页面跳转
准备工作
在/admin/product/list.jsp 修改了addProduct()函数当中链接
function addProduct() {
window.location.href = “${pageContext.request.contextPath}/AdminProductServlet?method=addProductUI”;
}
/admin/product/add.jsp 遍历分类信息
2、实现上传
(1)准备工作:
设置form表单 :method=post enctype="multipart/form-data "
(2)确定form标签下各个组件的name属性的值保持合法一致。
/admin/product/addl.jsp
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
height=“26”>
添加商品
商品名称:
是否热门:
是 否市场价格:
商城价格:
商品图片:
所属的分类:
<c:forEach items=“allCats” var=“c”>
${c.cname }</c:forEach>
商品描述:
确定
重置
(3)AdminProductServlet当中addProduct
导入相关jar包
使用工具类生成目录
一下工具类生成一个随机的目录结构
package cn.itzheng.store.utils;
import java.util.UUID;
public class UploadUtils {
/**
-
获取随机名称
-
@param realName 真实名称
-
@return uuid
*/
public static String getUUIDName(String realName) {
// realname 可能是 1.jpg 也可能是 1
// 获取后缀名
int index = realName.lastIndexOf(“.”);//获取到.所在的位置
if (index == -1) {//判断获取到的.是否为-1,也就是文件是否是没有后缀的
return UUID.randomUUID().toString().replace(“-”, “”).toUpperCase();
} else {
return UUIDUtils.getId()+ realName.substring(index);//通过位置获取到对应.后面的名称在加上前面生成的对应随机的名称
}
}
/**
-
获取文件真实名称
-
@param name
-
@return
*/
public static String getRealName(String name) {
// c:/upload/1.jpg 1.jpg
// 获取最后一个"/"
int index = name.lastIndexOf(“\”);
return name.substring(index + 1);
}
/**
-
获取文件目录
-
@param name 文件名称
-
@return 目录
*/
public static String getDir(String name) {
//任意的一个对象都有一个hash码
int i = name.hashCode();
System.out.println(i);
//将hash码转成16进制的字符串//-1351534400—>af7138c0
String hex = Integer.toHexString(i);
System.out.println(hex);
int j = hex.length();
for (int k = 0; k < 8 - j; k++) {
hex = “0” + hex;
}
return “/” + hex.charAt(0) + “/” + hex.charAt(1) + “/” + hex.charAt(2) + “/” + hex.charAt(3) + “/”
- hex.charAt(4) + “/” + hex.charAt(5) + “/” + hex.charAt(6) + “/” + hex.charAt(7);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。
《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里领取
543)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
[外链图片转存中…(img-x1AOrCV0-1712888306543)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。
《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里领取
[外链图片转存中…(img-benR7Xwf-1712888306544)]
[外链图片转存中…(img-3bR9nYrK-1712888306544)]
[外链图片转存中…(img-UQ9lgLNm-1712888306544)]