Java 如何在纯JSP中添加自定义变量解析器

Java 如何在纯JSP中添加自定义变量解析器,java,jsp,el,Java,Jsp,El,我希望在不使用JSF或其他类似工具时,以编程方式添加一个自定义VariableResolver,以便在中提到的范围内查找bean之前,EL将首先尝试解析其中的变量 我们的目标是让数据库中的对象按其名称在EL right中可用,并且可能有很多对象需要放到某个范围中 现在,我将一个特殊的bean放在会话范围的名称下,即“z”,该bean扩展了映射接口,从而允许使用${z.address}、${z.fullName}之类的表达式访问对象。我正在努力消除这个“z” 如果我设法在过滤器中插入解析程序,效果

我希望在不使用JSF或其他类似工具时,以编程方式添加一个自定义VariableResolver,以便在中提到的范围内查找bean之前,EL将首先尝试解析其中的变量

我们的目标是让数据库中的对象按其名称在EL right中可用,并且可能有很多对象需要放到某个范围中

现在,我将一个特殊的bean放在会话范围的名称下,即“z”,该bean扩展了映射接口,从而允许使用${z.address}、${z.fullName}之类的表达式访问对象。我正在努力消除这个“z”

如果我设法在过滤器中插入解析程序,效果会更好(当然,我会检查不为每个web请求多次执行此操作)


(编辑:也许我在谈论ELContext,如何将我自己的VariableMapper或ELResolver或类似的东西放在那里)

我将包装一个请求对象,覆盖getAttribute方法,在这里我可以返回所需的值

在正常情况下,当在请求上下文中未按属性名称找到属性时,servlet容器将位于应用程序和会话上下文的上方。有一些有用的参数

为了确保不覆盖应用程序和会话上下文中设置的属性,包装器应该首先检查它们,如果设置了,则返回它们;否则,它将返回我在最初的帖子中想要的内容


我没有检查它,但确保它会工作

您可以按如下方式注册您的自定义

@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或更高版本。

我想我将以一个简单的解决方案结束。在过滤器中,我有一个请求;我将覆盖getAttribute方法包装它并进一步传递!执行此操作时,请记住不要意外地使servlet容器在应用程序和会话上下文中设置的所有有用属性无效!嗯,如果你找到了解决办法,你应该回答你自己的问题,接受你自己的答案。这似乎是对我所问问题的正确答案。没有时间去尝试,但要接受!谢谢你!这太棒了!我在找它!谢谢你,巴卢斯克!