前言
今天,博主接了一個小任務,開發一款JavaWeb網上點餐系統,此外要將該系統更改為鞋城銷售系統,藥品銷售系統以及茶葉銷售系統,話不多說,開干!
客戶要求,使用他提供的一套資料庫操作工具類,博主看了一下,封裝挺完善,商量好價格后,便開始了作業!限時兩天,四套程式,難度也是不低呀,
工具類介紹
首先我們看一下資料庫工具類
資料庫工具類對資料庫的增刪改查進行了封裝,其中,查詢封裝為List與Page兩種型別
首先是將其封裝為 List 鏈表形式的資料
// 執行回傳多條記錄的查詢操作,結果被封裝到List中,
public List<Map<String, String>> getList(String sql, String[] params) {
List<Map<String, String>> list = null;
init();
try {
pstmt = con.prepareStatement(sql);
setParams(params);
ResultSet rs = pstmt.executeQuery();
list = getListFromRS(rs);//將資料集資訊進行封裝
rs.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
return list;
}
下面是封裝資料集資訊,通過相關的方法獲取資料表欄位的名稱并與之對應
// 將結果集中的內容封裝到List中
private List<Map<String, String>> getListFromRS(ResultSet rs) throws SQLException {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
ResultSetMetaData rsmd = rs.getMetaData();
while (rs.next()) {
Map<String, String> m = new HashMap<String, String>();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
String colName = rsmd.getColumnLabel(i);
String s = rs.getString(colName);
if (s != null) {
m.put(colName, s);
}
}
list.add(m);
}
return list;
}
如此,資料封裝便完成了,而Page的方法實作是在List的基礎上添加了其他屬性,page工具添加了一個分頁查詢屬性,及在原本的sql陳述句后面加上了limit **,此外,還需對整個資料表的資料進行查詢,從而確定分頁的頁數,然后將List作為Object保存到Map中,然后再將總頁數,當前頁數等資訊也封裝進去,如此,Page的封裝便完成了,
// 查詢結果分頁時,回傳分頁資訊的Map,包括總頁數,每頁記錄數和當前頁中的記錄,
public Map<String, Object> getPage(String sql, String[] params, String curPage) {
Map<String, Object> page = new HashMap<String, Object>();
String newSql = sql + " limit " + (Long.parseLong(curPage) - 1) * PAGE_REC_NUM + "," + PAGE_REC_NUM;
List<Map<String, String>> pageList = getList(newSql, params);
sql = sql.toLowerCase();
String countSql = "";
if (sql.indexOf("group") >= 0) {
countSql = "select count(*) as tempNum from (" + sql + ") as temp";
} else {
countSql = "select count(*) as tempNum " + sql.substring(sql.indexOf("from"));
}
String count_s = (String) getMap(countSql, params).get("tempNum");
long count = Long.parseLong(count_s);
long totalPage = 0;
if (count % PAGE_REC_NUM == 0)
totalPage = count / PAGE_REC_NUM;
else
totalPage = count / PAGE_REC_NUM + 1;
page.put("list", pageList);
page.put("totalPage", totalPage);
page.put("curpage", curPage);
page.put("recNum", PAGE_REC_NUM);
return page;
}
當然,還要只能查詢一條資訊的那種,及我們只獲取該資料集中的第一條資訊即可
// 執行回傳至多一條記錄的查詢操作,結果被封裝到Map中,
public Map<String, String> getMap(String sql, String[] params) {
Map<String, String> m = null;
List<Map<String, String>> l = getList(sql, params);
if (l != null && l.size() != 0) {
m = (Map<String, String>) (l.get(0));
}
return m;
}
至此,專案中最重要的查詢操作的封裝便完成了,接下來便是完成對資料庫中改增刪的操作了,
// 執行更新類(增刪改)的SQL陳述句,SQL陳述句中含有占位符,
public int update(String sql, String[] params) {
int result = 0;
init();
try {
pstmt = con.prepareStatement(sql);
setParams(params);
result = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return result;
}
此外關于占位符的處理,即需要填充
// 為預編譯的SQL陳述句中的占位符?設定值,值被放在字串陣列params中,
private void setParams(String[] params) {
if (params != null) {
for (int i = 0; i < params.length; i++) {
try {
pstmt.setString(i + 1, params[i]);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
此外,還有對檔案上傳工具類的封裝
public static String uploadSingleFile(Part part, HttpServletRequest request) {
String path = null;
String fileName = getFileName(part);
if (!fileName.equals("")) {
// 得到上傳檔案的檔案擴展名
String fileExtName = getFileExtName(part);
String newFileName = System.currentTimeMillis() + fileExtName;
// 得到上傳檔案保存路徑的服務器端硬碟物理路徑
String savePath = request.getServletContext().getRealPath("/img");
File f = new File(savePath);
if (!f.exists()) {
f.mkdirs();
}
// 檔案上傳
try {
part.write(savePath + File.separator + newFileName);
path = "img/" + newFileName;
} catch (IOException e) {
e.printStackTrace();
}
}
return path;
}
在開發工程中,由于涉及下單的日期等問題,博主又封裝了時間工具
public String getTime(){
Long timeStamp = System.currentTimeMillis(); //獲取當前時間戳
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
return time;
}
至此,封裝的工具類便介紹完畢了,接下來我們就要用這一套工具類來完成我們的專案
界面展示
四個專案都是商城銷售專案,而其工具類相同,故而專案基本一致,不同之處也就是在一些方法,類的命名方面與前端界面上,
下面將這四個專案的界面展示一下






開發步驟詳解
下面,便來介紹這個專案的開發步驟
首先,我們需要來確定我們的前端界面,博主在之前總是自己來做界面,然而結果總是差強人意,之后便使用了一些前端框架,博主常用的是Bootstrap,此外,還會直接拿一些前端的界面來直接用,在這四套系統中,鞋城系統的UI則是博主積攢下的,而其他的三個專案則是自己開發的,其實就是應用了相關的組件,如表單,按鈕等,總體來看,界面較為簡潔,
大家如果需要學習,可以去搜索 BootStrap中文網 學習相關的前端界面開發方法
言歸正傳,開始我們的開發步驟
JavaWeb的開發一般都是要遵循三層架構或MVC設計模式,按照客戶的demo看也比較接近
專案目錄截圖如圖所示

按照執行步驟,都要先通過發送Servlet請求來去執行相應的Servlet,然后去呼叫服務層的邏輯代碼以獲取資料資訊并封裝返還,將最終的結果渲染回傳至界面,從而完成一次請求

那么我們以查詢操作為例來進行講解一下實作步驟,
舉例
以鞋城后臺管理系統中的商品串列為例,該查詢結果中包含List與一些分頁屬性,
首先,我們要知道,要想獲取資料,就要發送servlet請求

緊接著,對號入座找到相應的servlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");//設定請求與相應的編碼格式,防止亂碼
String sname=request.getParameter("sname");//獲取鞋子名稱引數
if(sname==""){
sname="";
}
String curpage=request.getParameter("curpage");//獲取當前頁引數
Map<String, Object> shoes=shs.getShoesPage(curpage,sname);
//將返還結果封裝返還
request.setAttribute("shoes", shoes); //將資料保存在request域中,可以在頁面中顯示 request.getRequestDispatcher("/admin/shoe_list.jsp").forward(request, response);//回應返還到相應頁面
}
服務層呼叫實作資料庫相關操作
public Map<String, Object> getShoesPage(String curpage,String sname){
String sql = "select shoes.id id,shoes.sname sname,shoes.price price ,types.typename typename,shoes.image image from shoes inner join types on types.id=shoes.typeid where shoes.sname like '%"+sname+"%' ";
return db.getPage(sql, curpage);
}
至此便將資料獲取完畢了,將資訊封裝在Map中再依次返還,最終到了我們的界面中
使用el運算式將我們的資料從request域中讀取出來
<c:forEach items="${requestScope.shoes.list }" var="shoe">
<tr>
<td style="width:80px;height:70px"><img src="${basePath}/${shoe.image }" style="width:60px;height:50px"></td>
<td>${shoe.sname }</td>
<td>${shoe.price }元</td>
<td>${shoe.typename }</td>
<td><a href="${basePath}/ShoeGetById?id=${shoe.id }"><button type="button" class="btn btn-success">編輯</button></a>
<a href="${basePath}/ShoeDelServlet?id=${shoe.id }"><button type="button" class="btn btn-danger">洗掉</button></a>
</td>
</tr>
</c:forEach>
實作分頁判斷
<nav aria-label="...">
<ul class="pager">
<c:choose>
<c:when test="${requestScope.shoes.curpage eq 1 }">
<li><a href="#">上一頁</a>
</li>
</c:when>
<c:otherwise>
<li><a href="${basePath}/ShoeServlet?curpage=${requestScope.shoes.curpage-1 }&&sname=">上一頁</a></li>
</c:otherwise>
</c:choose>
<li><a href="#">第 ${requestScope.shoes.curpage} 頁</a></li>
<c:choose>
<c:when test="${requestScope.shoes.curpage eq requestScope.shoes.totalPage }">
<li><a href="#">下一頁</a>
</li>
</c:when>
<c:otherwise>
<li><a href="${basePath}/ShoeServlet?curpage=${requestScope.shoes.curpage+1 }&&sname=">下一頁</a></li>
</c:otherwise>
</c:choose></ul>
</nav>
至此,該專案的查詢操作便完成了,至于其他方法的實作,也是如法炮制,相信通過完成這樣一個專案,我們便可以對JavaWeb技術有了更深的了解,
碼字不易,給個贊唄!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/286334.html
標籤:其他
上一篇:SpringBoot + Layui + Mysql + Flutter (PC + 移動端)實作大學課程平時成績管理
