首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Spring MVC中将SQLXML类型传递给视图?

如何在Spring MVC中将SQLXML类型传递给视图?
EN

Stack Overflow用户
提问于 2010-04-03 20:57:07
回答 1查看 750关注 0票数 0

在我的webapp控制器中,我从数据库中获得了java.sql.SQLXML类型的结果。我希望将其传递给视图以逐字返回(作为XML)。

问题是,只要我离开JdbcTemplate调用,与SQLXML相关的数据就会被释放。那么,我应该如何使用模型将数据传递给视图呢?

EN

回答 1

Stack Overflow用户

发布于 2010-04-04 01:22:02

最简单的解决方案是在离开JdbcTemplate调用之前从SQLXML对象中读出数据,并以byte[]String、DOM或其他形式返回数据。

如果这是不实际的(例如,数据太大),那么您将需要采取措施,使连接在JdbcTemplate调用的范围之外保持打开,这意味着使用事务。通过在调用JdbcTemplate之前打开一个事务,连接将绑定到该事务,并将一直保持打开状态,直到您关闭该事务。不幸的是,保持它打开足够长的时间来呈现视图需要一些体操。

假设您还没有设置事务,那么您的上下文中将需要一个DataSourceTransactionManager bean。然后,您可以编写一个HandlerInterceptor来管理事务,使其保持足够长的打开时间,以便视图呈现。Spring不像使用JPA/Hibernate/等那样为这种开箱即用的方式提供方便的拦截器,因此您需要编写自己的HandlerInterceptor,如下所示:

代码语言:javascript
复制
public class TransactionInterceptor extends HandlerInterceptorAdapter {

    private PlatformTransactionManager txManager;

    public void setTxManager(PlatformTransactionManager txManager) {
        this.txManager = txManager;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        TransactionStatus tx = txManager.getTransaction(new DefaultTransactionDefinition());
        request.setAttribute("tx", tx);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        TransactionStatus tx = (TransactionStatus) request.getAttribute("tx");
        txManager.commit(tx);
    }
}

然后,当一个请求调用你的控制器+视图时,你可以configure this interceptor来调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2571294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档