如何将.jsp页眉和页脚添加到我的Spring MVC Web应用程序中?
我知道有很多不同的答案,但我想知道(这些都是真的,但更重要的是)这样做的正确方法是什么?我只是在学习Spring而且我有一个提示答案在于HandlerInterceptor。现在,我可能会这样做.jsp包括。即使有这个包含解决方案,你能详细说明我在哪里放置页眉/页脚结构吗?任何建议或方向都会很棒。
答案 0 :(得分:8)
我在研究时发现了你的问题:-)不确定我的解决方案是<good | bad | a hack | already exists>
还是有更好的方法,但它适用于我当前的项目。
在myapp-servlet.xml
中,您可以使用自己的实现扩展viewResolver viewClass :
<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/>
您的部分。
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 InternalResourceView.java,你会在确定使用什么视图时更好地了解Spring正在做什么。
<!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>
How to obtain request / session / servletcontext attribute in JSP using EL?帮助我获取属性值${partial}
。
<p>I'm a partial!</p>
然后在控制器中,返回simple_partial
视图
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
包裹并回复。
答案 1 :(得分:0)