编辑: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/