Я нашел ваш вопрос во время исследования :-) Не уверен, что мое решение <good | bad | a hack | already exists>
или есть лучший способ, но оно работает для моего текущего проекта.
В вашем myapp-servlet.xml
вы можете расширить viewResolver viewClass своей собственной реализацией:
MyApp-servlet.xml
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:viewClass="com.my.app.view.JstlView"
p:prefix="/WEB-INF/views/"
p:suffix=".jsp"/>
Переопределив renderMergedOutputModel, вы можете сделать так, чтобы все представления действительно были шаблоном, в котором вы можете определить свой глобальный макет, а затем просто <jsp:include/>
свои частичные элементы.
JstlView.java
package com.my.app.view;
import java.util.*;
import org.springframework.web.servlet.view.InternalResourceView;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class JstlView extends InternalResourceView {
@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
String dispatcherPath = prepareForRendering(request, response);
// set original view being asked for as a request parameter
request.setAttribute("partial", dispatcherPath.substring(dispatcherPath.lastIndexOf("/") + 1);
// force everything to be template.jsp
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/template.jsp");
rd.include(request, response);
}
}
Если вы посмотрите Spring's InternalResourceView.java , вы получите лучшее представление о том, что делает Spring при определении того, какое представление использовать.
template.jsp
<!doctype html>
<html lang="en">
<head></head>
<body>
<header>
<jsp:include page="header.jsp"/>
</header>
<jsp:include page="${partial}"/>
<footer>
<jsp:include page="footer.jsp"/>
</footer>
</body>
</html>
Как получить атрибут request / session / servletcontext в JSP с использованием EL? помог мне здесь с получением значения атрибута ${partial}
out.
simple_partial.jsp
<p>I'm a partial!</p>
Затем в контроллере вернуть simple_partial
представление
App.java
package com.my.app.controller;
import org.springframework.stereotype.Controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping(value="/")
public class App{
@RequestMapping(method = RequestMethod.GET)
public String index() {
return "simple_partial";
}
}
, которая будет завернута template.jsp
и получит ответ.