Issue
Although there are many proper tutorials to show how to connect relational database in Java, I really in doubt with the MongoDB mechanism working with Java. Normally people would create a connection in context.xml to interact with a relational database with JSP/servlet to do web project. However, with NoSQL database, I don't quite get any resources on how to perform this connection in a nice constructed way rather than many resources with framework lately and working seamlessly.
If any experts could show me how really highly appreciate it.
Solution
Sample servlet/JSP code with configuration to connect to MongoDB database and view a query results in the JSP page.
(i) JNDI configuration to access MongoDB database (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 (include this within the "web-app" tags):
<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>
...
Answered By - prasad_
Answer Checked By - Mary Flores (JavaFixing Volunteer)