关于java:如何在jsp中调用Spring MVC控制器

How to call a Spring MVC controller in jsp

我想以JSP页面为例

1
<ui:include src="/WEB-INF/jsp/header.jsp" />

但是header.jsp有变量,我需要一个控制器来初始化这些变量,有没有一种方法可以调用一个控制器,并将控制器方法jsp包含在另一个jsp中?

为例;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@tag description="Overall Page template" pageEncoding="UTF-8"%>
<%@attribute name="header" fragment="true"%>
<%@attribute name="footer" fragment="true"%>
<html>
<body>
   
        //include my header controller
        <ui:include src="/WEB-INF/jsp/header.jsp" />
   
   
        <jsp:doBody />
   
   
        //include my footer controller
   
</body>
</html>

标题JSP

1
2
Header
${test}

我的标题方法

1
2
3
4
public String header(Map<String, Object> model){
    model.put("test","test");
    return"header";
}

但控制器未使用,${test}为空


我认为,如果您从MVC视图调用MVC控制器,您的应用程序将打破常见的MVC原则。您的代码将很难调试,很难测试,也很难被其他人理解。

在一个控制器中为视图的所有部分(页面的主要部分、页眉和页脚)准备模型属性可能是一个更好的主意。传递给JSP视图的模型在包含的自定义JSP标记和JSP中可用。

您可以使用@modelattribute注释方法一次为几个控制器方法提供属性。

您可以使用JSP标记而不是JSP页面来定义您的页眉和页脚(至少在我的应用程序中是这样做的)。


其他答案已经解释了模型应该由控制器填充。…如果在所有页面中都需要相同的模型变量,例如在页眉或页脚中,常见的方法是在单个handlerInterceptor中丰富模型,而不是在每个控制器方法中。


首先,JSP不应该直接"调用"任何控制器。

其次,我看到您使用的是Spring框架,在Spring中,从任何控制器到JSP,只有一个模型对象被传递到JSP。因此,如果在头中需要初始化另一个模型,则必须将URL调用到控制器,而不是调用header.jsp。