2012-10-24 38 views
1

問題:修改「黑匣子」的Servlet響應輸出

我有一個生成報告一個servlet,更具體報表的表身。這是一個黑匣子,我們無法訪問源代碼。

儘管如此,它的工作令人滿意,並沒有計劃在servlet被重寫或很快取代。

我們需要修改,以更新它生成其他報告,我想與會發現錨文本,並使用正則表達式替換它的過濾器做的幾個環節的響應文本。

研究:

我跑進this question有一個正則表達式過濾器。它應該是我需要的,但也可能不是。

我不是在parsing術語的嚴格意義上解析HTML,我不是用語言的全部規範工作。我擁有的是構成表體的HTML標籤的子集,並且沒有嵌套表格,所以由servlet生成的HTML子集不是遞歸的。

我只需要查找/替換錨的目標和屬性添加到標籤。

所以,問題是:

我需要修改一個servlet的輸出,以改變類型的所有鏈接:

<a href="http://mypage.com/servlets/reports/?a=report&id=MyReport&filters=abcdefg"> 

到像鏈接:

<a href="http://myOtherPage.com/webReports/report.xhtml?id=MyReport&filters=abcdefg" target="_parent"> 

我應該使用@ Jeremy Stein編寫的正則表達式過濾器還是有更好的解決方案?

+2

我當然不會使用正則表達式來解析HTML,但也許這樣的東西可以用於URL本身。對於幽默和可怕的警告,你應該閱讀這個:http://stackoverflow.com/a/1732454/650425 –

+0

@maple_shaft在這個問題上,我的肩膀上有很多人的聲音。至於servlet輸出,我們測試了它並寫入了有效的XML。如果我需要將它轉換爲數據結構,我會使用XML解析器解析它。在響應中發送之前,我只需修改它的部分。 – Mindwin

+0

當你說:_「這種類型的鏈接...」_你是指指向特定主機或域的所有鏈接?或者只是那些具有特定網址?或者只有那些具有path ='servlets/reports /'的人你需要更清楚地明確你想修改哪些錨鏈接。另外,錨點是否還有其他屬性? – ridgerunner

回答

1

假設而變化的目標A標籤的唯一部分是href屬性的查詢組件,那麼這個測試正則表達式的解決方案應該做了很好的工作:

// TEST.java 20121024_0800 
import java.util.regex.*; 
public class TEST { 
    public static String fixReportAnchorElements(String text) { 
     Pattern re_report_anchor = Pattern.compile(
      "<a href=\"http://mypage\\.com/servlets/reports/\\?a=report&id=([^\"]+)\">", 
      Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); 
     Matcher m = re_report_anchor.matcher(text); 
     return m.replaceAll(
      "<a href=\"http://myOtherPage.com/webReports/report.xhtml?id=$1\" target=\"_parent\">" 
      ); 
    } 
    public static void main(String[] args) { 
     String input = 
      "test <a href=\"http://mypage.com/servlets/reports/?a=report&id=MyReport&filters=abcdefg\"> test"; 
     String output = fixReportAnchorElements(input); 
     System.out.println(output); 
    } 
} 
+0

是的,那正是我想到的。我使用了Jeremy Stein的班級(請參閱有關鏈接),並進行了一些更改。我只是想知道正則表達式過濾器是否是編輯servlet輸出的方式。我添加了我的模式並替換了您的答案+1,並接受了它。 – Mindwin

0

我用Jeremy Stein (click to go to question)類,有幾個變化:

一)確保沒有人下來的過濾器鏈和servlet不要包裝對象調用的getOutputStream(),否則就會拋出一個invalidStateException(檢查對象this answer by BalusC)。

B)我想使網頁上的單個變化,所以我沒有把任何一個FilterConfig在web.xml中。

B.2)我也沒放任何東西在web.xml中的。課程本身使用javax.servlet.annotation.WebFilter

三)我設置的模式,並直接在類替換字符串:

Pattern searchPattern = Pattern.compile("<a (.*?) href=\".*?id=(.*?)[&amp;|&]filtros=(.*?)\" (.*?)>(.*?)</a>"); 
String replaceString = "<a $1 href=\"/webReports/report.xhtml?idRel=$2&filtros=$3\" target=\"_parent\" $4>$5</a>"; 

注意.*?有儘可能少的匹配,避免匹配多想。

爲了測試匹配和正則表達式,我在研究主題時使用了this applet I found

希望這可以幫助任何人有同樣的問題。