将数据字段添加到标头jsp的最佳实践

时间:2015-03-13 17:53:49

标签: java spring jsp spring-mvc

我正在编写一个小型的Spring 4 MVC应用程序。我是新手,并且认为我可能会尝试获得一些关于某一点的建议(道歉我已经看了几个月的jave / spring而且我有一个混合水平的未合并的知识,这让我在两者之间大幅波动行话和缺乏理解)。

我正在向所有页面(jsp)添加一个头jsp(或jspf)。在这个早期阶段,我添加了一个标签,因为包含前奏在某些时候停止了工作,尽管如果我有时间的话,我可以回去解决这个问题。我不认为这是相关的......

在header.jsp中,我只想包含徽标,标题,帮助pdf的链接以及基础数据上次更新的日期(理想情况下每天更新一次)。这最后让我思考......

首先,在标题中包含数据是否合理?如果可能的话,将日期调用一次并将其存储在应用程序中的某个位置会更有意义(如果它发生变化则更新它不是关键任务,但我确信有合理的方法可以做到这一点,无论如何)。

其次,如果合理,最好的方法是什么?我是否会创建一个具有一个属性的bean并在应用程序加载时填充日期(我可以将其命名为appConfig并添加更多属性,如果需要它们我猜)。

第三,如果这是合理的话,我有一种可怕的感觉,这是一个完整的问题......,我将如何从标题中访问这个对象/数据。或者我应该放弃并将其作为依赖注入字段添加到主页中,并放弃将其放入标题中。

谢谢,如果有人有时间帮忙......

2 个答案:

答案 0 :(得分:0)

为此使用HandlerInterceptor。例如:

public class LoadSiteDataInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    private SiteDataRepository siteDataRepository;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        request.setAttribute("siteData", siteDataRepository.findOne(1L));

        return super.preHandle(request, response, handler);
    }
}

mvc-dispatcher-servlet.xml

<mvc:interceptors>
  <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <mvc:exclude-mapping path="/static/**"/>
    <bean class="com.example.LoadSiteDataInterceptor"/>
  </mvc:interceptor>
</mvc:interceptors>

这会在每次请求时从数据库加载数据。您可能希望先将数据加载到单例bean中,或者实现缓存。

在JSP中,您可以使用${siteData.someAttribute}

查看SiteMesh以获取JSP模板。

答案 1 :(得分:0)

实现它的另一种方法是通过@ControllerAdvice并将其添加到ModelAttribute。这样你就可以在通过控制器访问的所有页面中拥有它。您可以在模型中使用&#34; headerData&#34;作为名字。

@ControllerAdvice
public class ControllersAdvice {
@ModelAttribute("headerData")
public HeaderData getHeaderData(HttpServletRequest request, HttpServletResponse response, ModelMap model) {
    HeaderData headerData = new HeaderData();
    // Get the header data and cache it. Set the cache timeframe to 1 day or whatever you want the frequency to be. This will be done using Spring @cacheable annotation.
    // dump all the data that you want to headerData like logo, title , link etc
    return headerData;
}
}

在header.jsp中,您可以通过${headerData}访问它。通过缓存,您可以控制频率f刷新。