2014-10-09 75 views
0

我的網站結構是這樣的:插入HTML動態與JSTL

引入了menu.jsp

... 
`<li id="menu"><a href="index.jsp?page=pizzas"><i class="fa fa-angle-double-right"></i>Pizzas</a></li>` 
... 

的index.jsp

... 
<c:when test="${param.page == 'pizzas'}"> 
    <jsp:include page="/pages/cadastro/pizzas.jsp" /> 
</c:when> 
... 

pizzas.jsp

<c:forEach var="pizza" items="${pizzas}"> 
    <td data-title="#">${pizza.id}</td> 
    <td data-title="Description">${pizza.description}</td> 
    <td data-title="Type">${pizza.type}</td> 
</c:forEach> 

當我試圖在上插入html時,我的問題就發生了pizzas.jsp:我該如何使用一個servlet來填充我的<td>的?它應該在哪裏被調用?我想過上調用一個函數ajaxpizzas.jsp準備這樣的:

$(document).ready(function() { 
    $.ajax({ 
     url: "PizzaController?action=listPizzas", 
     type: 'GET', 
     success: function (result) { 

     }, 
     complete: function() { 
      alert('complete'); 
     } 
    }); 
} 

,在我的Servlet(PizzaController):

private void listPizzas(HttpServletRequest request, HttpServletResponse response) { 
    List<Pizza> pizzas = new ArrayList<>(); 

    try { 
     pizzas = pizzaDaoImpl.findAll(); 
    } catch (Exception e){ 
     System.out.println(e.getMessage()); 
    } 

    request.setAttribute("pizzas", pizzas); 

    try { 
     RequestDispatcher rd = request.getRequestDispatcher("/index.jsp?page=pizzas"); 
     rd.forward(request,response); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } catch (ServletException e){ 
     e.printStackTrace(); 
    } 

} 

做這種方式的問題在於,pizzas.jsp將被調用兩次:1)在菜單上點擊; 2)在ajax調用。

那麼,在這種情況下插入dynamyc html的最佳方式是什麼?

+0

實際問題是什麼?你是否試圖避免重新加載頁面來更新pizzas.jsp中顯示的表格?要根據點擊按鈕動態更新表格? – MarGar 2014-10-10 06:24:06

回答

4

你說你有一個控制器,但你不尊重MVC的原則。 MVC的原理如下:請求發送給控制器;控制器準備一個模型併發送到視圖;該視圖通過從模型中獲取數據來生成HTML代碼。

所以,你不應該有一個指向index.jsp的鏈接,因爲index.jsp是一個視圖。您的所有鏈接應指向一個控制器:然後

<a href="pizzas">...</a> 

一個servlet(控制器)可以被映射到路徑pizzas。這個servlet將做什麼你listPizzas()方法已經沒有按不同的是它應該(再次不相同的index.jsp頁面,並再次)派遣到相應的視圖:

RequestDispatcher rd = request.getRequestDispatcher("/pizzas.jsp"); 
rd.forward(request, response); 

使用單一的index.jsp頁面爲整個應用程序不是一個好主意。該頁面將很快變得龐大而難以維護。您應該爲每個視圖都有一個單獨的JSP。您可以使用模板引擎(sitemesh,tiles等),或者僅包含一個模板引擎,以避免在每個視圖中重複共同元素(菜單,頁腳等)。

+0

感謝您指出我......我知道我的MVC結構中有什麼問題。我會按照你說的方式重構代碼。 – lucasdc 2014-10-10 11:30:00