如何在我的Spring MVC Web应用程序中添加.jsp页眉和页脚?

Xon*_*ron 5 java model-view-controller jsp web-applications spring-mvc

如何在我的Spring MVC Web应用程序中添加.jsp页眉和页脚?

我知道有很多不同的答案,但我想知道(这些都是真的,但更重要的是)这样做的正确方法是什么?我只是在学习Spring,我有一个提示,答案在于HandlerInterceptor.现在,我可能会这样做.jsp包括.即使有这个包含解决方案,你能详细说明我在哪里放置页眉/页脚结构吗?任何建议或方向都会很棒.

and*_*dyb 8

我在研究时发现了你的问题:-)不确定我的解决方案<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"/>
Run Code Online (Sandbox Code Playgroud)

通过覆盖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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您查看Spring的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>
Run Code Online (Sandbox Code Playgroud)

如何使用EL获取JSP中的request/session/servletcontext属性?帮助我获取属性值${partial}.

simple_partial.jsp

<p>I'm a partial!</p>
Run Code Online (Sandbox Code Playgroud)

然后在控制器中返回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";
    }
}
Run Code Online (Sandbox Code Playgroud)

它将被包裹template.jsp并且响应出来.