PrimeFaces 3.3 <p:datatable>过滤失败,UTF8

Mar*_*tus 6 jsf primefaces

我有一个PrimeFaces 3.3/JSF应用程序,我部署到JBoss AS 7.1.为了显示我的数据,我使用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>
Run Code Online (Sandbox Code Playgroud)

PrimeFaces p:对数字Age列的dataTable过滤始终有效,但在Surname列上会出现奇怪的行为.当backing bean的items实例变量具有姓氏中包含ASCII数据的元素时,过滤工作.但是当存在UTF8数据时,过滤仅部分起作用:

[1]我可以在列标题字段中键入我的语言环境的UTF8字符,结果确实已过滤(这是可行的部分).

[2] backing bean的当前实例变量始终为null.即绑定:

selection="#{customerController.current}"
Run Code Online (Sandbox Code Playgroud)

似乎不起作用.我在CustomerController :: prepareEdit方法中添加了一些日志记录,当按下edit 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);
    }
Run Code Online (Sandbox Code Playgroud)

并在我的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>
Run Code Online (Sandbox Code Playgroud)

但这也没有做到.

Bal*_*usC 7

您需要确保请求字符编码已设置为UTF-8.您可以使用servlet过滤器来实现这一点,该过滤器已映射到覆盖感兴趣请求的URL模式.例如,/*或者只是在servlet的名称上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);
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

也可以看看: