Shop项目后台--2.商品的添加
分析:
商品的添加涉及两个部分。添加商品product到数据库,上传product图片到服务器磁盘上。
涉及图片上传,要用多部分表单提交,所以request.getParameter相关的所有方法都失效,不能用隐藏域的形式编写表单。永远获取不到方法的值,为null,即不能继承BaseServlet执行代码。所以用原始的,表单直接提交给继承HttpServlet的类的执行方法即可。
1.检查表单 post提交 、multipart /form-data多部分表单 、图片上传位置。把表单提交给业务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"%>
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 map = new HashMap();try {// 1.创建磁盘文件工厂DiskFileItemFactory factory = new DiskFileItemFactory();// 2.创建文件上传核心类ServletFileUpload upload = new ServletFileUpload(factory);// 因为这个单一,肯定为多部分表单,不需要判断// 编码,文件文字upload.setHeaderEncoding("UTF-8");// 3.解析request,获取文件项集合List 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 商品idproduct.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 findAllCategory() {AdminDao dao = new AdminDao();List 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 findAllCategory() throws SQLException {QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());String sql = "select * from category";List query = runner.query(sql, new BeanListHandler(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());}}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
