2010-04-21 81 views
1

我有一個過濾器處理生成的HTML並重寫某些元素。例如,它將類屬性添加到某些錨點。最後,它將處理後的HTML寫入響應(HttpServletResponseWrapper的一個子類)。當然,這意味着處理後的HTML在通過過濾器後的長度不同。過濾期間或過濾後,過濾器是否應寫入響應?

我可以看到接近這個的兩種方法。

一個是迭代HTML,使用StringBuilder構建處理過的HTML,並在完成所有過濾後將處理後的HTML寫入響應。 另一種是迭代HTML,但每處理一個元素後立即寫入響應。

哪種方式更適合此操作,還是有另一種更可取的方法?我正在尋求最大限度地減少臨時內存使用量。

+0

你確定這是你想做服務器端的東西嗎?解析html可能會變得很難看。 – 2010-04-21 15:50:09

+0

是的 - 也許我給的例子很糟糕。它也重寫資源的URL,所以我不能在客戶端上這樣做。是的,過濾器非常難看。 – 2010-04-21 16:05:05

回答

1

流式傳輸響應的複雜性(即「在旅途中」編寫)存在於代碼結構中:處理過程必須滿足響應字節以正確的順序獲得。但是,如果您在StringBuilder中組合應答,那麼您的代碼爲已有適用於流式傳輸。只需將StringBuilder替換爲ServletResponse.getWriter()方法返回的PrintWriter即可。

請注意,在HTTP 1.0中,HTTP服務器必須在響應頭中提供內容長度,或者在響應結束時關閉連接。 HTTP 1.1包括「塊傳輸編碼」,它允許事先不知道內容長度的情況下進行數據流傳輸,並且不會阻止連接被重複用於後續的HTTP請求。這應該被自動處理,所以你不必擔心它,除非你試圖支持真的很老的 HTTP客戶端。

0

很明顯,第二種方法需要更少的內存,並且會增加響應能力,但實施起來往往更加困難。