我终于解决了以下由SessionListener和Servlet组成的解决方案,它们的工作方式如下。SessionListener具有以下形式:
public class SessionListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent event) { HttpSession session = event.getSession(); // get list of possible data sources available to this session List<DataSource> sources = new ArrayList<DataSource>(); ... pre to get the available sources // get the current data source DataSource source = null; ... pre to get the current source source = sources.get(0); // for example // setup the session attributes session.setAttribute("availableSources", sources); session.setAttribute("currentSource", source); }}每当用户登录并创建会话时,可用数据源的列表和当前的数据源都会放入该会话中。这是在会话级别完成的,因为数据源取决于用户登录。现在可以从应用程序内部对其进行访问。要更改当前的数据源,我使用以下简化版本创建了一个Servlet:
public abstract class BoxletServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(true); String s = request.getParameter("source"); // based on 's' choose from the available DataSource List<DataSource> sources = (List<DataSource>) session.getParameter("availableSources"); Source source = chooseFrom(sources, s); session.setParameter("currentSource", source); // forward to a page saying that the DataSource changed }}
通过此实现,现在可以创建以下jsps:
<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %><sql:query var = "users" dataSource="${sessionScope.currentSource}"> select id, firstName, lastName FROM user</sql:query>希望它可以帮助别人。



