java - 使用 JSTL 动态插入 html

标签 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>的?应该在哪里调用呢?我考虑过调用 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 的最佳方法是什么?

最佳答案

你说你有一个 Controller ,但你没有尊重MVC的原则。 MVC的原理是这样的:请求发送到 Controller ; Controller 准备模型并分派(dispatch)到 View ; View 通过从模型中获取数据来生成 HTML 代码。

因此,您永远不应该有指向index.jsp 的链接,因为index.jsp 是一个 View 。您的所有链接都应指向 Controller :

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

然后,servlet( Controller )应该映射到路径pizzas。该 servlet 将执行您的 listPizzas() 方法已经执行的操作,只不过它应该分派(dispatch)到适当的 View (而不是一次又一次地分派(dispatch)到同一个 index.jsp 页面):

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

对整个应用程序使用单个index.jsp 页面并不是一个好主意。该页面很快就会变得巨大且难以维护。每个 View 都应该有一个单独的 JSP。您可以使用模板引擎(sitemesh、图 block 等)或简单地包含以避免在每个 View 上重复公共(public)元素(菜单、页脚等)。

关于java - 使用 JSTL 动态插入 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26289398/

相关文章:

java - 什么正则表达式将提取该字符串?

java - 安卓 java.lang.IllegalArgumentException : View not attached to window manager

Spring Hello World HTTP 状态 500 Servlet Init

jsp - Struts标签与JSTL

java - 如何使用自定义ErrorController返回jsp?

java - addCookie() 在 Tomcat 7 中不起作用

java - 如何在每个 Spring JSON 响应之前添加 ")]}' ,\n"以防止常见漏洞

java - 我需要通过 WiFi-Direct 从传感器获取数据。如何向传感器发送命令?

java - 如何在循环之间跳过一键操作

java - 如何使用位于本地驱动器中的图像文件,将其打印在jsp 页面或servlet 页面中?