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

分析:

商品的添加涉及两个部分。添加商品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" οnclick="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;
import 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());
	}

}





  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值