我正在开发一个Java Servlet Web应用程序,该应用程序管理来自多个数据库(结构上都是相同的)的信息,每个数据库都对应于一个不同的“业务”。用户选择存储在会话中的“当前业务”,应用程序可以显示或修改该“当前业务”。
我想以动态方式使用tomcat资源来使用jndi访问这些业务。通过这种方式,我可以在servlet中使用jstl sql标签或上下文查找。我无法在web.xml文件中定义每个资源,因为它们存储在SQL表中。最终结果是能够编写具有以下行的简单jsp:
<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %> <sql:query var = "users" dataSource="sources/${sessionScope.currentBusiness}"> select id, firstName, lastName FROM user </sql:query>
或servlet可以包含以下内容
String request.getSession().getAttribute("currentBusiness"); Context initial = new InitialContext(); Context context = (Context) initial.lookup("java:comp/env"); DataSource source = (DataSource) context.lookup("sources/" + currentBusiness);
在这里我可以获取“当前业务”的正确数据源。
我尝试编写自己的从javax.naming.spi.ObjectFactory派生的ObjectFactories失败。关于如何轻松做到这一点的任何指示?
我终于解决了以下由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); } }
每当用户登录并创建会话时,可用数据源的列表和当前的数据源都会放入该会话中。这是在会话级别完成的,因为数据源取决于用户登录。现在可以从应用程序内部对其进行访问。要更改当前的数据源,我使用以下简化版本创建了一个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>
希望它可以帮助别人。