如何在 Java web 项目的 context.xml 中创建 Mongo 数据库连接?
How to create the Mongo database connection in context.xml in Java web project?
虽然有很多正确的教程来展示如何在 Java 中连接关系数据库,但我真的怀疑 MongoDB 机制与 Java 一起工作。通常人们会在 context.xml 中创建一个连接来与关系数据库进行交互,在 JSP/servlet 中进行 Web 项目。但是,对于 NoSQL 数据库,我不太了解如何以良好的构造方式执行此连接的任何资源,而不是最近使用框架并无缝工作的许多资源。
如果有专家能告诉我它是多么的感激。
示例 servlet/JSP 代码配置连接到 MongoDB 数据库并在 JSP 页面查看查询结果。
(i) JNDI 配置以访问 MongoDB 数据库 (META-INF/context.xml):
<Context>
<Resource name="mongodb/mongoClient"
auth="Container"
type="com.mongodb.MongoClient"
closeMethod="close"
factory="com.mongodb.client.jndi.MongoClientFactory"
singleton="true"
connectionString="mongodb://localhost:27017" />
</Context>
(ii) WEB-INF/web.xml(将其包含在“web-app”标签中):
<resource-ref>
<res-ref-name>mongodb/mongoClient</res-ref-name>
<res-type>com.mongodb.MongoClient</res-type>
<res-auth>Container</res-auth>
</resource-ref>
(iii) Servlet class:
public class TestServlet extends HttpServlet {
@Resource(name="java:comp/env/mongodb/mongoClient")
private MongoClient client;
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// ---- This works too; can be used instead of the @Resource ----
//try {
// Context ctx = new InitialContext();
// client = (MongoClient) ctx.lookup("java:comp/env/mongodb/mongoClient");
//}
//catch (NamingException ex) {
// throw new ServletException(ex);
//}
MongoCollection<Document> coll = client.getDatabase("test")
.getCollection("books");
List<Document> docData = new ArrayList<>();
coll.find()
.projection(new Document("title", 1)
.append("author", 1)
.append("_id", 0))
.limit(10)
.into(docData);
List<String> data = docData.stream()
.map(doc -> doc.get("title") + ", " + doc.get("author"))
.collect(Collectors.toList());
req.setAttribute("bookdata", data);
RequestDispatcher view = req.getRequestDispatcher("view.jsp");
view.forward(req, resp);
}
}
(iv) view.jsp:
<html>
<head>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<title>Test App</title>
</head>
<body>
<h3>Books List</h3>
<c:forEach items="${bookdata}" var="book">
${book}<br>
</c:forEach>
...
虽然有很多正确的教程来展示如何在 Java 中连接关系数据库,但我真的怀疑 MongoDB 机制与 Java 一起工作。通常人们会在 context.xml 中创建一个连接来与关系数据库进行交互,在 JSP/servlet 中进行 Web 项目。但是,对于 NoSQL 数据库,我不太了解如何以良好的构造方式执行此连接的任何资源,而不是最近使用框架并无缝工作的许多资源。
如果有专家能告诉我它是多么的感激。
示例 servlet/JSP 代码配置连接到 MongoDB 数据库并在 JSP 页面查看查询结果。
(i) JNDI 配置以访问 MongoDB 数据库 (META-INF/context.xml):
<Context>
<Resource name="mongodb/mongoClient"
auth="Container"
type="com.mongodb.MongoClient"
closeMethod="close"
factory="com.mongodb.client.jndi.MongoClientFactory"
singleton="true"
connectionString="mongodb://localhost:27017" />
</Context>
(ii) WEB-INF/web.xml(将其包含在“web-app”标签中):
<resource-ref>
<res-ref-name>mongodb/mongoClient</res-ref-name>
<res-type>com.mongodb.MongoClient</res-type>
<res-auth>Container</res-auth>
</resource-ref>
(iii) Servlet class:
public class TestServlet extends HttpServlet {
@Resource(name="java:comp/env/mongodb/mongoClient")
private MongoClient client;
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// ---- This works too; can be used instead of the @Resource ----
//try {
// Context ctx = new InitialContext();
// client = (MongoClient) ctx.lookup("java:comp/env/mongodb/mongoClient");
//}
//catch (NamingException ex) {
// throw new ServletException(ex);
//}
MongoCollection<Document> coll = client.getDatabase("test")
.getCollection("books");
List<Document> docData = new ArrayList<>();
coll.find()
.projection(new Document("title", 1)
.append("author", 1)
.append("_id", 0))
.limit(10)
.into(docData);
List<String> data = docData.stream()
.map(doc -> doc.get("title") + ", " + doc.get("author"))
.collect(Collectors.toList());
req.setAttribute("bookdata", data);
RequestDispatcher view = req.getRequestDispatcher("view.jsp");
view.forward(req, resp);
}
}
(iv) view.jsp:
<html>
<head>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<title>Test App</title>
</head>
<body>
<h3>Books List</h3>
<c:forEach items="${bookdata}" var="book">
${book}<br>
</c:forEach>
...