问题描述
尽管有许多适当的教程来展示如何在Java中连接关系数据库,但我确实对与Java一起使用的MongoDB机制感到怀疑。通常,人们会在context.xml中创建一个连接,以使用JSP / servlet与关系数据库进行交互以进行Web项目。但是,对于Nosql数据库,我没有获得任何有关如何以一种很好的构造方式执行此连接的资源,而不是许多最近使用框架且可以无缝工作的资源。
如果有专家可以告诉我,我真的非常感激它。
解决方法
通过配置示例servlet / JSP代码,以连接到MongoDB数据库并在JSP页面中查看查询结果。
(i)用于访问MongoDB数据库(META-INF / context.xml)的JNDI配置:
<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类:
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>
...