Myfaces Trinidad JSF: проблема Ajax при отправке символов, отличных от US-ASCII - PullRequest
3 голосов
/ 25 февраля 2011

Проблема:

У нас есть веб-приложение на 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&aacute;gina utiliza JavaScript y necesita un explorador activado para JavaScript. Su explorador no est&aacute; 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>&nbsp;<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, мы теряем эти специальные символы.

И, наконец, Вопрос:

Есть ли у вас какие-либо предложения по устранению этой проблемы?

Большое спасибо.

Ответы [ 4 ]

2 голосов
/ 01 марта 2011

Это известная проблема в Тринидаде и WAS: http://www.mail-archive.com/dev@myfaces.apache.org/msg46298.html.Вам нужно будет сделать небольшую модификацию двух js-файлов, вам нужно закодировать отправленные символы (работает там решение от Naveen Ravindra).Отредактируйте эти файлы:

  • Тринидад-импл-XXX.jar \ META-INF \ adf \ jsLibsDebug \ xhr \ XMLRequest.js
  • Тринидад-импл-XXX.jar \ META-INF \ adf \ jsLibs \ xhr \ XMLRequest.js

Добавьте к ним эту новую функцию (вставьте ее в начало 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;
}

Измените TrXMLRequest.prototype.sendфункция в том же JS. В нем изменить

  • xmlhttp.send(content); на xmlhttp.send(encodeCharacters(content)); в отладочной версии и
  • a4.send(a3); на a4.send(encodeCharacters(a3)); в рабочей версии.

Протестировано, работает в WAS 7.0.0.11.

1 голос
/ 25 февраля 2011

Привет, я не могу воспроизвести твою проблему. На самом деле я ничего не получу, если попытаюсь запрограммировать страницу 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: document, который вы не используете, создается тег html, body и head. Вы можете использовать trh: head, если вам это нужно. Смотрите документацию Тринидада: Документация tr: документ

С этой конфигурацией у меня не было проблем с. У меня не установлено PARAMETER_ENCODING в web.xml, и я использую jsf1.2 Тринидад 1.2.14 Это не совсем ответ, но, вероятно, это поможет.

Привет

0 голосов
/ 28 февраля 2011

снова 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;"/> 

bean:

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.Но, возможно, ваша проблема связана с тем, что этот парень пишет здесь: Отображение символов UTF-8 в ответе ресурса

0 голосов
/ 25 февраля 2011

Я немного забыл Тринидад, но для того, чтобы кнопка влияла на вводимый текст, вам не нужен атрибут "partalTriggers ", установленный для компонента inputText, который должен иметь идентификатор кнопки?

...