Liferay 6.1.1中读取Markdown文本并在JSP渲染的标签库需求
解决方案:Liferay 6.1.1中Markdown转HTML展示
推荐的Markdown解析库
可选用以下两款成熟的Java解析库实现Markdown到HTML的转换:
- CommonMark Java:轻量且兼容标准Markdown语法,适合基础格式转换场景。
- Pegdown:支持扩展Markdown语法(如表格、脚注等),适合需要解析复杂格式的场景。
集成步骤
1. 引入库依赖
将对应库的jar包放入项目WEB-INF/lib目录:
- CommonMark:下载兼容Java 1.6+的
commonmark-0.20.0.jar - Pegdown:下载
pegdown-1.6.0.jar及依赖的parboiled-java-1.1.7.jar、parboiled-core-1.1.7.jar
2. 修改LoginUtil.java,实现Markdown转HTML
在将内容存入session前,完成格式转换:
CommonMark实现示例:
import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; // ... 原有代码 ... String filePath = PropsUtil.get("TextFilePath"); try { String content = readTextFile(filePath); String htmlContent; if (Validator.isNull(content)) { _log.info("Empty text file"); htmlContent = "No text to show"; } else { // Markdown转HTML Parser parser = Parser.builder().build(); Node document = parser.parse(content); HtmlRenderer renderer = HtmlRenderer.builder().build(); htmlContent = renderer.render(document); } session.setAttribute("Content", htmlContent); } catch (Exception e) { session.setAttribute("Content", e.getMessage()); _log.info("File Path either not exist or incorrect file path"); }
Pegdown实现示例:
import org.pegdown.PegDownProcessor; // ... 原有代码 ... String filePath = PropsUtil.get("TextFilePath"); try { String content = readTextFile(filePath); String htmlContent; if (Validator.isNull(content)) { _log.info("Empty text file"); htmlContent = "No text to show"; } else { // Markdown转HTML,支持扩展语法 PegDownProcessor processor = new PegDownProcessor(); htmlContent = processor.markdownToHtml(content); } session.setAttribute("Content", htmlContent); } catch (Exception e) { session.setAttribute("Content", e.getMessage()); _log.info("File Path either not exist or incorrect file path"); }
3. 修改terms_of_use.jsp,安全展示HTML内容
转换后的内容为HTML格式,建议用JSTL标签输出(避免XSS风险,若文件内容可控则无需担心):
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <% String content = (String) request.getSession().getAttribute("Content"); %> <div> <c:out value="${content}" escapeXml="false" /> </div>
注:若Markdown文件包含不可信内容,需额外添加XSS过滤逻辑。
内容的提问来源于stack exchange,提问作者user18781702
相关产品推荐
相关产品推荐

