您的位置:首页 > 运维架构

Shop项目后台--2.商品的添加

2018-01-14 16:06 302 查看
分析:

商品的添加涉及两个部分。添加商品product到数据库,上传product图片到服务器磁盘上。

涉及图片上传,要用多部分表单提交,所以request.getParameter相关的所有方法都失效,不能用隐藏域<input type="hidden" name="method" value="addProduct">的形式编写表单。永远获取不到方法的值,为null,即不能继承BaseServlet执行代码。所以用原始的,表单直接提交给继承HttpServlet的类的执行方法即可。

1.检查表单 post提交 、multipart /form-data多部分表单 、图片上传位置<input type="file">。把表单提交给业务servlet。

2.编写AddProductServlet.目的有两个:1)封装product实体,存到数据库。2)将图片上传到服务器磁盘上。

通过文件中传核心类方法,判断普通表单项与文件上传项。

普通表单项的数据要创建一个map集合来封装,以用于BeanUtils工具封装到product实体里,pimag需要相对地址,防止数据库的迁移,所以pimage在文件上传项那里封装。

文件上传项,通过FileItem方法获取输入流,输出所在的位置与文件的名称。根据位置与名称创建一个输出流。 利用IOUtils把文件上传到服务器,同时要删除临时文件。

手动封装product对象在表单获取不到的数据,这样就完成product实体的封装,与文件的上传。然后可以重定向到后台商品显示列表或其他页面。

准备:

commons-fileupload-1.2.1.jar

commons-io-1.4.jar

步骤:

在add.jsp页面

1.编写表单提交的地址adminAddProduct,方法post 多部分表单multipart/from-data 。检查表单数据的name值

在AdminAddProductServlet

1.创建磁盘文件工厂

2.创建文件上传核心类,并设置文件名编码

3.分析request得到文件项集合,并遍历,判断普通表单项,与文件上传项

4.在普通订单项:创建一个map集合,存储普通表单的数据。

5.在文件上传项:获取读取流in,被上传文件名称,在工程创建一个文件,同时获取文件的绝对地址,创建输出流。

6.用map集合存储pimag的相对地址。删除临时文件。

7,创建Product对象用BeanUtils把map集合的数据封装到product中,手动封装pid pdate  pflag Category

8.把product传到service层 dao层,

9.完成商品添加后,重定向到其他页面

add.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<HTML>
<HEAD>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<LINK href="${pageContext.request.contextPath}/css/Style1.css" type="text/css" rel="stylesheet">
<!-- 引入Jquery文件 -->
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.11.3.min.js"></script>
<!-- 添加页面加载事件 -->
<script type="text/javascript">
$(function(){
//加入alert();验证绑定页面加载事件成功
//ajax 异步获取商品分类所有列表
$.post(
//1.输入执行的url
"${pageContext.request.contextPath}/admin?method=findAllCategory",
//2.传递的数据,因为这不需要传递数据,直接省略
//3.返回数据执行的函数
function(data){
//返回的是category对象集合以json格式字符串表示[{"cid":xx,"cname":xxx},{},{}]
//拼接多个<option value=""></option>放到select中
var content="";
for(var i=0;i<data.length;i++){
//因为字符串 注意value的双引号这里要改为单引号
content+="<option value='"+data[i].cid+"'>"+data[i].cname+"</option>";
}
//把拼好的串放到select中
$("#cid").html(content);

},
//4.返回数据的格式
"json"
);
})
</script>
</HEAD>

<body>
<!--  -->
<form id="userAction_save_do" name="Form1" action="${pageContext.request.contextPath}/adminAddProduct" method="post" enctype="multipart/form-data">
 
<table cellSpacing="1" cellPadding="5" width="100%" align="center" bgColor="#eeeeee" style="border: 1px solid #8ba7e3" border="0">
<tr>
<td class="ta_01" align="center" bgColor="#afd1f3" colSpan="4"
height="26">
<strong><STRONG>添加商品</STRONG>
</strong>
</td>
</tr>

<tr>
<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
商品名称:
</td>
<td class="ta_01" bgColor="#ffffff">
<input type="text" name="pname" value="" id="userAction_save_do_logonName" class="bg"/>
</td>
<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
是否热门:
</td>
<td class="ta_01" bgColor="#ffffff">
<select name="is_hot">
<option value="1">是</option>
<option value="0">否</option>
</select>
</td>
</tr>
<tr>
<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
市场价格:
</td>
<td class="ta_01" bgColor="#ffffff">
<input type="text" name="market_price" value="" id="userAction_save_do_logonName" class="bg"/>
</td>
<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
商城价格:
</td>
<td class="ta_01" bgColor="#ffffff">
<input type="text" name="shop_price" value="" id="userAction_save_do_logonName" class="bg"/>
</td>
</tr>
<tr>
<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
商品图片:
</td>
<td class="ta_01" bgColor="#ffffff" colspan="3">
<input type="file" name="upload" />
</td>
</tr>
<tr>
<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
所属分类:
</td>
<td class="ta_01" bgColor="#ffffff" colspan="3">
<!-- 加上cname方便获取 修改name值 -->
<select id="cid" name="cid">
<!-- 拼接option字符串的位置 -->
</select>
</td>
</tr>
<tr>
<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
商品描述:
</td>
<td class="ta_01" bgColor="#ffffff" colspan="3">
<textarea name="pdesc" rows="5" cols="30"></textarea>
</td>
</tr>
<tr>
<td class="ta_01" style="WIDTH: 100%" align="center"
bgColor="#f5fafe" colSpan="4">
<button type="submit" id="userAction_save_do_submit" value="确定" class="button_ok">
确定
</button>

<FONT face="宋体">       </FONT>
<button type="reset" value="重置" class="button_cancel">重置</button>

<FONT face="宋体">       </FONT>
<INPUT class="button_ok" type="button" onclick="history.go(-1)" value="返回"/>
<span id="Label1"></span>
</td>
</tr>
</table>
</form>
</body>
</HTML>


AdminAddProductServlet

package com.itheima.web.servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
imp
4000
ort org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

import com.itheima.domain.Category;
import com.itheima.domain.Product;
import com.itheima.service.AdminService;

public class AdminAddProductServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 目的:收集表单封装成product实体存到数据库,上传图片到服务器磁盘

//创建map集合,用来存储获取到的数据
Map<String,Object> map = new HashMap<String,Object>();
try {
// 1.创建磁盘文件工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2.创建文件上传核心类
ServletFileUpload upload = new ServletFileUpload(factory);
// 因为这个单一,肯定为多部分表单,不需要判断
// 编码,文件文字
upload.setHeaderEncoding("UTF-8");
// 3.解析request,获取文件项集合
List<FileItem> parseRequest = upload.parseRequest(request);
//4.遍历文件项集合,判断普通文件与上传文件
for(FileItem item :parseRequest ) {
boolean formField = item.isFormField();
if(formField) {
//普通表单项,获取表单数据封装到product实体中
String fieldName = item.getFieldName();// 获取名字
String fielValue = item.getString("UTF-8");//获取值
//用map集合存储数据
map.put(fieldName, fielValue);
}else {
//上传文件
InputStream in = item.getInputStream();
String name = item.getName();
//获取upload文件的绝对地址
String path_store = this.getServletContext().getRealPath("upload");
OutputStream out = new FileOutputStream(path_store+"/"+name);
IOUtils.copy(in, out);
in.close();
out.close();
item.delete();
//用map集合存储pimage的相对地址,需要用上相对地址,以防数据库迁移
map.put("pimage", "upload"+name);
}
}
//利用BeanUtils封装produt实体
Product product = new Product();
BeanUtils.populate(product, map);

//手动封装好product欠缺的属性
//String pid 商品id
product.setPid(UUID.randomUUID().toString());
//Date pdate 创建日期
product.setPdate(new Date());
//String pflag 上架状态
product.setPflag(0);
//Category category 因为数据库product表只需要cid,所以category只需要封装cid就可以
Category category = new Category();
category.setCid(map.get("cid").toString());
product.setCategory(category);

//到此product实例封装完毕,传到service层,存到数据库
AdminService service = new AdminService();
service.saveProduct(product);

} catch (Exception e) {
e.printStackTrace();
}

}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
AdminService

package com.itheima.service;

import java.sql.SQLException;
import java.util.List;

import com.itheima.dao.AdminDao;
import com.itheima.domain.Category;
import com.itheima.domain.Product;

public class AdminService {

//获取商品所有分类列表
public List<Category> findAllCategory() {
AdminDao dao = new AdminDao();
List<Category> categoryList=null;
try {
categoryList = dao.findAllCategory();
} catch (SQLException e) {
e.printStackTrace();
}
return categoryList;
}

//把商品存到数据库
public void saveProduct(Product product) {
AdminDao dao = new AdminDao();
try {
dao.saveProduct(product);
} catch (SQLException e) {
e.printStackTrace();
}
}

}
AdminDao

package com.itheima.dao;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.itheima.domain.Category;
import com.itheima.domain.Product;
import com.itheima.utils.DataSourceUtils;

public class AdminDao {

//获取所有商品分类列表集合
public List<Category> findAllCategory() throws SQLException {
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from category";
List<Category> query = runner.query(sql, new BeanListHandler<Category>(Category.class));
return query;

}

//把商品存到数据库
public void saveProduct(Product product) throws SQLException {
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "insert into product values(?,?,?,?,?,?,?,?,?,?)";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = format.format(product.getPdate());
runner.update(sql, product.getPid(),product.getPname(),product.getMarket_price(),
product.getShop_price(),product.getPimage(),dateStr,
product.getIs_hot(),product.getPdesc(),product.getPflag(),product.getCategory().getCid());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: