Complete frontend extension sample
This sample shows how to quickly extend OpenKM features with JSP, HTML, CSS and JavaScript technologies using OpenKM Java API and how to use JavaScript functions of the exposed frontend JAVA methods.
Download the extension sample code complete_extension_sample.zip.
Description
Section titled “Description”The sample is shown into a new Workspace tab.
The main screen is shown as a tool bar with tree buttons:
- The first button goes to main screen of the sample.
- The second button show sample 1
- The second button show sample 2.
Project structure:

Installation
Section titled “Installation”- Stop the application.
- Open the content of the download file into $TOMCAT_HOME/webapps/OpenKM folder ( or better into OpenKM.war )
- Delete $TOMCAT_HOME/work/Catalina/localhost
- Start the application.
- Check the url http://localhost:8080/OpenKM/sample.
Implementation details
Section titled “Implementation details”index.jsp
Section titled “index.jsp”Index.jsp control the iframe height with a JavaScript code.
Other important fact is, for example after uploading a document ( Sample 2 ), is used the parameter urlToOpen to indicate which url must be opened.
String urlToOpen = URLDecoder.decode(WebUtils.getString(request, "urlToOpen"),"UTF-8");if (urlToOpen.equals("")) { urlToOpen = "home.jsp";}menu.jsp
Section titled “menu.jsp”Has the menu url definitions.

home.jsp
Section titled “home.jsp”Set the main home screen.

Sample 1
Section titled “Sample 1”Is composed by 4 files:
- action.jsp ( the main controller where is set the logic ).
- distributor.jsp ( the main layer with two columns at 50% ).
- full_list.jsp ( show full list with no JavaScript special control ).
- filtered_list.jsp ( show filtered list with no JavaScript special control ).
action.jsp
Section titled “action.jsp”The main controller.
<%@page import="java.util.Map"%><%@page import="java.util.HashMap"%><%@page import="java.util.List"%><%@page import="java.util.ArrayList"%><%@ page import="java.text.SimpleDateFormat" %><%@ page import="java.io.IOException" %><%@ page import="org.slf4j.Logger" %><%@ page import="org.slf4j.LoggerFactory" %><%@ page import="com.openkm.bean.Document" %><%@ page import="com.openkm.util.WebUtils" %><%@ page import="com.openkm.api.OKMDocument" %><%@ page extends="com.openkm.extension.servlet.BaseServlet" %><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %><%!private static Logger log = LoggerFactory.getLogger("com.openkm.sample");public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String action = WebUtils.getString(request, "action"); try { list(request, response); } catch (Exception e) { log.error(e.getMessage(), e); sendErrorRedirect(request, response, e); }}
// Used by fileupload return and filterpublic void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException { String action = WebUtils.getString(request, "action"); try { list(request, response); } catch (Exception e) { log.error(e.getMessage(), e); sendErrorRedirect(request, response, e); }}
private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, Exception { SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); String docPath = (String) request.getAttribute("docPath"); String nameFilter = WebUtils.getString(request,"nameFilter");
// Pending docs List<Map<String,String>> pendingDocMaps = new ArrayList<Map<String,String>>(); for ( Document doc : OKMDocument.getInstance().getChildren(null, "/okm:root")) { Map<String,String> docMap = new HashMap<String,String>(); docMap.put("name",doc.getPath().substring(doc.getPath().lastIndexOf("/")+1)); docMap.put("uuid",doc.getUuid()); docMap.put("path",doc.getPath()); docMap.put("mimeType",doc.getMimeType()); docMap.put("lastModified", df.format(doc.getLastModified().getTime())); pendingDocMaps.add(docMap); }
ServletContext sc = getServletContext(); sc.setAttribute("docPath",docPath); sc.setAttribute("nameFilter",nameFilter); sc.setAttribute("pendingDocuments",pendingDocMaps); sc.getRequestDispatcher("/sample/sample2/distributor.jsp").forward(request, response);}%>distributor.jsp
Section titled “distributor.jsp”The main layer.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %><?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/sample/css/style.css" /> <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-1.7.1.min.js"></script> <script type="text/javascript" src="<%=request.getContextPath() %>/js/vanadium-min.js" ></script></head><body> <table width="100%"> <tbody> <tr> <td valign="top" width="50%"> <jsp:include page="/sample/sample1/full_list.jsp"></jsp:include> </td> <td valign="top" width="10"></td> <td valign="top" width="50%"> <jsp:include page="/sample/sample1/filtered_list.jsp"></jsp:include> </td> </tr> </tbody> </table></body></html>