1.产生这个想法的来源
由于工作的原因,再加上平时收藏一些网站,收藏夹中的网址越来越多。虽然可以通过归类进行分类管理,但是搜索起来就不方便了。是否可以写一个网站小应用把浏览器中的收藏夹导入到网站中呢?
经过分析和实践,是可以处理的,我们先来看看传统的IE导入导出收藏夹的方法。
2. 通常导入导出IE中的收藏夹的内容的方法是:
- IE中菜单“文件” --》 导入导出
- 选择“导出收藏夹”
- 选择导出的路径,最后生成文件:bookmark.htm
3. 那我们怎么把IE的收藏夹信息导入到WEB应用中呢?
很简单,传统的导出收藏夹的方式是指定硬盘路径(比如:C:/),我们只要把这个路径换成一个servlet的全路径(比如:http://www.0924.com.cn/apps/favorite/upload)。 是否就可以待保存的文件流获取到,是不是想怎么做就怎么做了,看看Servlet是怎么处理。
4. 提取收藏夹数据的Servlet
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
/**
* 处理收藏夹上传
*
* @author qianjun.liqj
*
*/
public class FavoriteServlet extends HttpServlet {
private final static Logger logger = Logger
.getLogger(FavoriteServlet.class);
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String favString = reader(req.getInputStream());
logger.info(favString);
}
public static String reader(InputStream input) throws IOException{
BufferedReader bReader = new BufferedReader(new InputStreamReader(input));
StringBuffer sb = new StringBuffer();
String line = bReader.readLine();
while(line != null) {
sb.append(line).append("\n");
line = bReader.readLine();
}
return sb.toString();
}
}
红色:favString 就是我们提取到的数据
5. 处理收集到的字符串
数据收集到了,该怎么处理? 不知您是否注意到收藏夹的结构和文件夹的结构类似(即多层的文件夹和相应的链接),那我们是否可以把这个信息按照原来的结构进行处理呢?详细见如下代码,首先把HTML--> XML:
import java.io.File;
import java.io.IOException;
import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.PrettyXmlSerializer;
import org.htmlcleaner.TagNode;
import org.htmlcleaner.XPatherException;
/**
* 从HTML转化XML
* @author qianjun.liqj
*
*/
public class TestHtmlCleaner {
public void test() throws IOException, XPatherException {
long start = System.currentTimeMillis();
HtmlCleaner cleaner = new HtmlCleaner();
CleanerProperties props = cleaner.getProperties();
props.setUseCdataForScriptAndStyle(true);
props.setRecognizeUnicodeChars(true);
props.setUseEmptyElementTags(true);
props.setAdvancedXmlEscape(true);
props.setTranslateSpecialEntities(true);
props.setBooleanAttributeValues("empty");
TagNode node = cleaner.clean(new File("C://bookmark.htm"));
System.out.println("vreme: " + (System.currentTimeMillis() - start));
new PrettyXmlSerializer(props).writeXmlToFile(node, "c:/out.xml");
System.out.println("vreme: " + (System.currentTimeMillis() - start));
}
public static void main(String[] args) throws IOException, XPatherException {
TestHtmlCleaner thc = new TestHtmlCleaner();
thc.test();
}
}
执行上述的程序以后,即可把收集到的字符串转化为XML,那么即可读入XML转化为相应Java对象(类似File的结构)。
有兴趣的可以尝试一下。