说明:如果在页面显示的内容不是来自同一张表,则可以将查询的每一个字段及内容封装为一个Map对象,key为所查字段名,类型为字符串,value为所查字段值,因为值可以有很多种类型,所以需要设为Object类型,然后将所有集合对象存放到List中,这样就可以实现所查字段不来自同一张表的值的引用。本例中有两张表,产品表Product与类型表Type,两表通过类型号tid关联。
a.productDAOImpl :
findAllProducts()方法代码:
public List<Map<String, Object>> findAllProducts() {
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
try{
conn=DBUtil.getConnection();
String sql="SELECT pid,pname,price,address,product.`desc`,product.tid,tname FROM product,type WHERE product.tid=type.tid";
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()){
Map<String,Object> map=new HashMap<String,Object>();
map.put("pid",rs.getInt("pid"));
map.put("pname",rs.getString("pname"));
map.put("price",rs.getDouble("price"));
map.put("address",rs.getString("address"));
map.put("desc",rs.getString("desc"));
map.put("tid",rs.getInt("tid"));
map.put("tname",rs.getString("tname"));
list.add(map);
}
}catch(Exception e){
e.printStackTrace();
}finally{
DBUtil.close(rs, ps, conn);
}
return list;
}
findAllProductsByPages(Integer currentPage, Integer pageSize)方法代码:
public List<Map<String, Object>> findAllProductsByPages(Integer currentPage, Integer pageSize) {
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
try{
conn=DBUtil.getConnection();
String sql="SELECT pid,pname,price,address,product.`desc`,product.tid,tname FROM product,type WHERE product.tid=type.tid LIMIT ?,?";
ps=conn.prepareStatement(sql);
ps.setInt(1,(currentPage-1)*pageSize);
ps.setInt(2,pageSize);
rs=ps.executeQuery();
while(rs.next()){
Map<String,Object> map=new HashMap<String,Object>();
map.put("pid",rs.getInt("pid"));
map.put("pname",rs.getString("pname"));
map.put("price",rs.getDouble("price"));
map.put("address",rs.getString("address"));
map.put("desc",rs.getString("desc"));
map.put("tname",rs.getString("tname"));
list.add(map);
}
}catch(Exception e){
e.printStackTrace();
}finally{
DBUtil.close(rs,ps,conn);
}
return list;
}
说明:在添加和修改时,因为在显示中需要添加或修改类型,所以在添加时,应该将所有的类型展示在添加页面,修改时,需要将要修改的项的类型展示在修改页面。所以在添加或者修改时,需要先进行预添加和预修改将类型展示在添加页面或者展示在修改页面,所以在添加或修改时,先跳转至ProductServlet进行预修改,再通过ProductServlet跳转至添加或修改页面进行添加或修改操作。在修改时需要将要修改的项的id传入ProductServlet以查询类型。
a.product_list部分代码:
<li><span><img src="images/t01.png"/></span><ahref="ProductServlet?flag=preAdd">添加</a></li>
<a href="ProductServlet?flag=preUpdate&pid=${map.pid}" class="tablelink">修改</a>
b.ProductServlet预添加、添加及预修改、修改代码
预添加:
if("preAdd".equals(flag)){
//预添加(查询所有的类型转发到jsp)
List<Type> list=dao2.findAllTypes();
request.setAttribute("list",list);
request.getRequestDispatcher("product/add_product.jsp").forward(request, response);
}
添加:
if("Add".equals(flag)){
String pname=request.getParameter("pname");
int tid=Integer.parseInt(request.getParameter("tid"));
Double pprice=Double.parseDouble(request.getParameter("pprice"));
String paddress=request.getParameter("paddress");
String pdesc=request.getParameter("pdesc");
Product p=new Product(pname,pprice,paddress,pdesc,tid);
dao1.AddProduct(p);
flag=null;
}
预修改:
if("preUpdate".equals(flag)){
int pid=Integer.parseInt(request.getParameter("pid"));
Product p=dao1.findProductByPid(pid);
List<Type> list=dao2.findAllTypes();
request.setAttribute("p",p);
request.setAttribute("list",list);
request.getRequestDispatcher("product/update_product.jsp").forward(request, response);
}
修改:
if("update".equals(flag)){
int pid=Integer.parseInt(request.getParameter("pid"));
String pname=request.getParameter("pname");
Double price=Double.parseDouble(request.getParameter("price"));
String address=request.getParameter("address");
String desc=request.getParameter("desc");
int tid=Integer.parseInt(request.getParameter("tid"));
Product p=new Product(pid, pname, price, address, desc, tid);
dao1.updateProduct(p);
flag=null;
}
add_product.jsp页面代码:
<form action="ProductServlet?flag=Add" method="post" onsubmit="return check_submit()">
商品名称:<input id="pname" name="pname" type="text" required="required" onblur="check_pname()" /><span style="color:red" id="pname_msg"></span><br/>
类型名称:
<select name="tid">
<c:forEach items="${list}" var="t">
<option value="${t.tid}">${t.tname}</option>
</c:forEach>
</select>
<br/>
商品价格:<input name="pprice" type="text" /><br/>
商品产地:<input name="paddress" type="text" /><br/>
商品描述:<input name="pdesc" type="text" /><br/>
<input type="submit" value="提交">
</form>
update_product.jsp页面代码:
<form action="ProductServlet?flag=update&pid=${p.pid}" method="post" onsubmit="return check_submit()">
商品名称:<input id="pname" name="pname" type="text" readonly="readonly" onblur="check_pname()" value="${p.pname}" /><span style="color:red" id="pname_msg"></span><br/>
类型名称:
<select name="tid">
<c:forEach items="${list}" var="t">
<option value="${t.tid}" <c:if test="${t.tid==p.tid }">selected</c:if>>${t.tname}</option>
</c:forEach>
</select>
<br/>
商品价格:<input name="price" type="text" value="${p.price}" /><br/>
商品产地:<input name="address" type="text" value="${p.address}" /><br/>
商品描述:<input name="desc" type="text" value="${p.desc}" /><br/>
<input type="submit" value="提交">
</form>
效果图:
添加:
修改: