我正在编写一个小型的Spring 4 MVC应用程序。我是新手,并且认为我可能会尝试获得一些关于某一点的建议(道歉我已经看了几个月的jave / spring而且我有一个混合水平的未合并的知识,这让我在两者之间大幅波动行话和缺乏理解)。
我正在向所有页面(jsp)添加一个头jsp(或jspf)。在这个早期阶段,我添加了一个标签,因为包含前奏在某些时候停止了工作,尽管如果我有时间的话,我可以回去解决这个问题。我不认为这是相关的......
在header.jsp中,我只想包含徽标,标题,帮助pdf的链接以及基础数据上次更新的日期(理想情况下每天更新一次)。这最后让我思考......
首先,在标题中包含数据是否合理?如果可能的话,将日期调用一次并将其存储在应用程序中的某个位置会更有意义(如果它发生变化则更新它不是关键任务,但我确信有合理的方法可以做到这一点,无论如何)。
其次,如果合理,最好的方法是什么?我是否会创建一个具有一个属性的bean并在应用程序加载时填充日期(我可以将其命名为appConfig并添加更多属性,如果需要它们我猜)。
第三,如果这是合理的话,我有一种可怕的感觉,这是一个完整的问题......,我将如何从标题中访问这个对象/数据。或者我应该放弃并将其作为依赖注入字段添加到主页中,并放弃将其放入标题中。
谢谢,如果有人有时间帮忙......
答案 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刷新。