10

RichFaces 4 オートコンプリート コンポーネントと次の JSF 2 ページおよび Java Bean を使用して実装された JSF の検索フォームがあります。Tomcat 6 & 7 を使用してアプリケーションを実行しています。

...
<h:commandButton value="#{msg.search}" styleClass="search-btn" action="#{autoCompletBean.doSearch}" />
...

AutoCompleteBean で

public String doSearch() {

   //some logic here
   return "/path/to/page/with/multiple_results?query=" + searchQuery + "&amp;faces-redirect=true";

}

これは、「searchQuery」文字列を含むすべてが Latin-1 にある限りうまく機能しますが、Latin-1 の外にある場合は機能しません。

たとえば、「bodø」を検索すると、「bod%F8」として自動的にエンコードされます。ただし、「Ð」をエンコードできないため、「Kra Ðong」の検索は機能しません。

これを解決するためにいくつかの異なるアプローチを試しましたが、どれもうまくいきません。

  • URLEncode を使用して自分で searchQuery をエンコードしようとしましたが、% が %25 としてエンコードされているため、これは二重エンコードにしかつながりません。
  • java.net.URI を使用してエンコーディングを取得しようとしましたが、URLEncode と同じ結果が得られます。
  • Connector で URIEncoding="UTF-8" を使用して Tomcat で UTF-8 をオンにしようとしましたが、ASCII 以外の文字がまったく機能しないため、問題が悪化するだけです。

だから私の質問に:

  1. JSF 2 が GET パラメータをエンコードする方法を変更できますか?
  2. JSF 2 が GET パラメータをエンコードする方法を変更できない場合、エンコードを無効にして手動で変更できますか?
  3. 私はここで奇妙なことをしていますか?これはそのままでサポートされるべきもののように思えますが、同じ問題を抱えている人は他に見つかりません。
4

2 に答える 2

0

HTTP URL とヘッダーで受け入れられる唯一の文字エンコードは US-ASCII です。これらの文字を URL エンコードして、アプリケーションに送り返す必要があります。Java でこれを行う最も簡単な方法は次のとおりです。

public String doSearch() {

   //some logic here
   String encodedSearchQuery = java.net.URLEncoder.encode( searchQuery, "UTF-8" );
   return "/path/to/page/with/multiple_results?query=" + encodedSearchQuery + "&amp;faces-redirect=true";

}

そして、使用するどのキャラクターでも機能するはずです。

于 2012-06-12T12:11:24.397 に答える