2011-02-16 41 views
3

我希望在JSF或類似的東西沒有被使用時以編程方式添加一個自定義的VariableResolver,以便在尋找1中提到的範圍內的bean之前,EL會先嚐試解決它內部的變量。如何在純JSP中添加一個自定義的VariableResolver

目標是讓數據庫中的對象可以通過其名稱在EL中獲得,並且可以將它們放入某個範圍。

現在,我將一個特殊的bean放入會話範圍內,名稱爲'z',並且該bean擴展了Map接口,從而允許使用諸如$ {z.address},$ {z 。全名}。我試圖消除'z'。

如果我設法插入我的解析器在過濾器(相信我會檢查沒有到這個多次爲每一個web請求做)更好

(編輯:也許我說的ELContext,如何把存在我自己的VariableMapper或ELResolver或類似的東西)

+0

我想我會以一個簡單的解決方案結束。在Filter中我有一個請求;我將它包裝覆蓋getAttribute方法並進一步傳遞! – fedd 2011-02-16 20:04:57

+0

執行此操作時,切記不要在應用程序和會話上下文中無意中使servlet容器設置的所有有用屬性! – fedd 2011-02-17 07:07:06

回答

6

可以按如下方式註冊您的自定義ELResolver

@WebListener 
public class Config implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     ServletContext servletContext = event.getServletContext(); 
     JspApplicationContext jspContext = JspFactory.getDefaultFactory().getJspApplicationContext(servletContext); 
     jspContext.addELResolver(new YourELResolver()); 
    } 

    // ... 
} 

注意:此方法需要Servlet 2.5/JSP 2.1或更新版本。

1

我打算包裝一個請求對象,重寫getAttribute方法,在那裏我可以返回所需的值。

在正常情況下,當在請求上下文中找不到名稱的屬性時,servlet容器將進入應用程序和會話上下文。有一些有用的參數。

爲了確保不覆蓋在應用程序和會話上下文中設置的屬性,包裝應該首先檢查它們,如果它們被設置,則返回它們;否則,它會在第一篇文章中返回我想要的內容。

我沒有檢查,但肯定它會工作

相關問題