当前位置: 代码迷 >> J2EE >> .action拿到的reqeust.不传到DataSource层.怎么在DataSource能取得session里的东西?
  详细解决方案

.action拿到的reqeust.不传到DataSource层.怎么在DataSource能取得session里的东西?

热度:110   发布时间:2016-04-22 00:55:43.0
求救..action拿到的reqeust.不传到DataSource层..如何在DataSource能取得session里的东西???
现在是这样.
用户有4个数据库.
但只部署一份程序.
所以每个用户访问的时候.我需要跟他们的登陆标识,返回给他们对应的数据库连接.

如果从action层 -> BO层(request) ->con(request) .. if else -> return con ->DAO层

这样那我需要改的东西太多太多了..每个BO con都要加参数 那就疯了...上W个都得..


所以我就想 在action将 参数封装到session里..
然后在con 直接能get到session里的东西..

怎么实现呢??大大们!!! 求救啊!!!
我也配DWR了..
WebContext webContext = WebContextFactory.get(); webContext.getSession() ; webContext.getHttpServletRequest() ; webContext.getHttpServletResponse();
这个东西我也在con层用了..但是取不到啊..

不是说可以随意取的嘛!!哎!!难过死了!!!

大大们有没有什么好的解决办法啊..

我的思想就是 根据用户的请求 查看他的所属数据库标识 然后在con层 判断应该返回哪个数据库的连接..

我把3个层简单的代码贴一下..大大们...求帮助啊

action层
Java code
public class LoginAction extends Action {        public ActionForward perform(ActionMapping mapping, ActionForm form,            HttpServletRequest request, HttpServletResponse response)            throws IOException, ServletException {        ActionErrors errors = new ActionErrors();        TlrctlForm tlrctlForm = (TlrctlForm) form;                /*String className = "app.poozf.util.PoozfConMete";        this.printFieldsValue(className);*/                try {            TlrctlBO tlrctlBo = new TlrctlBO();            //在数据库查找时只用到了Tlrno,没有用到Passwd,所有在下面要比对查询到的密码是否一致            DownAndTlrct downAndTlrct = tlrctlBo.searchDownAndTlrct(tlrctlForm.getTlrno(), tlrctlForm.getPasswd());            Tlrctl tlrctl = downAndTlrct.getTlrctl(); // 操作员



BO层
Java code
    public DownAndTlrct searchDownAndTlrct(String tlrno, String passwd) {        Connection con = null;        Connection cons = null;        DownAndTlrct downAndTlrct = new DownAndTlrct();        try {            con = DataSourceUtils.getConnection(pool);            // 得到综合业务的连接            //cons = DataSourceUtils.getConnection(pool);            TlrctlDAO tlrctlDAO = new TlrctlDAO(con);            /** 操作员* */            downAndTlrct.setTlrctl(tlrctlDAO.findByPrimaryKey(tlrno, cons));            /** modify zl 2008-04-08 承德 只有操作员有反洗钱权限的 才查询下拉框* *///            System.out.println(passwd + "--  --"+ downAndTlrct.getTlrctl().getPasswd());        } catch (Exception e) {            new ThrowDaoExHandler().handle(con, e);        } finally {            DataSourceUtils.closeConnection(con);            //DataSourceUtils.closeConnection(cons);        }        return downAndTlrct;    }


DataSource层
Java code
    public static Connection getConnection(ConnectionPool connectionpool)throws SQLException{        Connection connection = null;        connection = DriverManager.getConnection("proxool.db_itp_fxq");        if(connection == null)            throw new CannotGetJdbcConnectionException("error.getConnection");        else            // 不让连接自动提交            connection.setAutoCommit(false);        // 解决JDK1.5 连接数据库慢的问题        ProxySelector.setDefault(null);        return connection;    }



------解决方案--------------------
不传request的话,你连session对象都获取不到,如何去获取里面的值?要么你就在内存里面开辟一个空间,来引用到application中的session。这样你通过这个来获取session对象。当然要记住的是,当session失效的时候要去清理这个空间里面的数据。
------解决方案--------------------
按道理 来说,是应该可以取到Session的。
还有一个方法 就是conn 提前创建,在Action中就创建。如Hibernate 的OpenSessionViewFilter那样。
  相关解决方案