2014-10-09 76 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