Проблема:
У нас есть веб-приложение на Java, основанное на Apache MyFaces Trinidad.Мы сталкиваемся с некоторыми проблемами при попытке частичной отправки (вот и все: через Ajax) формы, когда поле содержит некоторые специальные символы, такие как С, В и т. Д.
Когда мы пишем значение типа camión
в текстовом поле результирующее сообщение будет Hola cami
(оно удаляет специальный символ и следующий).
Сервер приложений, на котором мы запускаем наш код, - IBM WebSphere AS 7.0.
Такое поведение наблюдается в браузерах IExplorer и Firefox, все запускаются из Windows XP Professional (испанская версия).
Фрагменты основного кода :
ОБНОВЛЕНИЕ: на основе ответа lkdg
(спасибо), я обновил JSP и полученные фрагменты HTML-кода.
Код страницы JSP:
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://myfaces.apache.org/trinidad" prefix="tr" %>
<%@ taglib uri="http://myfaces.apache.org/trinidad/html" prefix="trh" %>
<f:view>
<tr:document>
<trh:head title="Prueba de AJAX con todas las Cabeceras">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</trh:head>
<tr:form>
<tr:panelHorizontalLayout halign="left">
<f:facet name="separator">
<tr:spacer width="10" height="5"/>
</f:facet>
<tr:inputText id="elCampo" label="Your name" value="#{commandButtonBean.name}"
requiredMessageDetail="Name is required"
/>
<tr:commandButton id="sayHello" text="Say Hello"
partialSubmit="true"
action="#{commandButtonBean.sayHello}"
/>
</tr:panelHorizontalLayout>
<tr:spacer height="15px"/>
<tr:outputText value="#{commandButtonBean.message}" partialTriggers="sayHello"
inlineStyle="font-weight: bold;"/>
</tr:form>
</tr:document>
</f:view>
Это итоговый HTML-вывод (удалены некоторые пустые строки):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><!--Start: org.apache.myfaces.trinidad.Document["j_id_jsp_1876237926_1"]--><html dir="ltr" lang="es-ES">
<head>
<meta name="generator" content="Apache MyFaces Trinidad">
<link rel="stylesheet" charset="UTF-8" type="text/css" href="/ModuloTrinidadPilotoWeb/adf/styles/cache/bigfont-desktop-nur72r-ltr-gecko.css">
</head>
<!--Start: org.apache.myfaces.trinidad.Document["j_id_jsp_1876237926_1"]-->
<body onload="_checkLoad()" onunload="_checkUnload(event)"><script type="text/javascript">var _AdfWindowOpenError='Se ha detectado un bloqueo de ventana emergente en el explorador. Estos bloqueos interfieren con el funcionamiento de esta aplicación. Desactívelo o permita elementos emergentes desde esta dirección.';</script><script type="text/javascript" src="/ModuloTrinidadPilotoWeb/adf/jsLibs/Common1_2_10.js"></script><!--Start: org.apache.myfaces.trinidad.Document["j_id_jsp_1876237926_1"]--><div id="tr_pprBlockingDiv" onclick="return _pprConsumeClick(event);" style="position:absolute;left:0;top:0;width:0;height:0;cursor:wait;" onkeydown="return false;" onkeyup="return false;" onmousedown="return false;" onmouseup="return false;" onkeypress="return false;"></div><a name="top"></a>
<noscript>Esta página utiliza JavaScript y necesita un explorador activado para JavaScript. Su explorador no está activado para JavaScript.</noscript>
<!--Start: org.apache.myfaces.trinidad.Head["j_id_jsp_1876237926_2"]-->
<head>
<title>Prueba de AJAX con todas las Cabeceras</title>
<meta name="generator" content="Apache MyFaces Trinidad">
<link rel="stylesheet" charset="UTF-8" type="text/css" href="/ModuloTrinidadPilotoWeb/adf/styles/cache/bigfont-desktop-nur72r-ltr-gecko.css">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<!--Start: org.apache.myfaces.trinidad.Form["j_id_jsp_1876237926_3"]-->
<form id="j_id_jsp_1876237926_3" name="j_id_jsp_1876237926_3" style="margin:0px" method="POST" onkeypress="return _submitOnEnter(event,'j_id_jsp_1876237926_3');" action="/ModuloTrinidadPilotoWeb/jsp/sgtc/pruebaAjax2.faces"><!--Start: org.apache.myfaces.trinidad.Panel["j_id_jsp_1876237926_4"]--><table cellpadding="0" cellspacing="0" border="0" summary=""><tr>
<td><!--Start: org.apache.myfaces.trinidad.Input["elCampo"]--><table id="elCampo__xc_" class="af_inputText" cellpadding="0" cellspacing="0" border="0" summary=""><tr>
<td class="af_inputText_label" nowrap><span id="elCampo::icon" style="display:none;"><a name="_msgAnc_elCampo" title="Error" class="AFErrorIconStyle">X</a></span> <label for="elCampo">Your name</label></td>
<td valign="top" nowrap class="AFContentCell"><!--Start: org.apache.myfaces.trinidad.Input["elCampo"]--><input id="elCampo" name="elCampo" class="af_inputText_content" size="30" type="text"></td>
</tr><tr>
<td></td>
<td class="AFComponentMessageCell"><!--Start: org.apache.myfaces.trinidad.Input["elCampo"]--><span id="elCampo::msg" class="OraInlineErrorText"></span></td>
</tr></table></td>
<td><!--Start: org.apache.myfaces.trinidad.Object["j_id_jsp_1876237926_5"]--><img src="/ModuloTrinidadPilotoWeb/adf/images/t.gif" alt="" width="10" height="5"></td>
<td><script type="text/javascript">var _pprUpDatemode=false;function _adfspu(f,v,e,s,o){_pprUpdateMode=true;if(!o)o=new Object();if(e)o.event=e;if(s)o.source=s;_submitPartialChange(f,v,o);}</script><!--Start: org.apache.myfaces.trinidad.Command["sayHello"]-->
<button id="sayHello" name="sayHello" type="button" onclick="TrPage._autoSubmit('j_id_jsp_1876237926_3','sayHello',event,1);return false;" class="af_commandButton">Say Hello</button>
</td>
</tr></table><!--Start: org.apache.myfaces.trinidad.Object["j_id_jsp_1876237926_8"]--><div style="margin-top:15px"></div><!--Start: org.apache.myfaces.trinidad.Output["j_id_jsp_1876237926_9"]--><span id="j_id_jsp_1876237926_9" style="font-weight: bold;"></span><input type="hidden" name="org.apache.myfaces.trinidad.faces.FORM" value="j_id_jsp_1876237926_3"><!--Start: org.apache.myfaces.trinidad.Form--><span id="tr_j_id_jsp_1876237926_3_Postscript"><input type="hidden" name="javax.faces.ViewState" value="!-4fd3ee50"><script type="text/javascript">function _j_id_jsp_1876237926_3Validator(f,s){return _validateInline(f,s);}var j_id_jsp_1876237926_3_SF={};</script></span><script type="text/javascript">_submitFormCheck();</script></form>
</body>
<!--Created by Apache Trinidad (Apache MyFaces Trinidad API - 1.2.10/Apache MyFaces Trinidad Impl - 1.2.10), skin:bigfont.desktop (bigfont)--></html>
Код компонента CommandButton:
public class CommandButtonBean {
public String name;
public String message;
public String sayHello(){
message = "Hola " + name;
return "";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Конечно, командная кнопка настроена на сайте Face-config.xml.(Я думаю, что этот фрагмент не подходит).
Попытки исправить до сих пор:
- Мы проверили кодировку кодировки на разных уровнях (приложение, JVM, так далее).Кажется, что выровнены между различными слоями.
Кроме того, мы включили в web.xml следующий параметр контекста:
<context-param>
<param-name>PARAMETER_ENCODING</param-name>
<param-value>UTF-8</param-value>
</context-param>
Мы записали, какое значение передается в качестве аргументаметод setName
, если это может быть ошибка при написании ответа.Переданное значение уже неверно.
Мы попытались написать веб-фильтр, чтобы установить кодировку запроса в UTF-8 (на всякий случай, вы знаете).Но при регистрации значений параметров в фильтре мы тоже получили неправильное значение.
Наконец мы удалили атрибут partialSubmit
кнопки отправки и получили правильное значение.Но это не решит нашу проблему, так как мы пытаемся реализовать некоторые встроенные поиски и проверки (мы не хотим перерисовывать всю страницу).
Итак, когда мыотправив обычное сообщение POST, мы получим ожидаемый результат, но когда мы пытаемся использовать подход Ajax, мы теряем эти специальные символы.
И, наконец, Вопрос:
Есть ли у вас какие-либо предложения по устранению этой проблемы?
Большое спасибо.