问题:
我们有一个基于Apache MyFaces Trinidad的Java Web应用程序。当一个字段包含一些特殊字符,例如Ñ,á等时,我们在尝试部分提交(就是它:通过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 bean代码:
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;
}
}
当然,命令按钮是在faces-config.xml配置的(我认为此代码段不相关)。
到目前为止尝试修复:
此外,我们在web.xml中包含了下一个上下文参数:
<context-param>
<param-name>PARAMETER_ENCODING</param-name>
<param-value>UTF-8</param-value>
</context-param>
我们记录的是什么值
作为论据传递给了
setName
方法,如果可能的话
写回应时出错。该
传递的价值已经错了。
我们试过写一个网络过滤器, 将请求字符集设置为UTF-8(仅在 案件,你知道)。但是当记录时 我们在过滤器上的参数值 也得到了错误的价值。
最后我们删除了
partialSubmit
的属性
提交按钮,并得到了正确的
值。但这不会真正解决我们的问题
问题,正如我们正在努力的那样
实现一些内联搜索和
验证(我们不想重绘
整页)。
因此,当我们发送正常的POST消息时,我们会得到预期的结果,但是当我们尝试使用Ajax方法时,我们会丢失这些特殊字符。
最后,问题:
您对如何解决此问题有任何建议吗?
非常感谢。
答案 0 :(得分:2)
这是trinidad&amp; WAS的一个已知问题:http://www.mail-archive.com/dev@myfaces.apache.org/msg46298.html。你将不得不对两个js文件做一个小修改,你需要对发送的字符进行编码(Naveen Ravindra的解决方案是有效的)。编辑这些文件:
将这个新函数添加到它们中(将其粘贴到js的开头:
function encodeCharacters(string) {
string = string.replace(/\r\n/g, "\n");
var utftext = "";
for ( var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
} else if ((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
更改相同js中的TrXMLRequest.prototype.send
功能。在它改变
xmlhttp.send(content);
到xmlhttp.send(encodeCharacters(content));
,a4.send(a3);
到a4.send(encodeCharacters(a3));
。经过测试,适用于WAS 7.0.0.11。
答案 1 :(得分:1)
您好,我无法重现您的问题。实际上,如果我像你一样尝试编写jsp页面,我什么都不会做。这就是我的jsp的样子
<%@ 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" %>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<f:view>
<tr:document>
<trh:head title="Your Title">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</trh:head>
</tr:document>
</f:view>
你不使用的tr:文档会创建一个html,body和head标签。 如果需要,可以使用trh:head。 请参阅特立尼达的文档: Documentation tr:document
通过这种配置,我对ó没有任何问题。 我没有在web.xml中设置PARAMETER_ENCODING,我使用的是jsf1.2 trinidad 1.2.14 这不是一个真正的答案,但它可能有所帮助。
此致
答案 2 :(得分:0)
我已经忘记了trinidad,但是为了让按钮影响输入文本,你不需要在inputText组件上设置“partialTriggers”属性,该组件应该具有按钮的ID吗?
答案 3 :(得分:0)
再次是lkdg
我试图重现你的问题。
JSP:
<tr:inputText
id="myfield"
value="#{myBean.myname}">
</tr:inputText>
<tr:commandButton
id="sayHello"
text="Say Hello"
partialSubmit="true"
action="#{myBean.sayHello}"/>
<tr:outputText
value="#{myBean.message}"
partialTriggers="sayHello"
inlineStyle="font-weight: bold;"/>
豆:
private String myname;
private String message;
public String sayHello()
{
message = "Hola " + myname;
return "";
}
public String getMyname() {
return myname;
}
public void setMyname(String myname) {
this.myname = myname;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
ó和ễ等等一切都很好。 jsf-1.2; trinidad1.2.14; apache tomcat6.0.29
我不知道IBM WebSphere AS 7.0。但可能你的问题与这个人写的内容有关:Displaying UTF-8 Characters in resource response