使用JSTL动态插入html

时间:2014-10-09 23:10:31

标签: java jsp servlets 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>

尝试在 pizzas.jsp 上插入html时出现问题:如何使用servlet填充我的<td>?应该在哪里打电话?我想在ajax准备就绪时调用pizzas.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的最佳方法是什么?

1 个答案:

答案 0 :(得分: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等)或简单包含以避免在每个视图上复制公共元素(菜单,页脚等)。