Java Web 网络商城案例演示二十 管理员 查询全部商品信息 上传商品信息 添加商品

步骤实现:

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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后的最后

面试题千万不要死记,一定要自己理解,用自己的方式表达出来,在这里预祝各位成功拿下自己心仪的offer。
需要完整面试题的朋友可以点击蓝色字体获取

大厂面试题

面试题目录

12422931420)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-O5hWQMv3-1712422931420)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后的最后

面试题千万不要死记,一定要自己理解,用自己的方式表达出来,在这里预祝各位成功拿下自己心仪的offer。
需要完整面试题的朋友可以点击蓝色字体获取

[外链图片转存中…(img-ttdTZaDx-1712422931421)]

[外链图片转存中…(img-StHdawiq-1712422931421)]

[外链图片转存中…(img-yWBHjixA-1712422931421)]

[外链图片转存中…(img-pz3aAR1d-1712422931422)]

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值