java - Primefaces 更新破坏变音符号

标签 java hibernate jsf primefaces derby

编辑:tl;dr: 保存变音符号时,它们会损坏(ä 变成 ä)。正如我现在意识到的那样,我的其余问题与问题没有任何关系。

.

我正在通过 JBoss、Hibernate、Infinispan Cache、derby、Maven 和 Primefaces 构建一个网络应用。

我显示一个从数据库中获取数据的页面,其中包含正确的数据(带有变音符号)。它正确显示在 <p:dataTable id="dt1" var="as" value="#{aSBean.elementList}" ...>

从表中选择一个条目时会弹出一个对话框。对话代码的主要部分是

<p:dialog header="AS Detail" widgetVar="asDialog" resizable="false" id="asDlg"
          showEffect="fade" hideEffect="fade" modal="true" styleClass="detailDialog" >  
        <h:panelGrid id="display" >  

            <h:outputText value="Bemerkung" />  
            <h:inputText value="#{aSBean.selectedElement.bemerkungTxt}" />
            <h:outputText value="Bearbeiter" />  
            <h:outputText value="#{fehlerBean.selectedElement.bearbeiterNr}" />  

        </h:panelGrid>  
        <h:panelGrid id="diaBtnDisplay">  
            <p:commandButton value="Speichern" update=":form1:dt1" id="save"   validateClient="true" actionListener="#{aSBean.save}"/>
            <p:commandButton value="Abbrechen" id="cancel">
                <f:ajax event="click" onevent="asDlg.hide()" />
            </p:commandButton>          
        </h:panelGrid>  

</p:dialog>

现在,Abbrechen-CommandButton 中甚至没有更新属性,但当我按下此按钮时,dataTable 仍然会更新。如果我通过右上角的 X 离开对话框,它不会。

但是当我按下 Abbrechen 时,dataTable 得到更新并且我的 ä 变成了 ä。 但它只会对选定的元素这样做。这是我的一些支持 bean 代码:

public Arbeitsschluessel selectedElement = new Arbeitsschluessel();
public Arbeitsschluessel newElement = new Arbeitsschluessel();

public Arbeitsschluessel getSelectedElement() {
    return selectedElement;
}

public void setSelectedElement(Arbeitsschluessel selectedValue) {
    if (selectedValue != null) {
        this.selectedElement = selectedValue;
    }
}

public List<Arbeitsschluessel> getElementList() {
        return elementList;
    }

所以绝对没有什么特别的。我的 HTML 页面以 <?xml version="1.0" encoding="UTF-8"?> 开头我还包括以下内容 <meta http-equiv="content-type" content="text/html; charset=utf-8" />

我在按下 Abbrechen 按钮后调试了更新过程,对于我的第 n 个元素,as var 的内容是错误的。调用堆栈每次看起来都一样,所以我不能说这个值在什么时候被破坏了。

如果我通过按钮(从数据库中的 dao.findAll)重新加载数据表,所有内容都会再次正确显示,除了当我将错误的值保存到数据库中时。所以这不是数据库值已损坏。任何帮助表示赞赏!

编辑:打开对话框的代码:

<p:commandButton id="selectButton" update=":form1:display" oncomplete="PF('asDialog').show()" icon="" title="View"> 
                    <f:setPropertyActionListener value="#{as}" target="#{aSBean.selectedElement}" />
</p:commandButton>

最佳答案

我找到了答案。必须使用 CharacterEncodingFilter

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharacterEncodingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {   }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        servletRequest.setCharacterEncoding("UTF-8");
        servletResponse.setContentType("text/html; charset=UTF-8");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {  }
}

然后在WEB-INF文件夹下的web.xml中添加如下几行:

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>your.package.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

关于java - Primefaces 更新破坏变音符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20687593/

相关文章:

java - Ascii 转 整数

java - Vaadin 8 非模态窗口 CloseListener - 通过在其外部单击关闭

hibernate - 如何在 Spring Boot 中使用 Spring 管理的 Hibernate 拦截器?

java - 如果没有 Activity 事务,createCriteria 无效

java - 如果我为 transient 变量提供列标记,在 hibernate 中会发生什么?

jsf - 如何编写仅接受#,###.00 模式中的整数的 inputText

java - 如何使用 java 登录 JSF 页面

java - 通过 JSONObject 传递 Unicode 字符串时出错

http - Post-Redirect-Get 后的后退按钮行为

java - 未找到 Tomcat + Spring Boot + 'javax.websocket.server.ServerContainer'