2009-09-02 70 views
0

我有一个控制器类如下面的代码段:Spring MVC和解析HTML

@Controller 
public class SiteEntryController 
{ 
    @RequestMapping(value="/index.htm") 
    public ModelAndView handleIndex(
      @RequestParam(value="enableStats", required=false) String enableStats) 
    { 
     ModelMap map = new ModelMap(); 

     ........... 

     return new ModelAndView("index", map); 
    } 
} 

和ViewResolver的定义为如下:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
    p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/> 

我需要做的是,要读取/解析仅具有html标记的index.jsp的内容,并返回有关内容中使用的标记的一些信息。 我将寻找如何查看我所收集到的信息,但首先,我无法弄清楚如何访问内容。 我熟悉Java,但全新的春。所以我的问题会很愚蠢。 :) 只是为了您的信息,我无法弄清楚是不是如何解析HTML,它是关于如何获得文件内容。

我做这个东西跟正常的文件操作,如下:

public class Main { 

private static HTMLEditorKit.ParserCallback callback; 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    try { 
     Reader r = new FileReader("D:/WS/TestP/resource/index.htm"); 
     ParserDelegator parser = new ParserDelegator(); 
     callback = new Detector(); 
     parser.parse(r, callback, false); 
    } catch (Exception _ex) { 
     _ex.printStackTrace(); 
    } 
    HashMap<String, Integer> map = ((Detector) callback).getMap(); 
    Set<String> keys = map.keySet(); 
    Iterator<String> it = keys.iterator(); 
    String key; 
    ArrayList<TagFrequency> list = new ArrayList<TagFrequency>(); 
    TagFrequency tf; 
    int i = 0, j = 0; 
    while (it.hasNext()) { 
     key = it.next(); 
     i = map.get(key); 
     tf = new TagFrequency(key, i); 
     if (list.size() == 0) 
      list.add(tf); 
     else { 
      j = 0; 
      while (j < list.size() && tf.compareTo(list.get(j)) > 0) { 
       j++; 
      } 
      if (j==list.size()) 
       list.add(tf); 
      else { 
       list.add(j, tf); 
      } 
     } 
    } 
    for (int ind = list.size(); ind>0 ; ind--) { 
     System.out.println(list.get(ind-1).toString()); 
    }  
} 
} 

Detector.java:

public class Detector extends HTMLEditorKit.ParserCallback { 

    private HashMap<String, Integer> map = new HashMap<String, Integer>(); 

    public Detector() { 
    } 

    @Override 
    public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) { 
     String str = t.toString(); 
     if (map.get(str) == null) { 
      map.put(str, Integer.valueOf(1)); 
     } else { 
      map.put(str, map.get(str) + 1); 
     } 
    } 

    public HashMap<String, Integer> getMap() { 
     return map; 
    } 
} 

和TagFrequency.java:

public class TagFrequency { 
    private String tag; 
    private Integer i; 
    public TagFrequency(String tag, Integer i) { 
     super(); 
     this.tag = tag; 
     this.i = i; 
    } 
    public String getTag() { 
     return tag; 
    } 
    public void setTag(String tag) { 
     this.tag = tag; 
    } 
    public Integer getI() { 
     return i; 
    } 
    public void setI(Integer i) { 
     this.i = i; 
    } 
    public String toString() { 
     return this.tag + " " + this.i; 
    } 

    public int compareTo(TagFrequency tf) { 
     if (tf.i > this.i) 
      return -1; 
     else if (tf.i < this.i) 
      return 1; 
     else 
      return (-1)*this.tag.compareToIgnoreCase(tf.tag); 
    } 
} 
+0

如果它的任何安慰,它的琐碎,在PHP做。 :) – cletus 2009-09-02 14:02:08

回答

0

您可以实现它使用一个servlet过滤器来传递缓存HTML的servlet响应包装器,然后运行你的代码它。

使用这种技术的一个项目是SiteMesh,所以你可以在它的代码一挑。

+0

谢谢你的答案。一个很好的servlet过滤器资源在这里: http://java.sun.com/products/servlet/Filters.html – 2009-09-04 07:34:33