2010-10-17 13 views
7

Estoy usando Spring 3 con sitemesh. Me gustaría referirme al bean de contexto de primavera en la página de decorador definida en sitemesh.¿Cómo obtener el atributo de modelo o el bean de primavera en el decorador de sitemesh?

El problema es que el filtro SiteMesh está trabajando fuera del contexto de la primavera, por lo que la solicitud objeto en la página JSP SiteMesh decorador es nativo HttpServletRequest y no con envoltura de funciones útiles para acceder contexto y etc.

¿Hay una manera de alguna manera ¿configura tanto spring como sitemesh para tener acceso al contexto Spring en la página del decorador?

+0

Si incluye parte de su configuración, especialmente resolución de vista, tal vez alguien pueda ayudarlo más fácilmente. Si deshabilita el filtro Sitemesh, sus granos expuestos son accesibles? Nunca utilicé Sitemesh, pero tuve un problema similar con Tiles: http://stackoverflow.com/questions/2848415/accessing-spring-beans-from-a-tiles-view-jsp – sinuhepop

+3

No debería necesitar incluya algo de eso: el problema no se basa en la configuración, es porque SiteMesh decora las páginas fuera del contexto de Spring – walnutmon

Respuesta

0

de inicio mediante la creación de un producto único para lo que usted quiere, me estaba poniendo una cadena, pero cualquier clase funcionará:

public class MySiteEnvironment { 

    private String someConfigurationParameter; 

    public String getSomeConfigurationParameter() { 
     return someConfigurationParameter; 
    } 

    public void setSomeConfigurationParameter(String someConfigurationParameter) { 
     this.someConfigurationParameter = someConfigurationParameter; 
    } 

    /* SINGLETON */ 
    private static final MySiteEnvironment INSTANCE = new MySiteEnvironment(); 

    private MySiteEnvironment() { 
    } 

    public static MySiteEnvironment getInstance() { 
     return INSTANCE; 
    } 
} 

continuación, tiene que inyectar valores:

<bean id="mySiteEnvironment" class="MySiteEnvironment" factory-method="getInstance"> 
     <property name="someConfigurationParameter" value="myValueOrBean"/> 
    </bean> 

último accede a él por:

<%@ page import="MySiteEnvironment" %> 
<% pageContext.setAttribute("env", MySiteEnvironment.getInstance()); %> 

Ahora puede usar el lenguaje de expresión para acceder al entorno

0

No conozco una manera de hacer lo que me pides, pero también hay otra alternativa. Puede declarar HttpServletRequest en los parámetros de su método de controlador. Simplemente ponga los objetos modelo en la solicitud si necesitan estar disponibles para Sitemesh. El código JSP se ve exactamente igual si el contexto de respaldo es la solicitud de servlet o el modelo Spring MVC.

2

Tuve el mismo problema y resolví mi problema usando un filtro. Creé un filtro de entorno que podría usar para configurar los datos del entorno para todas las solicitudes. Autocablee el bean que necesita tener acceso también en el filtro.

@Component 
public class EnvironmentFilter extends OncePerRequestFilter { 

    @Autowired 
    Object bean; 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 

     request.setAttribute("bean", bean); // add bean or just specific properties of bean. 

     filterChain.doFilter(request, response); 

    } 

} 

configurar el filtro en web.xml, asegúrese de utilizar el mismo patrón para la asignación del filtro ya que tienes para el filtro SiteMesh.

<filter> 
    <filter-name>environmentFilter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>environmentFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Los atributos establecidos de su filtro ahora están disponibles en su página de decorador.

0

que resuelven este problema reimplementar el filtro SiteMesh:

@Component 
class SitemeshSpringFilter extends PageFilter implements ApplicationContextAware { 
    ApplicationContext applicationContext; 

    @Override 
    public void doFilter(ServletRequest rq, ServletResponse rs, 
      FilterChain chain) throws IOException, ServletException { 
     def newRq = new ContextExposingHttpServletRequest(
       rq, getApplicationContext(), null); 

     super.doFilter(newRq, rs, chain); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) 
    throws BeansException { 
     this.applicationContext = applicationContext; 
    } 
} 

En el web.xml, declarar este filtro:

<filter> 
    <filter-name>sitemeshSpringFilter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    <init-param> 
     <param-name>targetFilterLifecycle</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>sitemeshSpringFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Ahora, el filtro SiteMesh utilizará ContextExposingHttpServletRequest solicitud lugar normal.

Cuestiones relacionadas