商品添加功能
1.准备文件上传的后台页面
2.准备数据库中的表:商品表,商品种类表(创建对应的javaBean)
3.准备文件上传表单,修改form中的提交地址到servlet
4.servlet封装数据,并交给service添加商品,跳转到页面(利用工厂模式, 完善配置文件)
4.1 导包
4.2 如果是普通字段:存入map
4.3 如果是文件上传项:将路径存入map
5.service:调用dao添加商品
6.dao进行添加
1.搭建easymall后台页面
将课前资料中的后台页面backend拷贝到WebRoot下,并修改_left.jsp中商品添加
2.设计商品相关表
在easymall数据库中创建商品种类表和商品表
商品种类表
create table prod_category(
id int primary key auto_increment, -- 商品种类编号
cname varchar(255) -- 商品种类名称
);
商品表
create table prod(
id int primary key auto_increment, -- 商品编号
name varchar(255), -- 商品名称
price double, -- 商品单价
cid int, -- 商品种类编号(外键)
pnum int, -- 商品库存
imgurl varchar(255), -- 图片地址
description varchar(255) -- 商品描述
);
3.后台开发
在bean包中创建类:ProdCategory,添加如下属性并添加get和set方法:
private int id;
private String cname;
在bean包中创建类:ProdCategory,添加如下属性并添加get和set方法:
private int id;
private String name;
private double price;
private int cid;
private int pnum;
private String imgurl;
private String description;
private String cname;
在后台页面manageAddProd.jsp中,
表单提交地址改为:在web包中创建包:cn.tedu.web.backend,在此包下创建servlet:ManageAddProdServlet,并在WEB-INF下创建文件夹:temp和upload,分别作为临时文件和商品图片的存放位置,然后导入文件上传相关的jar包:commons-fileupload-1.2.1.jar和commons-io-1.4.jar,在ManageAddProdServlet中添加如下代码:
try {
ServletContext sc = this.getServletContext();
Map paramMap = new HashMap();
//1.上传商品图片
//生成文件上传工厂
String temp = "WEB-INF/temp";
String upload = "WEB-INF/upload";
DiskFileItemFactory factory = new DiskFileItemFactory(100,new File(sc.getRealPath(temp)));
//创建文件上传核心类
ServletFileUpload fileUpload = new ServletFileUpload(factory);
//判断是否是正确的文件上传表单
if(!fileUpload.isMultipartContent(request)){
throw new MsgException("请使用正确的表单上传数据!");
}
//设定上传文件的大小限制
fileUpload.setFileSizeMax(1024*1024);
fileUpload.setSizeMax(1024*1024);
//设定编码解决中文文件名乱码
fileUpload.setHeaderEncoding(sc.getInitParameter("encode"));
//解析请求 获取FileItem集合
List items = fileUpload.parseRequest(request);
//处理item
for (FileItem item : items) {//普通字段项
if(item.isFormField()){
String name = item.getFieldName();
String value = item.getString(sc.getInitParameter("encode"));
System.out.println(name+":"+value);
paramMap.put(name, value);
}else{//文件上传项
String fname = item.getName();
//ie文件名bug
if(fname.contains("\\")){
fname = fname.substring(fname.lastIndexOf("\\")+1);
}
//文件名重复
fname = UUID.randomUUID().toString()+"_"+fname;
//分目录存储,计算存储路径
String hash = Integer.toHexString(fname.hashCode());
while(hash.length()<8){
hash += "0";
}
for (int i = 0; i < hash.length(); i++) {
upload += "/"+hash.charAt(i);
}
new File(sc.getRealPath(upload)).mkdirs();
String savePath = sc.getRealPath(upload+"/"+fname);
paramMap.put("imgurl", upload+"/"+fname);
//上传文件
InputStream in = item.getInputStream();
OutputStream out = new FileOutputStream(savePath);
byte[] data = new byte[1024];
int len = -1;
while((len=in.read(data)) != -1){
out.write(data,0,len);
}
in.close();
out.close();
//删除临时文件
item.delete();
}
}
//2.将商品信息保存到数据库
ProdService service = BasicFactory.getFactory().getInstance(ProdService.class);
//创建prod对象封装数据
Prod prod = new Prod();
prod.setName(paramMap.get("name"));
prod.setPrice(Double.parseDouble(paramMap.get("price")));
prod.setCname(paramMap.get("cname"));
prod.setPnum(Integer.parseInt(paramMap.get("pnum")));
prod.setImgurl(paramMap.get("imgurl"));
prod.setDescription(paramMap.g