0

AbstractView次のように、ブラウザにXMLを出力するためにを作成しました。

public abstract class AbstractXmlView extends AbstractView {

public AbstractXmlView() {
    setContentType("application/xml");
}

@Override
protected void renderMergedOutputModel(Map<String, Object> model,
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {

    response.setCharacterEncoding("UTF-8");

    Document document = new DOMDocument();
    document.setXMLEncoding("UTF-8");

    buildXmlDocument(model, document, request, response);

    response.getOutputStream().print(document.asXML());
}

public abstract void buildXmlDocument(Map<String, Object> model,
        Document document, HttpServletRequest request,
        HttpServletResponse response) throws Exception;

ご覧のとおり、私のサブクラスは、buildXMLDocument実際にブラウザーに配信されるXMLドキュメントにデータを入力するためのメソッドを定義するため、単純化された実装を次に示します。

public class GetXmlContacts extends AbstractXmlView {

@Override
public void buildXmlDocument(Map<String, Object> model, Document document,
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {

    Element node = document.addElement("node");
    node.setText ("I'm unicode áéíóú");
}

node要素「I'municodeáéíóú」のテキストとしてのリテラル文字列に注意してください。これをサーバーに要求すると、UTF-8エンコーディング(OK)でHTTP応答を取得します。XML定義ではUTF-8であると示されていますが、ノードのテキストはISO-8859-1としてエンコードされます(これは私の推測ですが、 Firefoxでエンコーディングを変更すると、その文字列は問題ないように見えるためです)。

では、なぜdom4jは、UTF-8である必要があると定義されているのに、リテラル文字列をISOとしてエンコードするのでしょうか。私のコードに何か問題がありますか?ありがとう

4

1 に答える 1

1

解決しました!dom4jのバグがあるためelement.setText()、指定されたエンコーディングを気にせずdocument.asXML()、ISO文字列を返すため、その行を次のように変更しました。

response.getOutputStream().write(document.asXML().getBytes("UTF-8"));

そして、すべてがうまくいきました。

于 2012-09-26T17:46:17.310 に答える