我想包含一个例子的jsp页面
<ui:include src="/WEB-INF/jsp/header.jsp" />
但我的header.jsp有变量,我需要一个控制器来初始化这些变量,有没有办法调用控制器并将控制器方法jsp包含在另一个jsp中?
例如;
<%@tag description="Overall Page template" pageEncoding="UTF-8"%>
<%@attribute name="header" fragment="true"%>
<%@attribute name="footer" fragment="true"%>
<html>
<body>
<div id="pageheader">
//include my header controller
<ui:include src="/WEB-INF/jsp/header.jsp" />
</div>
<div id="body">
<jsp:doBody />
</div>
<div id="pagefooter">
//include my footer controller
</div>
</body>
</html>
header.jsp中
Header
${test}
我的标题方法
public String header(Map<String, Object> model){
model.put("test", "test");
return "header";
}
但未使用控制器且${test}
为空
答案 0 :(得分:2)
我认为,如果从MVC视图调用MVC控制器,您的应用程序将制定常见的MVC原则。您的代码将难以调试,难以测试且难以被其他人理解。
在一个控制器中为视图的所有部分(页面的主要部分,页眉和页脚)准备模型属性可能更好。您传递给JSP视图的模型在包含的自定义JSP标记和JSP中可用。
您可以使用@ModelAttribute带注释的方法一次为几个控制器方法提供属性。
您可以使用JSP tags而不是JSP页面来定义页眉和页脚(至少我在应用程序中的操作方式)。
答案 1 :(得分:0)
首先,您的JSP不应该直接“调用”任何控制器。
其次,我看到你正在使用Spring框架,而在Spring中,从任何控制器到JSP,只有一个模型对象被传递给JSP。因此,如果在标题中需要初始化另一个模型,则必须调用控制器的URL而不是调用header.jsp。
答案 2 :(得分:0)
其他答案已经解释过该模型应该由控制器填充。 ...如果您需要在所有页面中使用相同的模型变量,例如在页眉或页脚中,通常的方法是在单个HandlerInterceptor中丰富模型,而不是每个控制器方法。