您的位置:首页 > Web前端 > JavaScript

html解析工具jsoup结合模版引擎FreeMarkers的简单实例

2016-01-04 08:59 639 查看
目的:通过接收页面传来的页面html元素数据,结合FreeMarkers模版,组成一个新的页面html。

后台代码:

@RequestMapping({ "prevParse" })
@ResponseBody
public String prevParse(@RequestParam(value = "content", required = false) String content) throws Exception{
//单引号转义字符替换成双引号转义字符
String html=content.replace(""", "'");
//反转义html
String escapeHtml=EncodeUtils.htmlUnescape(html);
System.out.println(escapeHtml);
//解析html获取数据
Document doc = Jsoup.parse(escapeHtml);
//读取FreeMarkers模版
File file = new File(this.getClass().getClassLoader().getResource("formTemplate_example.ftl").getFile());
String ftlContent =EncodeUtils.htmlUnescape(FileUtils.readFileToString(file));
//获取input标签数据
Elements inputs = doc.getElementsByTag("input");
for (Element input : inputs) {
Map<String,Object> dataMap = Maps.newHashMap();
String  title= input.attr("title") == null ? ""
: input.attr("title");
dataMap.put("title", title);
String  name= input.attr("name") == null ? ""
: input.attr("name");
dataMap.put("name", name);
String type= input.attr("type") == null ? ""
: input.attr("type");
dataMap.put("uiType", type);
String  defaultValue= input.attr("value") == null ? ""
: input.attr("value");
dataMap.put("value", defaultValue);
String orgform=input.attr("orgform");
Map orgformList=JsonMapper.getInstance().fromJson(orgform, Map.class);
String readonly =(String)orgformList.get("readonly") == null ? ""
: (String)orgformList.get("readonly");
dataMap.put("readonly", readonly);
String checked =(String)orgformList.get("checked") == null ? ""
: (String)orgformList.get("checked");
dataMap.put("checked", checked);
String disabled =(String)orgformList.get("disabled") == null ? ""
: (String)orgformList.get("disabled");
dataMap.put("disabled", disabled);
//HTML5属性
String required =(String)orgformList.get("required") == null ? ""
: (String)orgformList.get("required");
dataMap.put("required", required);

//渲染模板字符串
String fmv = FreeMarkers.renderString(ftlContent, dataMap);
String result = Jsoup.parse(fmv).body().html();//优化html
//构造一个元素Element,初始化为渲染后的html
Tag tag=Tag.valueOf("div");
Element e =new Element(tag, "");
e.append(result);
//用渲染后的新元素替换掉原来的元素
input.replaceWith(e.childNode(0));
}
//获取select标签数据
Elements selects = doc.getElementsByTag("select");
for (Element select : selects) {
Map<String,Object> dataMap = Maps.newHashMap();
List<Map<String, Object>> mapList = Lists.newArrayList();
dataMap.put("uiType", "select");
String  title= select.attr("title") == null ? ""
: select.attr("title");
dataMap.put("title", title);
String  name= select.attr("name") == null ? ""
: select.attr("name");
dataMap.put("name", name);
String orgform=select.attr("orgform");
Map orgformList=JsonMapper.getInstance().fromJson(orgform, Map.class);
String disabled =(String)orgformList.get("disabled") == null ? ""
: (String)orgformList.get("disabled");
dataMap.put("disabled", disabled);
Elements options = select.children();
for (Element option : options) {
Map<String,Object> map = Maps.newHashMap();
String  value= option.attr("value") == null ? ""
: option.attr("value");
map.put("value", value);
String optionorgform=option.attr("orgform");
Map optionorgformList=JsonMapper.getInstance().fromJson(optionorgform, Map.class);
String selected =(String)optionorgformList.get("selected") == null ? ""
: (String)orgformList.get("selected");
map.put("selected", selected);
String  text= option.text() == null ? ""
: option.text();
map.put("text", text);
mapList.add(map);
}
dataMap.put("list", mapList);
//渲染模板字符串
String fmv = FreeMarkers.renderString(ftlContent, dataMap);
String result = Jsoup.parse(fmv).body().html();//优化html
//构造一个元素Element,初始化为渲染后的html
Tag tag=Tag.valueOf("div");
Element e =new Element(tag, "");
e.append(result);
//用渲染后的新元素替换掉原来的元素
select.replaceWith(e.childNode(0));
}
//获取textarea标签数据
Elements textareas = doc.getElementsByTag("textarea");
for (Element textarea : textareas) {
Map<String,Object> dataMap = Maps.newHashMap();
dataMap.put("uiType", "textarea");
String  text= textarea.text() == null ? ""
: textarea.text();
dataMap.put("text", text);
String  title= textarea.attr("title") == null ? ""
: textarea.attr("title");
dataMap.put("title", title);
String  name= textarea.attr("name") == null ? ""
: textarea.attr("name");
dataMap.put("name", name);
String rows= textarea.attr("rows") == null ? ""
: textarea.attr("rows");
dataMap.put("rows", rows);
String cols= textarea.attr("cols") == null ? ""
: textarea.attr("cols");
dataMap.put("cols", cols);
String orgform=textarea.attr("orgform");
Map orgformList=JsonMapper.getInstance().fromJson(orgform, Map.class);
String readonly =(String)orgformList.get("readonly") == null ? ""
: (String)orgformList.get("readonly");
dataMap.put("readonly", readonly);
String disabled =(String)orgformList.get("disabled") == null ? ""
: (String)orgformList.get("disabled");
dataMap.put("disabled", disabled);

//渲染模板字符串
String fmv = FreeMarkers.renderString(ftlContent, dataMap);
String result = Jsoup.parse(fmv).body().html();//优化html
//构造一个元素Element,初始化为渲染后的html
Tag tag=Tag.valueOf("div");
Element e =new Element(tag, "");
e.append(result);
//用渲染后的新元素替换掉原来的元素
textarea.replaceWith(e.childNode(0));
}

String parsehtml = EncodeUtils.htmlUnescape(doc.body().html());
return parsehtml;
}


模版文件formTemplate_example.ftl:

<#switch uiType>
<#case "text">
<input name="${name?if_exists}" title="${title?if_exists}" value="${value?if_exists}" type ="${uiType?if_exists}"
<#if required?? && required == "1">required="true"</#if>
<#if readonly?? && readonly == "1">readonly="true"</#if>
<#if disabled?? && disabled == "1">disabled="true"</#if>
/>
<#break>
<#case "radio">
<input name="${name?if_exists}" title="${title?if_exists}" value="${value?if_exists}" type ="${uiType?if_exists}"
<#if checked?? && checked == "1">checked="true"</#if>
<#if disabled?? && disabled == "1">disabled="true"</#if>
/>
<#break>
<#case "checkbox">
<input name="${name?if_exists}" title="${title?if_exists}" value="${value?if_exists}" type ="${uiType?if_exists}"
<#if checked?? && checked == "1">checked="true"</#if>
<#if disabled?? && disabled == "1">disabled="true"</#if>
/>
<#break>
<#case "hidden">
<input name="${name?if_exists}" title="${title?if_exists}" value="${value?if_exists}" type ="${uiType?if_exists}" />
<#break>
<#case "select">
<select name="${name?if_exists}" title="${title?if_exists}" <#if disabled?? && disabled == "1">disabled="true"</#if> >
<#list list as item>
<option value="${item.value?if_exists}" <#if item.selected?? && item.selected == "1">selected="true"</#if> >${item.text?if_exists}</option>
</#list>
</select>
<#break>
<#case "textarea">
<textarea name="${name?if_exists}" <#if disabled?? && disabled == "1">disabled="true"</#if> <#if readonly?? && readonly == "1">readonly="true"</#if>
rows="${rows?if_exists}" cols="${cols?if_exists}" title="${title?if_exists}" >
${text?if_exists}
</textarea>
<#break>
<#default>
<input name="${name?if_exists}" title="${title?if_exists}" value="${value?if_exists}" type ="${uiType?if_exists}" />
</#switch>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: