2009-09-02 46 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