【问题标题】:Best practice for adding data field to a header jsp将数据字段添加到标头 jsp 的最佳实践
【发布时间】:2015-05-16 07:47:41
【问题描述】:

我正在编写一个小型 Spring 4 MVC 应用程序。我是新手,我想我可能会尝试就某一点获得一些建议(抱歉,我已经研究了几个月的 jave/spring 了,而且我的知识水平参差不齐,这让我在行话和缺乏理解)。

我正在向所有页面(jsp)添加标题 jsp(或 jspf)。在这个早期阶段,我正在为它们添加一个标签,因为包含前奏在某个时候停止工作,尽管如果我有时间我可能会回去解决这个问题。不过我认为这无关紧要……

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

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

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

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

如果有人有时间提供帮助,谢谢...

【问题讨论】:

    标签: java spring jsp spring-mvc


    【解决方案1】:

    为此使用 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}

    查看用于 JSP 模板的 SiteMesh。

    【讨论】:

    • 道歉我选择了另一个答案,因为目前我的知识有限,实施起来似乎更简单一些。当我有时间时,我会回到它并尝试使用 HandlerInterceptor。感谢您的帮助。
    【解决方案2】:

    实现它的另一种方法是通过@ControllerAdvice 并将其添加到ModelAttribute。这样,您就可以在通过该控制器访问的所有页面中使用它。数据在您的模型中可用,名称为“headerData”。

    @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} 访问它。通过缓存,您可以控制刷新频率。

    【讨论】:

    • 谢谢我已经相当成功地完成了这项工作。这有点偏离原始主题,但有任何关于我如何设置缓存时间范围的指针吗?我正在使用代码配置 - cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("LastUpdatedDate")));和@Cacheable("LastUpdatedDate") 我只是找不到一个简单的设置来设置到期时间。我假设有一个设置(似乎是一个用于 xml 配置的设置)?还是我需要用 @CacheEvict 做一些聪明的事情?
    • 你在使用ehcache框架吗?如果是,我不确定注释中是否有方法..我们通过ehcache拥有它,它是通过xml配置的。
    • 好的,谢谢,我想我稍后会回来看看。我没有使用呃,我认为我只是使用了几乎默认的 Spring(?)。如果对缓存有很多要求,也许我会在我解决问题后切换到 eh。感谢您的回答。
    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 2023-04-01
    • 2012-08-28
    • 2017-01-22
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多