JAVAWEB练习——后台商品管理系统,技术点提取(三层架构,数据库的内容显示到前端表格中,增删等操作)

一、页面展示

在这里插入图片描述

二、素材提供(页面前端素材)

链接:https://pan.baidu.com/s/1VmZbfghTrXcZt5N0Rzcbgw
提取码:s05w

三、项目目录浏览

在这里插入图片描述

四、技术点记录

1.学会使用三层架构

2.添加功能

在这里插入图片描述

@WebServlet("/AdminAddProductServlet")
public class AdminAddProductServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        //1.获取数据
        Map<String, String[]> properties = request.getParameterMap();
        //2.封装数据
         Product product = new Product();
        try {
            BeanUtils.populate(product,properties);
        } catch (IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
        //此位置Product已经封装完毕————将表单的数据封装完毕
        //手动设置表单中没有的数据
        //1)、private String pid;
        product.setPid(UUID.randomUUID().toString());
        //2)、private String pimage;
        product.setPimage("products/1/c_0033.jpg");
        //3)、private String pdate;//上架日期
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String pdate = format.format(new Date());
        product.setPdate(pdate);
        //4)、private int pflag;//商品是否下载 0代表未下架
        product.setPflag(0);
        
        //3.传递数据到service层
        AdminProductService service = new AdminProductService();
        try {
            service.addProduct(product);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //跳转到列表页面
        response.sendRedirect(request.getContextPath()+"/AdminProductListServlet");
    }
}

项目技术点提取:前端页面所有提供的数据,存储在Map集合中

  • Map<String, String[]> properties = request.getParameterMap();

并使用BeanUtils,将其进行封装

  • BeanUtils.populate(product,properties);

并且我们设置一些固定值,如id,这些并不会出现在前端页面中,需要手动进行设置。

3.将数据库中的数据通过前端的表格进行展示

在这里插入图片描述

3.1后端技术点

@WebServlet("/AdminProductListServlet")
public class AdminProductListServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        AdminProductService service =new AdminProductService();
        List<Product> productList=null;
        try {
            productList =service.findAllProduct();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        request.setAttribute("productList",productList);
        request.getRequestDispatcher("/admin/product/list.jsp").forward(request, response);
    }
}

比较简单,我们只需要从dao层接受传过来的数据,并在controller层,用request放到域中即可。

3.2前端技术点

从后端传输过来的数据,我们需要放到前端的表格中。我们使用jstl中的ForEach即可。并且修改他的需要变动的值。

<c:forEach items="${productList}" var="pro" varStatus="vs">
	<tr>
		<td >${vs.count}</td>
		<td ><img width="40" height="45" src="${pageContext.request.contextPath}/${pro.pimage}"></td>
		<td >${pro.pname}</td>
		<td >${pro.shop_price}</td>
		<td >${pro.is_hot==1?"是":"否"}</td>
		<td ><a href="${ pageContext.request.contextPath }/AdminUpdateProductUI?pid=${pro.pid}">
		<img src="${pageContext.request.contextPath}/images/i_edit.gif">
		</a></td>
		<td >
	<a href="javascript:void(0)" onclick="delProduct('${pro.pid}')">
	<img src="${pageContext.request.contextPath}/images/i_del.gif "></a></td>
		</tr>
	</c:forEach>

为了查看方便,删去了一些属性,注意我们只需要保留表格的框架,然后动态的使用EL表达式去获取数据即可

4.删除功能

在这里插入图片描述
4.1后端技术

删除功能的后端比较简单,也是根据前端传过来的id值,去数据库进行删除。

@WebServlet("/AdminDelProductServlet")
public class AdminDelProductServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取需要删除的商品pid
        String pid = request.getParameter("pid");
        AdminProductService service = new AdminProductService();
        try {
            service.delProductByPid(pid);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        response.sendRedirect(request.getContextPath()+"/AdminProductListServlet");
    }
}

4.2前端技术
前端有两个个人比较留意的地方,或者说薄弱的地方。第一个怎么传参数,你点击删除的商品,是不是确定是删除正确的。第二个,我们每次点删除,不会有锚记效应,也就是跳回到页面顶部。

传参数问题

我们在遍历数据库中的数据到表格中的时候,可以通过el表达式,获取到每一个商品的id,并且使用点击事件,将id传入到后端。

<td >
<a href="javascript:void(0)" onclick="delProduct('${pro.pid}')">
<img src="${pageContext.request.contextPath}/images/i_del.gif" ></a>
</td>

通过点击事件,转发请求到后端

function delProduct(pid) {
		var isDel = confirm("确定要删除吗?");
		if (isDel){
			//需要删除  get提交
location.href = "${pageContext.request.contextPath}/AdminDelProductServlet?pid="+pid;
	}
}

锚记效应消除

注意上面的代码

<td >
<a href="javascript:void(0)" onclick="delProduct('${pro.pid}')">
<img src="${pageContext.request.contextPath}/images/i_del.gif" ></a>
</td>

<a href="javascript:void(0)",改行代码意思是进行终止。我们a标签先执行了点击事件。并且,我们将他的跳转功能使用了 ==javascript:void(0)==用以表示,我终止跳转。

5.数据回显

我们点击更新操作的时候,我们必须将原有的数据显示给用户,用户再进行修改,有些动态的数据,如下拉框的动态页面需要进行调整,
在这里插入图片描述
5.1后端技术点

@WebServlet("/AdminUpdateProductUI")
public class AdminUpdateProductUI extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获得要查询Product的pid
        String pid = request.getParameter("pid");
        //传递pid查询商品信息
        AdminProductService service = new AdminProductService();
        Product product =null;
        try {
            product = service.findProductByPid(pid);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        //获得所有的商品类
        List<Category> categoryList=null;
        try {
            categoryList =service.findAllCategory();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        request.setAttribute("categoryList",categoryList);
        request.setAttribute("product",product);
        request.getRequestDispatcher("/admin/product/edit.jsp").forward(request, response);
    }
}

后端的技术点比较简单,只需要根据用户id查询到商品的信息即可。以及商品种类的信息。是单独放在一张表中的。

5.2前端技术

前端获取后端提供的数据,只需要将表格中的数据用EL获取域中的商品product,并且使用product的各类属性即可。如${product.pname}等属性

<tr>
					<td >
						商品名称:
					</td>
					<td >
						<input type="text" name="pname" value="${product.pname}" />
					</td>
					<td >
						是否热门:
					</td>
					<td >
						<select name="is_hot" id="is_hot">
							<option value="1"></option>
							<option value="0"></option>
						</select>
					</td>
				</tr>
				<tr>
					<td >
						市场价格:
					</td>
					<td >
					<input type="text" name="market_price" value="${product.market_price}"/>
					</td>
					<td>
						商城价格:
					</td>
					<td >
						<input type="text" name="shop_price" value="${product.shop_price}" />
					</td>

其次,我们需要动态显示商品类别。
在这里插入图片描述
在不使用AJAX的情况下,我们将该数据回显。

用JavaScript和jQuery两种写法

<script type="text/javascript">
		//页面加载完毕后确定哪个option被选中
		window.onload =function () {
			//获得当前回显的product.pid
			var cid="${product.cid}";
			//获得所有的<select name="cid">下的option
			var options =document.getElementById("cid").getElementsByTagName("option");
			//比较每一个option的value与cid
			for (var i=0;i<options.length;i++){
				if (cid==options[i].value){
					options[i].selected =true;
				}
			}
		}
	//下面的是jquery写法	
		$(function () {
			//回显当前product的cid
			$("#cid option[value='${product.cid}']").prop("selected",true);
			//是否热门
			$("#is_hot option[value='${product.is_hot}']").prop("selected",true);
		});
	</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值