2013-03-08 134 views
1


我需要您對過濾器使用的建議。只是想知道我在想什麼 是一個很好的方法。
因此,我一直負責使用JSP,Spring MVC 2.5,javascript等開發5-6個屏幕。
所有 這些屏幕共享很多常見數據元素,例如下拉列表等。
我在考慮 的實現過濾器並在篩選器中的彈簧ModelMap 中填充這些下拉值,以便篩選器的URL模式 下的每個屏幕都可以獲取此數據。
這是一個正確的方法嗎?Spring MVC Filter解決方案

+1

過濾?絕對不。也許是Spring攔截器,但是我個人不願意這麼粗暴地違反最小驚喜的原則,尋求過度微觀的代碼重用方法。將代碼放入實用程序類中,並從每個控制器上的@ModelAttribute方法調用它。 – Affe 2013-03-08 19:00:18

+0

@Affe我同意攔截器的方法,我已經成功實施了這種方法。 – 2013-03-08 19:03:47

+0

感謝評論Affe。微代碼重用方法是我的目標:) – Tiles787 2013-03-08 19:04:44

回答

2

我相信過濾器可以做到這一點,但我會遠離這種方法。你也可以使用Spring的攔截器來做同樣的事情,並仍然利用Spring的特性,例如依賴注入,事務管理和Spring Data包。

在您的配置調度程序設置攔截器。

<mvc:interceptors> 
    <mvc:interceptor> 
     <mvc:mapping path="/**"/> 
     <bean class="org.my.domain.interceptors.LookupHandlerInterceptor" /> 
    </mvc:interceptor> 
</mvc:interceptors> 

然後定義你的攔截器類:

public class LookupHandlerInterceptor extends HandlerInterceptorAdapter { 

     @Autowired 
     LookupLoaderApplicationListener loader; 

     @Override 
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
     throws Exception { 
      request.setAttribute("lookupList", loader.getCategories()); 
      return super.preHandle(request, response, handler); 
     } 
    } 

這種方法將允許您採取的其他Spring功能的優勢,你可以使用你的應用程序中,如您可能設置的任何持久性。然後你可以在你的數據庫中管理這個列表。

+0

謝謝凱文。我認爲要保持模型屬性中的數據,我必須使用@SessionAttributes和modelMap,以在多個請求之間保持它。 – Tiles787 2013-03-08 19:05:39

1

我認爲在應用程序的一個單獨部分中違反最少驚喜的原則並隱藏對於控制器的正確功能至關重要的代碼是不值得的。

爲什麼隱藏未來開發者設置屏幕的代碼?

正因爲他們現在都擁有共同的參考數據,他們會永遠和永遠嗎?只要不同屏幕的要求開始發散,就會變得很難看。

你基本上有所有的缺點,使用繼承而不是組成來製作一個控制器,再加上你甚至不能看到控制器的代碼。我只是簡單地製作一個實用的bean,執行常見的工作,將它注入控制器,然後編寫一行@ModelAttribute方法來調用它。當他們的個人需求在未來發生變化時,將會少得多。