我希望在JSF或类似的东西没有使用的时候以编程方式添加自定义VariableResolver,这样在1中提到的范围内寻找bean之前,EL会首先尝试解析其中的变量
目标是使数据库中的对象可以通过其名称在EL中使用,并且可以将很多对象放入某个范围。
现在我将一个特殊的bean放在名为“z”的会话范围内,并且该bean扩展了Map接口,因此可以使用$ {z.address},$ {z等表达式访问对象。全名}。我正试图消除'z'。
如果我设法将我的解析器插入过滤器中更好(确保我会检查不要为每个网络请求多次执行此操作)
(编辑:也许我在谈论ELContext,如何把我自己的VariableMapper或ELResolver或类似的东西放在那里)
答案 0 :(得分:7)
您可以按如下方式注册自定义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 :(得分:1)
我打算包装一个请求对象,覆盖getAttribute方法,在那里我可以返回所需的值。
在正常情况下,当在请求上下文中找不到它的名称属性时,servlet容器会在应用程序和会话上下文的上方。保留了一些有用的参数。
为了确保不覆盖在应用程序和会话上下文中设置的属性,包装器应首先检查它们并在设置时返回它们;否则,它会在最初的帖子中返回我想要的内容。
我没有检查,但确定它会起作用