【问题标题】:Insert html dynamically with JSTL使用 JSTL 动态插入 html
【发布时间】:2014-10-09 23:10:30
【问题描述】:

我的网站结构是这样的:

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 填充我的 &lt;td&gt;'s?应该在哪里调用?当pizzas.jsp 像这样准备好时,我考虑过调用ajax 函数:

$(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 调用。

那么,在这种情况下插入动态 html 的最佳方法是什么?

【问题讨论】:

  • 实际问题是什么?您是否试图避免重新加载页面以更新在 Pizzas.jsp 中显示的表格?要根据按钮单击动态更新表格?

标签: java jsp servlets jstl


【解决方案1】:

你是说你有一个控制器,但是你没有遵守 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、tile 等)或简单地包含以避免在每个视图上重复公共元素(菜单、页脚等)。

【讨论】:

  • 感谢您指出...我知道我的 MVC 结构有问题。我会按照你说的方式重构代码。
猜你喜欢
  • 1970-01-01
  • 2018-08-25
  • 2017-04-06
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 2012-06-05
  • 2012-06-29
  • 1970-01-01
相关资源
最近更新 更多