【问题标题】:How do I add .jsp headers and footers to my Spring MVC web app?如何将 .jsp 页眉和页脚添加到 Spring MVC Web 应用程序?
【发布时间】:2012-03-13 10:11:03
【问题描述】:

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

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

【问题讨论】:

    标签: java model-view-controller jsp web-applications spring-mvc


    【解决方案1】:

    我在研究时发现了您的问题 :-) 不确定我的解决方案是 <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,您可以强制所有视图真正成为一个模板,您可以在其中定义您的全局布局,然后只需&lt;jsp:include/&gt;您的部分。

    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 的 InternalResourceView.java,您将更好地了解 Spring 在确定要使用的视图时正在做什么。

    模板.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>
    

    How to obtain request / session / servletcontext attribute in JSP using EL? 在这里帮助我获取了属性值 ${partial}

    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 包裹并回复。

    【讨论】:

    • 简洁明了的答案。但是如果我们想给它添加一些例外呢?假设我想要一个没有页眉/页脚的 login.jsp 页面,我们如何才能做到这一点?我认为还有另一个问题。如果我们想要通过ModelAndView传递一些动态内容的partial,它们不会生效,即在调用堆栈Controller > Partial > ViewResolver中,模型内部的数据将传入ViewResolver并到达模板而不是partial看法。我不知道我是否清楚,但我试过了。
    • 好问题。自从我写这篇文章以来已经有一段时间了,我不记得我做了什么。我想我在JstlView 中使用了rd.forward(requestToExpose, getRequestToExpose(request)) 来转发到另一个资源。您还可以使用prepareForRendering(getRequestToExpose(request), response) 获取请求调度程序的路径。我相信 @ResponseBody 注释的方法 return new ModelAndView(partial, model, modelObject) 正确地到达了部分。我可能在我的renderMergedOutputModel 中使用了exposeModelAsRequestAttributes(model, requestToExpose)
    • 我会尝试找到一些代码并稍后编辑我的答案。
    • 这方面有更新吗?我也在同样的场景中
    【解决方案2】:

    我推荐SiteMesh 第一和Tiles 第二。

    【讨论】:

    • 任何不使用其他人代码的答案?现在我为页眉和页脚做了一个简单的包含。
    • 那么这就是你的答案。您不需要此站点的任何其他内容。
    • 谢谢你,但我的问题远远超出了我已经在的地方。对于其他阅读本文的人,我仍然会感谢任何输入或详细说明。
    • 我建议查看我提供的链接。即使您不想使用“其他人的代码”,您也可以深入了解他们的想法。
    猜你喜欢
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2021-03-22
    • 2011-11-27
    • 2011-10-07
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多