用java给html文件添加必要的控制html代码片

Posted SHIHUC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用java给html文件添加必要的控制html代码片相关的知识,希望对你有一定的参考价值。

这个需求,我估计很多时候都不会用到,但是,我们目前在做一个CMS的系统,在创建页面的时候,需要控制页面各个板块显示的内容来源,这个不是关键,关键是页面内容配置完毕后,如何提交内容,也就是说如何和后台系统通信。这个时候,有两种做法,一种是在页面的控制区域内添加右键菜单,实现这个功能。另外一个做法,就是在页面中添加按钮区域来实现。

 

但是不管那种做法,控制区域的html页面上的逻辑代码片,都不可能在模板里面添加,这是不友好的,客户也是不会考虑这个的,再说了,他也没有办法考虑。所以,需要CMS系统自动最近这个控制区域的html代码片。于是,java操作html的插件就诞生了!有不少类似的插件,这里我选择比较简单的jsoup插件。下面的简单实验,用到的版本是1.9.2,就一个jar包,不需要额外的资源了。

 

我这里上代码,分别说明右键实现,以及直接追加button的方式实现。

 

先说右键实现方案,这里,右键菜单是用bootstrap-contextmenu.js插件实现的,是基于bootstrap风格的。

 1 /**
 2  * @author "shihuc"
 3  * @date   2016年5月21日
 4  */
 5 package opc;
 6 
 7 import java.io.File;
 8 import java.io.FileOutputStream;
 9 import java.io.IOException;
10 import java.io.OutputStreamWriter;
11 
12 import org.jsoup.Jsoup;
13 import org.jsoup.nodes.Document;
14 import org.jsoup.nodes.Element;
15 import org.jsoup.select.Elements;
16 
17 /**
18  * @author "shihuc"
19  *
20  */
21 public class Demo {
22     
23     /**
24      * @param args
25      * @throws IOException 
26      */
27     public static void main(String[] args) throws IOException {
28         File input = new File("./example.html");
29         Document doc = Jsoup.parse(input, "UTF-8");
30         System.out.println(doc.html());
31         Elements content = doc.getElementsByTag("body");
32         //找到body的内容
33         String body = content.get(0).html();
34         System.out.println(body);
35         
36         //读取控制页面右键的代码片段
37         File pice = new File("./pice.html");
38         Document pdoc = Jsoup.parse(pice, "UTF-8");
39         Element control_area = pdoc.getElementById("tk-cms-page-context-menu-control-area");
40         
41         //将业务相关的html代码片添加到右键菜单控制区域中
42         control_area.append(body);
43         
44         //将带有业务相关代码的html内容填写到原来的example.html文件的body区域
45         content.get(0).html(pdoc.html());
46         
47         FileOutputStream fos = new FileOutputStream("./output.html", false);  
48         OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");  
49         osw.write(doc.html());  
50         osw.close();  
51     }
52 
53 }

这里的example.html文件的内容如下:

 1 <!DOCTYPE HTML>
 2 <html>
 3     
 4 <body>
 5     
 6     <div>
 7         <h1 style="text-align: center; font-size: 40px; color: #abcdef">This is a test page</h1>
 8     </div>
 9     
10     
11 </body>
12 </html>   
13 
14    

那个pice.html的内容如下:

 1     <style type="text/css">
 2         .vCenter
 3         { 
 4             vertical-align:middle;
 5             margin:0 auto;
 6         }
 7     </style>
 8 
 9     <div id="context-menu" style="position: absolute; z-index: 9999; top: 746px; left: 474px;" class="">
10           <ul class="dropdown-menu" role="menu">
11               <li><a tabindex="-1">Cancel</a></li>
12               <li><a tabindex="-1">Action</a></li>
13           </ul>
14     </div>
15     <div id="tk-cms-page-context-menu-control-area" data-toggle="context" style="height:100%;width:100%;border:1px solid #ddd;" class="vCenter">
16         
17     </div>
18     
19     <script src="js/jquery-2.1.1.min.js"></script>
20     <script src="js/bootstrap.min.js"></script>
21     <script src="js/bootstrap-contextmenu.js"></script>
22     <link href="css/bootstrap.min.css" rel="stylesheet">
23     <script type="text/javascript">
24         $(document).ready(function(){
25             //屏蔽掉浏览器显示的页面中的右键菜单。
26             document.oncontextmenu = function(){return false;};
27             //启用自定义的右键菜单
28             $(\'#tk-cms-page-context-menu-control-area\').contextmenu({
29                 target: \'#context-menu\',
30                 onItem: function (context, e) {
31                 alert($(e.target).text());
32                 }
33             });
34         })
35     </script>

最后生成的output.html的内容如下:

 1 <!doctype html>
 2 <html>
 3  <head></head>
 4  <body>  
 5   <style type="text/css">
 6         .vCenter
 7         { 
 8             vertical-align:middle;
 9             margin:0 auto;
10         }
11     </style>   
12   <div id="context-menu" style="position: absolute; z-index: 9999; top: 746px; left: 474px;" class=""> 
13    <ul class="dropdown-menu" role="menu"> 
14     <li><a tabindex="-1">Cancel</a></li> 
15     <li><a tabindex="-1">Action</a></li> 
16    </ul> 
17   </div> 
18   <div id="tk-cms-page-context-menu-control-area" data-toggle="context" style="height:100%;width:100%;border:1px solid #ddd;" class="vCenter"> 
19    <div> 
20     <h1 style="text-align: center; font-size: 40px; color: #abcdef">This is a test page</h1> 
21    </div> 
22   </div> 
23   <script src="js/jquery-2.1.1.min.js"></script> 
24   <script src="js/bootstrap.min.js"></script> 
25   <script src="js/bootstrap-contextmenu.js"></script> 
26   <link href="css/bootstrap.min.css" rel="stylesheet"> 
27   <script type="text/javascript">
28         $(document).ready(function(){
29             //屏蔽掉浏览器显示的页面中的右键菜单。
30             document.oncontextmenu = function(){return false;};
31             //启用自定义的右键菜单
32             $(\'#tk-cms-page-context-menu-control-area\').contextmenu({
33                 target: \'#context-menu\',
34                 onItem: function (context, e) {
35                 alert($(e.target).text());
36                 }
37             });
38         })
39     </script>  
40  </body>
41 </html>

效果如下图所示,只有在灰色框区域内容点击鼠标右键有反应,框外点击鼠标右键是没有菜单出来的,那个框,限定了菜单的有效控制范围。

 

下面,再来看看,直接追加button在业务模板html页面后面的实现方案。直接上代码!

example.html的部分与上面一样,不再列举,下面先说java的部分:

 1 /**
 2  * @author "shihuc"
 3  * @date   2016年5月21日
 4  */
 5 package opc;
 6 
 7 import java.io.File;
 8 import java.io.FileOutputStream;
 9 import java.io.IOException;
10 import java.io.OutputStreamWriter;
11 
12 import org.jsoup.Jsoup;
13 import org.jsoup.nodes.Document;
14 import org.jsoup.nodes.Element;
15 import org.jsoup.select.Elements;
16 
17 /**
18  * @author "shihuc"
19  *
20  */
21 public class Demo2 {
22     
23     /**
24      * @param args
25      * @throws IOException 
26      */
27     public static void main(String[] args) throws IOException {
28         File input = new File("./example.html");
29         Document doc = Jsoup.parse(input, "UTF-8");
30         System.out.println(doc.html());
31         Elements content = doc.getElementsByTag("body");
32         //找到body的内容
33         Element body = content.get(0);
34         System.out.println(body.html());
35         
36         //读取控制页面右键的代码片段
37         File pice = new File("./pice2.html");
38         Document pdoc = Jsoup.parse(pice, "UTF-8");
39         
40         //将控制页面相关逻辑代码追加到业务页面example.html的最后面。
41         body.append(pdoc.html());
42         
43         FileOutputStream fos = new FileOutputStream("./output2.html", false);  
44         OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");  
45         osw.write(doc.html());  
46         osw.close();  
47     }
48 
49 }

再来列举pice2.html的代码部分:

 1     <style type="text/css">
 2         .vCenter
 3         { 
 4             vertical-align:middle;
 5             margin:0 auto;
 6         }
 7     </style>
 8 
 9     <div id="tk-cms-op-btn" style="border:1px solid #ddd; padding: 10px 10px" class="vCenter">
10         <button type="button" onclick="cancel();">Cancel</button>
11         <button type="button" onclick="action();">Action</button>
12     </div>
13    
14     <script src="js/jquery-2.1.1.min.js"></script>
15     <script type="text/javascript">
16         function cancel(){
17                 alert("cancel");
18         }
19         function action(){
20             alert("action");
21         }
22         $(document).ready(function(){
23             
24         });
25     </script>

最后看看输出部分output2.html的代码片:

 1 <!doctype html>
 2 <html>
 3  <head></head>
 4  <body> 
 5   <div> 
 6    <h1 style="text-align: center; font-size: 40px; color: #abcdef">This is a test page</h1> 
 7   </div>     
 8   <style type="text/css">
 9         .vCenter
10         { 
11             vertical-align:middle;
12             margin:0 auto;
13         }
14     </style>   
15   <div id="tk-cms-op-btn" style="border:1px solid #ddd; padding: 10px 10px" class="vCenter"> 
16    <button type="button" onclick="cancel();">Cancel</button> 
17    <button type="button" onclick="action();">Action</button> 
18   </div> 
19   <script src="js/jquery-2.1.1.min.js"></script> 
20   <script type="text/javascript">
21         function cancel(){
22                 alert("cancel");
23         }
24         function action(){
25             alert("action");
26         }
27         $(document).ready(function(){
28             
29         });
30     </script>  
31  </body>
32 </html>

看看example.html模板文件在追加了控制代码片后的效果:

到此,两种通过jsoup操作html添加页面控制单元的实现方案都列举出来,读者是不是有疑问了,这两者有啥区别,或者说到底那种要好点呢?

 

个人觉得,第一种右键菜单的那个,最终页面的视觉效果会干净点,但是,右键菜单是基于bootstrap的,引入了bootstrap.css以及bootstrap.js和bootstrap-contextmenu.js,所以,这个会对业务模板代码可能会造成影响。也就是说有些side effect. 另外的一种方案,就是直接添加button的,这个虽然不是那么好看,但是他需要的而外的插件资源少,最多就是一个jQuery的插件。其实,右键方式,也需要jQuery插件。

 

不多说了,有需要的,自己选择参考!测试的工程中引入了的资源文件等文件结构如下图所示:

 

以上是关于用java给html文件添加必要的控制html代码片的主要内容,如果未能解决你的问题,请参考以下文章

怎样用Java把word文档转换为html文档

给HTML页面添加CSS样式和自适应布局控制其显示

怎么在html中加入视频文件,代码怎么写

怎么用JS给HTML标签添加内容

HTML字段转换成java String字段

java连接sqlserver的各个坑(菜鸟亲测)