6

JBoss AS 7.1 にデプロイする PrimeFaces 3.3 / JSF アプリケーションがあります。データを表示するには、いくつかのフィルタリング ヘッダーを含むp:dataTableを使用します。コードは次のとおりです(ソースを絞り込んだ後):

<p:outputPanel id="custDataTable">            
        <p:dataTable var="item" value="#{customerController.items}" rowKey="#{item.id}"
                        selection="#{customerController.current}" selectionMode="single" id="customersTable">
            <p:column headerText="Surname" sortBy="#{item.surname}" filterBy="#{item.surname}" id="surname">  
                #{item.surname}
            </p:column>  
            <p:column headerText="Age" sortBy="#{item.age}" filterBy="#{item.age}" id="age" styleClass="age">
                #{item.age}
            </p:column>
            <p:column headerText="&nbsp;">
                <p:spacer width="20" height="0" />
                <p:commandButton update=":custForm" ajax="false" action="#{customerController.prepareEdit}" value="edit">
                    <f:setPropertyActionListener value="#{item}" target="#{customerController.current}" />
                </p:commandButton>
            </p:column>
        </p:dataTable>  
</p:outputPanel>

数値のAge列に対するPrimeFaces p:dataTableフィルタリングは常に機能しますが、Surname列では奇妙な動作が発生します。バッキング Bean のitemsインスタンス変数のsurnameにASCII データを含む要素がある場合、フィルタリングが機能します。ただし、UTF8 データが存在する場合、フィルタリングは部分的にしか機能しません。

[1]ロケールの UTF8 文字を列ヘッダー フィールドに入力すると、結果は実際にフィルター処理されます (これが機能する部分です)。

[2]バッキング Bean の現在のインスタンス変数は常に null です。すなわちバインディング:

selection="#{customerController.current}"

動作していないようです。CustomerController::prepareEditメソッドにいくつかのログを追加しました。編集 p:commandButtonが押されると、値が null に設定されます。その結果、姓の列に基づいてフィルター処理されたインスタンスを編集できません(UTF8 データが存在する場合)。ただし、同じ UTF8 データを持つ同じインスタンスは、数値の年齢列でフィルター処理する場合、またはまったくフィルター処理しない場合に編集できます。

この問題に取り組むために、文字エンコード フィルターを登録してみました。

public class CharacterEncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req,
                             ServletResponse resp,
                             FilterChain chain)
             throws IOException, ServletException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        chain.doFilter(req, resp);
    }

それを私のweb.xmlに登録しました:

<?xml version="1.0" encoding="UTF-8"?>
<web-app ...
...
  <filter>                                                                                                                                           
      <filter-name>Character Encoding Filter</filter-name>                                                                                           
      <filter-class>mp.util.CharacterEncodingFilter</filter-class>                                                                                   
  </filter>      
</web-app>

しかし、それもうまくいきませんでした。

4

1 に答える 1

7

リクエストの文字エンコーディングが UTF-8 に設定されていることを確認する必要があります。対象のリクエストをカバーする URL パターンにマップされたサーブレット フィルタを使用してこれを行うことができます。たとえば/*、または単にのサーブレット名でFacesServlet.

@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }

    // ...
}

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

于 2012-07-15T22:50:00.447 に答える