0

URL には utf-8 文字が必要です。

たとえば、url に入れる文字列があります。

「ハイランリク」

私はそれをエンコードすると思った:

try{
        selected=URLEncoder.encode(selected,"UTF-8");
    }catch(Exception e){
        e.printStackTrace();
    }
    try {
        FacesContext.getCurrentInstance().getExternalContext().redirect("http://" + serverUrl +"/myjsfpage.jsf?param=" + selected );
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

    }

デバッグすると、予想される文字列が表示されます: Hayranl%C4%B1k%24

別のコントローラーでは、それを処理する必要があるため、次の方法で URL を取得します

HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

        String selected = (String)req.getParameter("param");

        if(selected ==null){
            //show no result message
            return;
        }

その後、デコードを試みますが、「デコード前」に、URL から取得した文字列は「Hayranlık$」のようなものです。

try{
        selected=URLDecoder.decode(selected,"UTF-8");
    }catch(Exception e){
        e.printStackTrace();
    }

JSF リダイレクトが問題の原因ですか、それともブラウザーの URL が問題を処理していますか?

4

1 に答える 1

3

HTTP 要求パラメーターをデコードするのは、サーブレットコンテナー自体です。これは必要ありませんし、必要ありませんURLDecoder。HTTP リクエスト パラメータのデコードに使用される文字エンコーディングは、GET リクエストを servletcontainer 設定で設定する必要があります。

どちらを使っているかは不明ですが、質問履歴からするとTomcatです。その場合、Tomcat の要素のURIEncoding属性をに設定する必要があります。<Connector>/conf/server.xmlUTF-8

<Connector ... URIEncoding="UTF-8">

以下も参照してください。


具体的な問題とは関係ありませんが、JSF でリクエスト パラメータをプルする方法はやや不器用です。以下はより単純で、JSF マネージド Bean にサーブレット API 依存関係を導入しません。

String selected = externalContext.getRequestParameterMap().get("param");

または、リクエスト スコープの Bean を使用している場合は、@ManagedProperty.

@ManagedProperty("#{param.param}")
private String param;

#{param}(はリクエスト パラメータ マップを参照する暗黙の EL オブジェクトであり、#{param.param}単に を返すことに注意してくださいmap.get("param")。パラメータ名を変更して、より明確にすることができます。たとえば"?selected=" + selected、 and then #{param.selected})

または、ビュー スコープの Bean にいる場合は、 で設定するだけ<f:viewParam>です。

<f:viewParam name="param" value="#{bean.param}" />

以下も参照してください。

于 2012-12-25T15:26:14.493 に答える