[英]Same URL on request forward from servlet hence operation repeated again
我一直在嘗試使我的項目更加結構化,因此我一直在遵循https://netbeans.org/kb/docs/javaee/ecommerce/page-views-controller.html#controller中的netbeans電子商務示例項目中的示例。 我根據示例更改了控制器。 現在,我無法進入在數據庫中顯示值的頁面。
我的Servlet如下。
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
Op_Stock ops = new Op_Stock();
String userPath = request.getServletPath();
String param = null;
Map<String, String> prdMap = new LinkedHashMap<String, String>();
Map<String, String> lvlMap = new LinkedHashMap<String, String>();
ArrayList<HashMap<String, String>> stkList = new ArrayList<>();
switch (userPath) {
case "/ViewStock":
stkList = ops.getAllStockDetails();
request.setAttribute("stkList", stkList);
userPath = "Stock.jsp";
param = "type=m&page=stk";
break;
case "/AddStockForm":
prdMap = ops.getAllProducts();
lvlMap = ops.getAllLevels();
request.setAttribute("prdMap", prdMap);
request.setAttribute("lvlMap", lvlMap);
userPath = "Insertstk.jsp";
param = "type=m&page=stk";
break;
case "/AddStock":
System.out.println("prdId: " + request.getParameter("prdId"));
int iprdId = Integer.parseInt(request.getParameter("prdId"));
int istkIn = Integer.parseInt(request.getParameter("stkIn"));
int istkthld = Integer.parseInt(request.getParameter("stkthld"));
int ilvlId = Integer.parseInt(request.getParameter("lvlId"));
int stkIn = ops.insertStockDetails(iprdId, istkIn, istkthld, ilvlId);
stkList = ops.getAllStockDetails();
request.setAttribute("stkList", stkList);
if (stkIn > 0) {
userPath = "/Stock.jsp";
param = "message=Stock Details Created!&pg=stk&type=m";
} else {
prdMap = ops.getAllProducts();
lvlMap = ops.getAllLevels();
request.setAttribute("prdMap", prdMap);
request.setAttribute("lvlMap", lvlMap);
userPath = "/Insertstk.jsp";
param = "message=Could not create!&pg=stk&type=m";
}
break;
case "/DeleteStock":
int delStk = ops.deleteStockDetails(request.getParameter("stkId"));
if (delStk > 0) {
userPath = "Stock.jsp";
param = "message=Stock Details Deleted!&pg=stk&type=m";
stkList = ops.getAllStockDetails();
request.setAttribute("stkList", stkList);
} else {
userPath = "Stock.jsp";
stkList = ops.getAllStockDetails();
request.setAttribute("stkList", stkList);
param = "message=Could not delete!&pg=stk&type=m";
}
break;
}
// use RequestDispatcher to forward request internally
String url = userPath + "?" + param;
request.getRequestDispatcher(url).forward(request, response);
//response.sendRedirect(url);
}
在servlet中,我將屬性設置為存儲數據庫內容的請求。
假設我正在執行一個插入操作,該操作在切換用例“ / AddStock”中執行此操作之后,該請求被轉發到顯示該表的頁面,因為我正在使用它,因此它將轉到顯示頁面,但URL地址欄中的會與插入表單中的所有請求參數保持不變,因此,當我刷新頁面時,插入操作將再次發生。 如果我使用response.sendRedirect(url),則將無法使用請求屬性,因此將無法顯示數據庫值。
我的插入表格如下。
<div class="col-md-10">
<form method="POST" action="AddStock" class="form-horizontal">
<div class="form-group">
<label class="col-sm-2 control-label">Product</label>
<div class="col-sm-4">
<select id="s_prdname" class="form-control" name="prdId" required>
<option>Select</option>
<c:forEach items="${prdList}" var="mapItem">
<option value="${mapItem.key}">${mapItem.value}</option>
</c:forEach>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Level</label>
<div class="col-sm-4">
<select id="s_lvlname" class="form-control" name="lvlId" required>
<option>Select</option>
<c:forEach items="${lvlList}" var="mapItem">
<option value="${mapItem.key}">${mapItem.value}</option>
</c:forEach>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">In-Stock</label>
<div class="col-sm-2">
<input type="number" name="stkIn" class="form-control" id="stkIn"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Threshold</label>
<div class="col-sm-2">
<input type="number" name="stkthld" class="form-control" id="stkthld"/>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default btn-primary"><strong>Submit</strong></button>
</div>
</div>
</form>
</div>
我的顯示頁面如下。
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover">
<thead>
<th><strong>Product Name</strong></th>
<th><strong>Level</strong></th>
<th><strong>In Stock</strong></th>
<th><strong>Threshold</strong></th>
<th><strong>Expiry</strong></th>
<th><strong>Operations</strong></th>
</thead>
<tbody>
<jsp:useBean id="lvl" scope="request" class="Level.Level"/>
<jsp:useBean id="prd" scope="request" class="Product.Product"/>
<c:forEach items="${stkList}" var="row">
<tr>
<td><jsp:setProperty name="prd" property="prdId" value="${row.prdStk}"/><jsp:getProperty name="prd" property="prdName"/></td>
<td><jsp:setProperty name="lvl" property="lvlId" value="${row.lvlStk}"/><jsp:getProperty name="lvl" property="lvlName"/></td>
<td>${row.inStk}</td>
<td>${row.thldStk}</td>
<td>${row.expStk}</td>
<td>
<button type="button" class="btn btn-default btn-sm btn-danger" onclick="deletedata('${row.idStk}');">
<span class="glyphicon glyphicon-trash"></span>
</button>
<button class="btn btn-info btn-sm" data-toggle="modal" data-target="#myModal">
<span class="glyphicon glyphicon-eye-open"></span>
</button>
</td>
</tr>
</c:forEach>
</tbody>
<tfoot>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tfoot>
</table>
</div>
請幫助我解決此問題,如果我使用的方法錯誤,請提出正確的建議。
為了解決這個問題,我用了。
response.sendRedirect(url);
代替
request.getRequestDispatcher(url).forward(request, response);
而且,我沒有通過在request中設置屬性來在DB中顯示值,而是使用了如下所示的訪問類中的方法的方法。
<jsp:useBean id="stk" scope="request" class="Stock.Op_Stock"/>
<c:forEach items="${stk.allStockDetails}" var="row">
// Values in the map displayed here
</c:forEach>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.