我有一个使用Primefaces 4(我无法更新它,它不依赖于我)的web应用程序,其中一个数据表的列有时具有alpha(希腊字母:α)。
为了加载这个数据表,我使用了一个带有过滤器的表单按钮。当我单击该按钮时,后端使用ISO-8859-15编码向我发送响应。这是一个问题,因为使用这种编码,alpha被表示为问号(?),但是,当我使用分页按钮转到第二页时,我收到使用UTF-8编码的响应,alpha被正确表示,即使我可以返回到第一页,我收到使用UTF-8的响应。 我能够在我的本地测试Tomcat服务器上解决这个问题,在xhtml文件的第一行更改编码:<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
但是这在使用Weblogic 12c的生产服务器中不起作用。数据表的数据来自一个lazydatamodel类,然后使用调试器对两个按钮执行完全相同的操作,除了页面。但是我在这里留下了这个lazydatamodel类的load方法的代码:
private List<ListElement> data;
@Autowired
private transient CamFacade camFacade;
public List<ListElement> load(int first, int pageSize, String sortField,
SortOrder sortOrder, Map<String, String> filters) {
Map<String, Object> params = new HashMap<String, Object>();
params.putAll(filters);
params.put("first", first);
params.put("pageSize", pageSize);
if(sortField == null){
params.put("orderBy", params.get("orderBy"));
params.put("order", params.get("order"));
}else{
params.put("orderBy", sortField);
params.put("order", sortOrder.name());
}
int count = camFacade.countByParams(params);
if (count > 0 ) {
data = camFacade.findByParams(params);
} else {
data = new ArrayList<ListElement>();
}
return data;
}
编辑:
我也尝试了这个解决方案:通过PrimeFaces输入组件检索的Unicode输入变得损坏
但这对我不起作用。如果我没有误解它,用这个代码我改变了请求编码,但实际上我的请求是好的,它是UTF-8。我需要更改RESPONSE编码。
你知道怎么解决这个问题吗?
您可以添加一个Filter
,在其中设置请求和响应的字符编码utf - 8:
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
request.setCharacterEncoding(StandardCharsets.UTF_8.name());
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
chain.doFilter(request, response);
}
// ...
}