Spring JSP中的applicationContext对象

Spring JSP中的applicationContext对象,spring,Spring,如何在我的spring项目中配置以使用JSTL检索jsp中的applicationContext对象。spring根web应用程序上下文可在名为:org.springframework.web.context.WebApplicationContext.root的servlet上下文属性中找到: ${applicationScope['org.springframework.web.context.WebApplicationContext.ROOT']} 还没有尝试过,但应该可以通过JSTL

如何在我的spring项目中配置以使用JSTL检索jsp中的applicationContext对象。

spring根web应用程序上下文可在名为:
org.springframework.web.context.WebApplicationContext.root的servlet上下文属性中找到:

${applicationScope['org.springframework.web.context.WebApplicationContext.ROOT']}
还没有尝试过,但应该可以通过JSTL访问。但是你想要实现什么呢?JSP真的是手动获取bean并执行一些业务操作的好地方吗?您不应该在servlet/controller中完成所有的工作,让JSP只做视图吗

<%@page import="org.springframework.web.context.WebApplicationContext"%>
<%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%>
<%
  WebApplicationContext context = WebApplicationContextUtils
        .getWebApplicationContext(application);
%>
但是,仅仅因为你可以,并不意味着你应该。如果您所做的不仅仅是显示bean的属性,那么您可能希望将其放在Servlet或其他控制器中


另外,您不希望使用ApplicationContext作为在控制器和视图之间传递bean的方式。

编辑:我在工作,它不起作用。无论如何,您将能够按名称访问所有bean,而不需要ApplicationContext,这取决于您需要做什么

如果将InternalResourceViewResolver的属性ExposeContextBeanSatAttributes设置为true,则可以使用EL:${applicationContext}从JSP进行访问。取决于你想做什么,这或多或少是合适的

编辑:JSP视图解析器必须类似于:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
    <property name="exposeContextBeansAsAttributes" value="true" />
</bean>


最好的事情是你可以通过名字得到你想要的豆子。因此,您可能不需要应用程序上下文。

对于Spring 4,它工作得很好:

<%
ApplicationContext context = RequestContextUtils.findWebApplicationContext(request);
%>

好吧,使用spring boot 2.1.5.RELEASE,我可以执行以下操作:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
thumbs.dir: <spring:eval expression="@environment.getProperty('thumbs.dir')"/><br>
users.file: <spring:eval expression="@environment.getProperty('users.file')"/><br>
jdbc.url: <spring:eval expression="@jdbcProperties.jdbcUrl"/><br>
<spring:eval expression="@jdbcProperties" var="jdbcProperties"/>
<c:if test="${empty jdbcProperties}">jdbcProperties is empty<br></c:if>
<c:if test="${!empty jdbcProperties}">jdbc.username: ${jdbcProperties.username}<br></c:if>

这是对我有用的东西,希望这能帮助别人,因为我花了很长时间才弄明白。 基于帕维尔·弗拉索夫的回答:

<% ApplicationContext context = RequestContextUtils.findWebApplicationContext(request); %>
<% pageContext.setAttribute("myKey", context.getBean("myObject")); %>

然后再往下看我的JSP页面

<body>
  <div>
    <% 
       MyObject coolObject = (MyObject)pageContext.getAttribute("myKey");
       coolObject.doSomething();
    %>
  </div>
</body>


@Tomasz-Nurkiewicz:我不是想在我的jsp中获取bean,而是想在我的jsp中使用应用程序上下文获取spring集合元素。如果您有任何代码,请告诉我。好的,但是您不能将这个集合添加到servlet/controller中的请求/会话属性中,然后使用JSTL轻松地访问它们吗?看起来更干净…这是元数据。根据我的要求,我必须这样访问。所以请尝试上面的
${applicationScope…}
语法,并告诉我们它是否有效。@raj:我已经尝试过了,它对我有效。当你尝试时会发生什么?(异常,空结果,未解析结果…)我想通过jstl检索applicationContext对象,如${applicationContext…}。有没有办法做到这一点。这更好,因为它只需要spring web,而不需要spring webmvcAlready尝试过这一点,但是它对我不起作用。它说找不到属性ExposeContextBeanSatributes。我可以有一段代码来检查我是否做错了什么。谢谢,我已经尝试了上面的代码。我正在使用spring-2.5.6。是否有任何依赖性来获得此结果。最新的jetty maven插件使用
<% ApplicationContext context = RequestContextUtils.findWebApplicationContext(request); %>
<% pageContext.setAttribute("myKey", context.getBean("myObject")); %>
<body>
  <div>
    <% 
       MyObject coolObject = (MyObject)pageContext.getAttribute("myKey");
       coolObject.doSomething();
    %>
  </div>
</body>