(jsp七)專案例項功能實現補充: 查詢、修改及新增功能
說明:如果在頁面顯示的內容不是來自同一張表,則可以將查詢的每一個欄位及內容封裝為一個Map物件,key為所查欄位名,型別為字串,value為所查欄位值,因為值可以有很多種型別,所以需要設為Object型別,然後將所有集合物件存放到List中,這樣就可以實現所查欄位不來自同一張表的值的引用。本例中有兩張表,產品表Product與型別表Type,兩表通過型別號tid關聯。
a.productDAOImpl :
findAllProducts()方法程式碼:
public List<Map<String, Object>> findAllProducts() {
List<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.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>
效果圖:
新增:
修改: