勿谓今日不学而有来日,勿谓今年不学而有来年。
日月逝矣,岁不我延。

简单超市物品信息管理系统 JSP的小Demo

概述

Jsp的简单项目,系统框架为主体内容包含相同的头部尾部和左侧栏。实现了用户登录,按条件分页查询,信息修改删除添加和库存提醒功能。较为简单,作为Jsp的学习Demo。

登录功能

实现方式基于MVC与我之前发过的文章: 简单登录系统的实现 基于MVC设计模式中的实现基本相同。

按条件分页查询

这个功能有两个要点:分页和按条件查询,只要分别实现之后,绑定在一起即可。

分页的实现

Sql查询时附加limit条件,即查询结果仅从第几索引开始显示某几条,适用limit可以实现动态分页功能,大幅度减少系统开销。Servlet根据用户请求中的页码索引结和预设的每页显示的条目数动态确定limit 的两个参数,之后将获取到的结果集中的数据实体化并存放放到List集合中,最后通过请求转发传给给前台界面。前台获取集合并遍历输出

//****分页Servlet的核心代码****
int currPage=1;
		if(request.getParameter("page")!=null) {
			currPage=Integer.parseInt(request.getParameter("page"));
		}

		Object[] listAndCount=SetValueToSelectDaoServlet.dao.find(currPage);
		List<Goods> list=(List<Goods>)listAndCount[0];
		request.setAttribute("list", list);
		int count=((Integer)listAndCount[1]).intValue();
		int pages;
		if(count%Goods.PAGE_SIZE==0) {
			pages=count/Goods.PAGE_SIZE;
		}else {
			pages=count/Goods.PAGE_SIZE+1;
		}
		StringBuffer sb=new StringBuffer();
		for(int i=1;i<=pages;i++) {
			if(i==currPage) {
				sb.append("["+i+"]");
			}else {
				sb.append("<a href='SelectServlet?page="+i+"'>"+i+"</a>");
			}
			sb.append("  ");
		}
		request.setAttribute("bar",sb.toString());

		request.getRequestDispatcher("goodsList.jsp").forward(request, response);

//******前台读取生成表格*****

<%
					List<Goods> list=(List<Goods>)request.getAttribute("list");
					if(list==null||list.size()<1){
					}else{
						for(Goods goods:list){
							out.print("<tr><td>"+goods.getId()+"</td>");
							out.print("<td>"+goods.getClassname()+"</td>");
							out.print("<td>"+goods.getName()+"</td>");
							out.print("<td>"+goods.getPrice_O()+"</td>");
							out.print("<td>"+goods.getPrice()+"</td>");
							out.print("<td>"+goods.getUnit()+"</td>");
							out.print("<td>"+goods.getCount()+"</td>");
							out.print("<td><a href=updateGoods.jsp?id="+goods.getId()+">编辑</a></td>");
							out.print("<td><a href=DeleteServlet?id="+goods.getId()+" onclick=return(confirm(\"确定删除吗?\"))>删除</a></td>");
							out.print("</tr>");
						}
					}
				%>

条件查询的实现

条件查询无非是根据用户输入结和servlet传来的Limit的两个参数生成不同的Sql语句执行查询。用户的查询条件不尽相同,而数据库结构的字段类型也不尽相同,应该采用比较合理的预处理sql赋值方式(object数组),由于我当时对此种方式理解的优点偏差,结果导致当时的sql变量赋值时显得十分笨拙:我把前台获取的数据转化成Object类型(int—>Integer)再根据预留的查询条件判断出对应变量处的数据类型,赋值时再转换为简单值类型。大量的装箱拆箱导致了极大的资源浪费。后来我突然明白了object数组的使用方式感到自己的处理方式非常愚蠢。在此处贴出“不正确”的代码警示自己!

public ResultSet preparedExecuteQuery(String sql,Object[] params) {
		ResultSet rs=null;	
		if(conn==null) {
			createConn();
		}
		try {
			ps=conn.prepareStatement(sql);
			int len=sql.length();
			String sqlTemp=sql.replace("?", "");
			int len2=len-sqlTemp.length();
			for(int i=0;i<len2;i++) {
				if(params[i] instanceof String) {
					ps.setObject(i+1,params[i]);
					continue;
				}else if(params[i] instanceof Integer){
					ps.setInt(i+1,(int)params[i]);
					continue;
 				}else if(params[i] instanceof Float) {
					ps.setFloat(i+1,(float)params[i]);
					continue;
				}
			}
			rs=ps.executeQuery();
		}catch(Exception e) {
			e.printStackTrace();
		}
		return rs;
	}

一下为按条件处理sql(简单列出几个)

if(type==0) {
			if(name=="") {
				if(lowPrice!=0&&highPrice!=0) {
					sql="SELECT Gid,classname,Gname,Gprice_O,Gprice,Gunit,Gcount FROM goods,types WHERE Gprice >= ? AND Gprice <= ? AND id=Gtype ORDER BY Gid limit ?,?";
					sqlCount="SELECT count(*) FROM goods,types WHERE Gprice >= ? AND Gprice <= ? AND id=Gtype ORDER BY Gid";
					params=new Object[]{"","","",""};
					params[0]=new Float(lowPrice);
					params[1]=new Float(highPrice);
					params[2]=new Integer((page-1)*Goods.PAGE_SIZE);
					params[3]=new Integer(Goods.PAGE_SIZE);
				}else {
					//TODO
					sql="SELECT Gid,classname,Gname,Gprice_O,Gprice,Gunit,Gcount FROM goods,types WHERE id=Gtype ORDER BY Gid limit ?,?";
					sqlCount="SELECT count(*) FROM goods,types WHERE id=Gtype ORDER BY Gid";
					params=new Object[]{"",""};
					params[0]=new Integer((page-1)*Goods.PAGE_SIZE);
					params[1]=new Integer(Goods.PAGE_SIZE);
				}

信息的删除和修改

用户点击删除或者编辑之后会把当前行的id通过url传递给servlet,然后一id位sql条件执行删除或者查询&获取&更新操作。

库存提醒的实现

提醒无非是一个展示,所以实现的思想科比查询,知识条件时设定提醒条件。如此实现起来就简单了:根据用户的设定,查询出所有的结果,然后根据用户的设定遍历结果,将库存过多的和过少的的商品分别存放到不同的两个List中,最后在页面中遍历输出。

DataBaseConn sqlCon=new DataBaseConn();
		String sql="select Gname,Gcount from goods";
		ResultSet rs=sqlCon.executeQuery(sql);
		List<String> lackGoods=new ArrayList<String>();
		List<String> ampleGoods=new ArrayList<String>();
		try
		{
			while(rs.next()) {
				if (rs.getInt("Gcount")<35)
				{
					lackGoods.add(rs.getString("Gname"));
				}else if(rs.getInt("Gcount")>500) {
					ampleGoods.add(rs.getString("Gname"));
				}
			}
			rs.close();
		} catch (SQLException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		sqlCon.closeConn();
		request.setAttribute("lackGoods", lackGoods);
		request.setAttribute("ampleGoods", ampleGoods);
		request.getRequestDispatcher("showReserve.jsp").forward(request, response);
<div class="m_title">
				待补货!
				<br>
				<br>
				<div class="m_main">
				<hr width=400px;>
				<br>
					<%
					if(lackGoods==null||lackGoods.size()<1){
					}else{
							for(int i=0;i<lackGoods.size();i++){
								out.print(lackGoods.get(i).toString()+"&nbsp;&nbsp;&nbsp;&nbsp;");
						}
					}
					%>
				</div>
			</div>
			
			<div class="m_title">
				库存过剩!
				<br>
				<br>
				<div class="m_main">
				<hr width=400px;>
				<br>
					<%
					if(ampleGoods==null||ampleGoods.size()<1){
					}else{
							for(int i=0;i<ampleGoods.size();i++){
								out.print(ampleGoods.get(i).toString()+"&nbsp;&nbsp;&nbsp;&nbsp;");
						}
					}
					%>
				</div>
			</div>

小结

我并没有画费很多时间来做这个练习jsp的Demo,所有还有很多不足之处,它能够满足的也仅仅只是练习jsp web的开发。

朝发轫于苍梧兮,夕余至乎县圃;欲少留此灵琐兮,日忽忽其将暮; 
吾令羲和弭节兮,望崦嵫而匆迫;路漫漫其修远兮,吾将上下而求索。

赞(0)
未经允许不得转载:喋喋不休 » 简单超市物品信息管理系统

评论 抢沙发

评论前必须登录!

 

精品网站

有券无忧电脑壁纸精选