Как добавить пользовательский VariableResolver в чистую JSP - PullRequest
4 голосов
/ 16 февраля 2011

Я бы хотел программно добавить пользовательский VariableResolver, когда JSF или что-то подобное не используется, так что перед поиском bean-компонентов в областях, как указано в 1 , EL сначала попытается разрешить переменныевнутри него.

Цель состоит в том, чтобы сделать объекты в базе данных доступными в EL прямо по их именам, и их может быть много, чтобы поместить в какую-то область.

Прямо сейчас я помещаюспециальный bean-компонент в область действия сеанса под именем, скажем, z, и этот bean-компонент расширяет интерфейс Map и, таким образом, позволяет получить доступ к объектам с помощью выражений, таких как $ {z.address}, $ {z.fullName}.Я пытаюсь устранить это 'z'.

Лучше, если мне удастся вставить свой преобразователь в фильтр (конечно, я проверю, чтобы не делать это несколько раз для каждого веб-запроса)

(Правка: возможно, я говорю об ELContext, о том, как поместить туда свой собственный VariableMapper или ELResolver или что-то вроде этого)

Ответы [ 2 ]

7 голосов
/ 04 марта 2011

Вы можете зарегистрировать свой пользовательский 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 голос
/ 04 марта 2011

Я собираюсь обернуть объект запроса, переопределить метод getAttribute, где я могу вернуть необходимое значение.

В нормальных ситуациях, когда атрибут не найден по его имени в контексте запроса, сервлетКонтейнер переходит в контекст приложения и сеанса.Здесь хранятся некоторые полезные параметры.

Чтобы избежать переопределения атрибутов, установленных в контексте приложения и сеанса, оболочка должна сначала проверить их и вернуть, если они установлены;в противном случае он вернул бы то, что я хотел в первоначальном посте.

Я не проверял это, но уверен, что он будет работать

...