2015-03-13 60 views
0

我在寫一個小型Spring 4 MVC應用程序。我是新來的,我想我可能會嘗試並獲得關於某個觀點的建議(道歉我幾年來一直在關注jave/spring幾個月,而且我擁有混合的未整合知識水平,這使我在兩者之間大幅波動行話和缺乏理解)。將數據字段添加到標題jsp的最佳實踐

我正在爲所有頁面(jsp's)添加一個頭文件jsp(或jspf)。在這個早期階段,我加入了一個標籤,因爲include-prelude在某些時候停止了工作,儘管如果我有時間,我可以回去分類。我不認爲這是相關的,雖然...

在header.jsp我只是想包括一個標誌,標題,鏈接到幫助PDF和基礎數據的最後更新日期(理想情況下更新一次天)。這最後讓我想到了......

首先將數據包含在標題中是否合理?如果大概一次調用日期並將其存儲在應用程序的某個地方會更有意義(如果它發生變化,刷新並不是任務關鍵的,但我確信有合理的方法可以做到這一點, )。

其次,如果它是合理的,那麼這樣做的最好方法是什麼?我會用一個屬性創建一個bean並在應用程序加載時填充日期(我可以稱它爲appConfig並添加更多屬性,如果需要的話)。

第三,如果這是合理的,那麼,我有一個可怕的感覺,這是一個完整的numpty問題...,我將如何訪問這個對象/數據頭。或者我應該放棄,只是將它作爲依賴注入字段添加到主頁中,並放棄將其放入標題中。

謝謝如果有人有時間幫忙...

回答

0

另一種實現方法是通過@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}訪問它。通過緩存可以控制刷新頻率。

+0

謝謝我已經完成了這個合理的成功。這與原始主題有點相似,但是指向瞭如何設置緩存時間範圍的指針?我正在使用代碼配置 - cacheManager.setCaches(Arrays。asList(新的ConcurrentMapCache(「LastUpdatedDate」))); 和@Cacheable(「LastUpdatedDate」),我只是找不到一個簡單的設置來設置到期時間。我假設有一個設置(似乎是一個XML配置)?或者我需要用@CacheEvict做些聰明的事情? – gringogordo 2015-03-16 13:41:48

+0

你使用ehcache框架嗎?如果是的話,我不確定在註釋中是否有方法。我們通過ehcache來實現它,並且它是通過xml配置的。 – minion 2015-03-16 14:05:14

+0

好的,謝謝我以後會回來看看它。我沒有使用呃,我只是用了很多默認的Spring(?)。如果需要緩存的話,我可能會在切換到呃的時候解決這個問題。感謝您的答案。 – gringogordo 2015-03-16 14:14:35

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

+0

道歉我選擇了另一個答案,因爲對於我來說,使用我目前有限的知識來實現​​它似乎更簡單一些。我會回來看看,並在稍後的時間嘗試使用HandlerInterceptor。謝謝您的幫助。 – gringogordo 2015-03-16 13:34:43