Я наконец остановился на следующем решении, состоящем из 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>();
... code to get the available sources
// get the current data source
DataSource source = null;
... code to get the current source
source = sources.get(0); // for example
// setup the session attributes
session.setAttribute("availableSources", sources);
session.setAttribute("currentSource", source);
}
}
Всякий раз, когда пользователь входит в систему и создает сеанс, список доступных источников данных и текущий помещаются в сеанс. Это делается на уровне сеанса, поскольку источники данных зависят от входа пользователя в систему. Теперь к ним можно получить доступ из приложения. Чтобы изменить текущий источник данных, я создал сервлет с этой упрощенной версией:
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>
Надеюсь, это поможет кому-то еще.