bom, eu to usando o WW1.x, mas este filtro deve funcionar com o 2.x também
não se perde o ValueStack utilizando ele, tudo o que esta no value stack, fica disponivel como um attribute do request, que só é “puxado” do VS quando vai ser utilizado
ja OGNL eu não sei o que é
o que é isto??
aqui as duas classes estão na package br.com.usiinformatica.webwork.wrapper
tu pode alterar ai,
tem um esquema no codigo (um flag para chinelear um pouco) que faz o filtro rodar só uma vez, caso contrario, ele seria executado a cada dispatch
bom, segue o filtro e o RequestWraper que uso:
JSTLFilter
[code]package br.com.usiinformatica.webwork.wrapper;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/**
-
@web.filter name = "JSTLFilter" description = "Filtro para permitir trabalhar com WebWork e JSTL ao mesmo tempo"
-
@web.filter-mapping url-pattern = "*.jsp"
-
@web.filter-mapping url-pattern = "*.action"
-
-
@author Rodrigo
-
- To change the template for this generated type comment go to
- Window - Preferences - Java - Code Generation - Code and Comments
*/
public class JSTLFilter implements javax.servlet.Filter {
private static final String RUNONCE_REQUEST_ATTRIBUTE = "_run_once" + JSTLFilter.class.getName();
private static final Object RUNONCE_REQUEST_VALUE = new Object();
FilterConfig _filterConfig;
public FilterConfig getFilterConfig() {
return _filterConfig;
}
public void setFilterConfig(FilterConfig filterConfig) { _filterConfig = filterConfig;
}
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
Object attribute = request.getAttribute(RUNONCE_REQUEST_ATTRIBUTE);
// Make sure it is an HttpServletRequest, if so, create the wrapper and pass it on
if (attribute == null && request instanceof HttpServletRequest) {
ServletRequest wrappedRequest = new JSTLRequestWrapper((HttpServletRequest) request);
chain.doFilter(wrappedRequest, response);
request.setAttribute(RUNONCE_REQUEST_ATTRIBUTE, RUNONCE_REQUEST_VALUE);
} else {
// Otherwise, just pass the request on down the chain
chain.doFilter(request, response);
}
}
public void destroy() {
}
}
[/code]
RequestWrapper
[code]package br.com.usiinformatica.webwork.wrapper;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import webwork.util.ServletValueStack;
import webwork.util.ValueStack;
public class JSTLRequestWrapper extends HttpServletRequestWrapper {
private ServletRequest wrappedRequest;
public JSTLRequestWrapper(HttpServletRequest request) {
super(request);
wrappedRequest = request;
}
public Object getAttribute(String s) {
Object attribute = super.getAttribute(s);
if (attribute == null) {
// If not found, then try the ValueStack
ValueStack stack = ServletValueStack.getStack(wrappedRequest);
if (stack != null) {
attribute = stack.findValue(s);
}
}
return attribute;
}
}
[/code]
depois coloca algo mais ou menos assim no web.xml
[code] <filter>
<filter-name>JSTLFilter</filter-name>
<description><![CDATA[Filtro para permitir trabalhar com WebWork e JSTL ao mesmo tempo]]></description>
<filter-class>br.com.usiinformatica.webwork.wrapper.JSTLFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>JSTLFilter</filter-name>
<url-pattern>.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>JSTLFilter</filter-name>
<url-pattern>.action</url-pattern>
</filter-mapping>
[/code]