eXtremeTable和MyFaces的兼容性问题及解决方法
2006-07-10 10:36
351 查看
Displaytag只能通过GET方式提交,所以对于jsf_state_64这样超长的表单就无能为力了。这个时候,我会选择eXtremeTable。extremeTable可以选择是Get方式还是Post方式。但是,ExtremeTable和MyFaces结合作数据导出Excel却出现了问题,无论怎么设置,导出的文件都是乱码。同样的问题也出现在Displaytag中。
我参考了extremeTable和Displaytag的代码,发现他们实现数据导出的方式(就是那个Filter)都是一样的,而ExtremeTable后台采用pio作为Excel导出引擎,我测试了一下,发现后台的导出没有问题。那么问题一定出在那个filter上。extremeTable在结合Struts或Spring mvc的时候都没有问题,那么会不会是extremeTable和myfaces不兼容呢。
我将ExportFilter和AbstractExportFilter拿出来,进行跟踪分析,发现他们对response对象进行了包装(wrapper),而myFaces也对response对象进行了包装,于是,我便重新实现了ExportFilter:
public class ExportFilter extends AbstractExportFilter {
private static Log log = LogFactory.getLog(ExportFilter.class);
private boolean responseHeadersSetBeforeDoFilter;
public void init(FilterConfig filterConfig) throws ServletException {
String responseHeadersSetBeforeDoFilter = filterConfig
.getInitParameter("responseHeadersSetBeforeDoFilter");
if (StringUtils.isNotBlank(responseHeadersSetBeforeDoFilter)) {
this.responseHeadersSetBeforeDoFilter = new Boolean(
responseHeadersSetBeforeDoFilter).booleanValue();
}
}
/**
* 覆盖(override)<code>AbstractExportFilter</code>的实现
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
Context context = new HttpServletRequestContext(
(HttpServletRequest) request);
boolean isExported = ExportFilterUtils.isExported(context);
if (isExported) {
String exportFileName = ExportFilterUtils.getExportFileName(context);
doFilterInternal(request, response, chain, exportFileName);
//如果ServletResponse是经过包装之后的,那么必须取回原始的那个,否则会引起导出文件错误
//不过,这个处理会导致一个java.lang.IllegalStateException异常,这不会影响使用
if(response instanceof ServletResponseWrapper) {
log.debug("Found wrapped ServletResponse '" + response.getClass().getName() + "'");
response = ((ServletResponseWrapper) response).getResponse();
}
handleExport((HttpServletRequest) request,
(HttpServletResponse) response, context);
} else {
chain.doFilter(request, response);
}
}
protected void doFilterInternal(ServletRequest request,
ServletResponse response, FilterChain chain, String exportFileName)
throws IOException, ServletException {
if (responseHeadersSetBeforeDoFilter) {
setResponseHeaders((HttpServletResponse) response, exportFileName);
}
log.debug(response.getClass().getName());
chain.doFilter(request, new ExportResponseWrapper(
(HttpServletResponse) response));
// chain.doFilter(request, response);
if (!responseHeadersSetBeforeDoFilter) {
setResponseHeaders((HttpServletResponse) response, exportFileName);
}
}
public void destroy() {
// TODO Auto-generated method stub
}
}
测试了一下,没有问题了。只是会抛出一个异常,但是不会影响使用。
我参考了extremeTable和Displaytag的代码,发现他们实现数据导出的方式(就是那个Filter)都是一样的,而ExtremeTable后台采用pio作为Excel导出引擎,我测试了一下,发现后台的导出没有问题。那么问题一定出在那个filter上。extremeTable在结合Struts或Spring mvc的时候都没有问题,那么会不会是extremeTable和myfaces不兼容呢。
我将ExportFilter和AbstractExportFilter拿出来,进行跟踪分析,发现他们对response对象进行了包装(wrapper),而myFaces也对response对象进行了包装,于是,我便重新实现了ExportFilter:
public class ExportFilter extends AbstractExportFilter {
private static Log log = LogFactory.getLog(ExportFilter.class);
private boolean responseHeadersSetBeforeDoFilter;
public void init(FilterConfig filterConfig) throws ServletException {
String responseHeadersSetBeforeDoFilter = filterConfig
.getInitParameter("responseHeadersSetBeforeDoFilter");
if (StringUtils.isNotBlank(responseHeadersSetBeforeDoFilter)) {
this.responseHeadersSetBeforeDoFilter = new Boolean(
responseHeadersSetBeforeDoFilter).booleanValue();
}
}
/**
* 覆盖(override)<code>AbstractExportFilter</code>的实现
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
Context context = new HttpServletRequestContext(
(HttpServletRequest) request);
boolean isExported = ExportFilterUtils.isExported(context);
if (isExported) {
String exportFileName = ExportFilterUtils.getExportFileName(context);
doFilterInternal(request, response, chain, exportFileName);
//如果ServletResponse是经过包装之后的,那么必须取回原始的那个,否则会引起导出文件错误
//不过,这个处理会导致一个java.lang.IllegalStateException异常,这不会影响使用
if(response instanceof ServletResponseWrapper) {
log.debug("Found wrapped ServletResponse '" + response.getClass().getName() + "'");
response = ((ServletResponseWrapper) response).getResponse();
}
handleExport((HttpServletRequest) request,
(HttpServletResponse) response, context);
} else {
chain.doFilter(request, response);
}
}
protected void doFilterInternal(ServletRequest request,
ServletResponse response, FilterChain chain, String exportFileName)
throws IOException, ServletException {
if (responseHeadersSetBeforeDoFilter) {
setResponseHeaders((HttpServletResponse) response, exportFileName);
}
log.debug(response.getClass().getName());
chain.doFilter(request, new ExportResponseWrapper(
(HttpServletResponse) response));
// chain.doFilter(request, response);
if (!responseHeadersSetBeforeDoFilter) {
setResponseHeaders((HttpServletResponse) response, exportFileName);
}
}
public void destroy() {
// TODO Auto-generated method stub
}
}
测试了一下,没有问题了。只是会抛出一个异常,但是不会影响使用。
相关文章推荐
- IE.JS解决IE兼容性问题方法
- JavaScript的setAttribute兼容性问题解决方法
- Firefox和IE兼容性问题及解决方法总结
- jQuery 使用ajax提交遇到兼容性问题及解决方法
- 关于CSS+DIV 开发 与各浏览器的兼容性问题及解决方法
- 笔记-[js兼容]-滚动条的滚动距离的兼容性问题解决方法。
- 解决Win8.1 IE11兼容性问题的方法
- 简单方法-改变win7兼容性(SQLServer,Oracle)解决不能登录的问题
- div水平垂直居中问题以及解决方法的兼容性
- 一些原生js处理的兼容性问题解决方法(自己)
- CSS兼容性解决方法!important的IE7,Firefox问题
- 笔记-[1]-获取元素样式值的兼容性问题解决方法。
- Prototype与jQuery冲突|兼容性问题解决方法
- ie11兼容性问题,jsp在IE11显示不全问题,ie11覆盖内容问题解决方法
- CSS技巧及兼容性问题解决方法集锦
- 访问iframe里面内容的方法(解决兼容性问题)
- IE7.JS解决IE兼容性问题方法
- IOS5:iOS5里面遇到的兼容性问题以及解决方法
- IE浏览器兼容性问题解决方法
- Optimizer与Debugger兼容性问题的解决方法