我正在使用Spring 3和sitemesh。我想在sitemesh中定义的decorator页面中引用spring context bean。
问题是SiteMesh过滤器在Spring上下文之外工作,因此sitemesh decorator jsp页面上的请求对象是本机HttpServletRequest,而不是包含有用函数的包装器来访问上下文等。
有没有办法以某种方式配置spring和sitemesh来访问decorator页面中的Spring上下文?
答案 0 :(得分:3)
我有同样的问题并通过使用过滤器解决了我的问题。我创建了一个环境过滤器,可用于为所有请求设置环境数据。在过滤器中自动连接您需要访问的bean。
@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);
}
}
在web.xml中配置过滤器,请确保使用与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>
现在可以从装饰器页面获取过滤器中设置的属性。
答案 1 :(得分:0)
首先为你喜欢的东西创建一个单例,我只是设置一个String,但任何Class都可以工作:
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;
}
}
接下来你需要注入值:
<bean id="mySiteEnvironment" class="MySiteEnvironment" factory-method="getInstance">
<property name="someConfigurationParameter" value="myValueOrBean"/>
</bean>
最后您可以通过以下方式访问它:
<%@ page import="MySiteEnvironment" %>
<% pageContext.setAttribute("env", MySiteEnvironment.getInstance()); %>
现在您可以使用表达式语言来访问环境
答案 2 :(得分:0)
我不知道如何做你要问的方法,但也有另一种选择。您可以在控制器方法参数中声明HttpServletRequest。如果模型对象需要可用于Sitemesh,只需将它们放在请求上即可。无论后备上下文是servlet请求还是Spring MVC模型,JSP代码看起来都完全相同。
答案 3 :(得分:0)
我解决了重新实现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;
}
}
在web.xml中,声明此过滤器:
<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>
现在,sitemesh过滤器将使用ContextExposingHttpServletRequest代替正常请求。