我试图在JSP页面中获取应用程序上下文。 我在JSP中有以下scriptlet。
WebApplicationContext appCtx = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext());
MyClass myClass = (MyClass)(appCtx.getBean("myClass"));
使用此时,将为应用程序上下文抛出空指针异常。 我在这做错了什么? 我没有application-context.xml文件,因为我不需要一个。我有通常的dispatcher-servlet.xml和处理程序映射。
另外,作为补充信息: 我正在尝试访问这个“myClass”对象,该对象使用PropertyPlaceholderConfigurer注入,该对象从外部环境变量读取并注入“myClass”。有什么指针吗?
更新
我尝试按照建议使用“RequestContextUtils”,但现在发现“找不到WebApplicationContext:不在DispatcherServlet请求中”异常。 我试图访问bean的JSP是应用程序的入口点。 我的视图解析器看起来像这样,
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/views/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
<property name="exposedContextBeanNames">
<value>myClass</value>
</property>
</bean>
我尝试访问的JSP位于此“views”文件夹之外。请指教
答案 0 :(得分:4)
WebApplicationContextUtils.getRequiredWebApplicationContext()
返回与ContextLoaderListener
相关联的应用程序上下文(即applicationContext.xml
)。
要获取与DispatcherServlet
相关联的上下文,您需要致电RequestContextUtils.getWebApplicationContext(request)
。
或者,您可以配置InternalResourceViewResolver
以将bean作为属性公开。然后,您可以在${myClass}
中访问JSP中的bean。您可以通过将exposeContextBeansAsAttributes
设置为true
来公开所有bean(我认为这会导致一些性能损失),或者明确列出要使用exposedContextBeanNames
公开的bean。