3

問題:

ApacheMyFacesTrinidadをベースにしたJavaWebアプリケーションがあります。フィールドにÑ、áなどの特殊文字が含まれている場合に、フォームを部分的に送信しようとすると(つまり、Ajax経由で)、いくつかの問題に直面します。

camiónテキストフィールドのように値を書き込むと、結果のメッセージは次のようになりますHola cami(特別な文字と次の文字が削除されます)。

コードを実行しているアプリケーションサーバーはIBMWebSphereAS7.0です。

この動作は、すべてWindows XP Professional(スペイン語バージョン)から実行されるIExplorerおよびFirefoxブラウザで確認されています。

メインコードスニペット

更新: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 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で構成されています(このスニペットは関係ないと思います)。

これまでに試みられた修正:

  • さまざまなレベル(アプリケーション、JVMなど)で文字セットのエンコーディングを確認しました。異なるレイヤー間で整列しているようです。
  • また、web.xmlに次のコンテキストパラメータを含めました。

    <context-param>
        <param-name>PARAMETER_ENCODING</param-name> 
        <param-value>UTF-8</param-value> 
    </context-param>
    
  • メソッドへの引数として渡された値をログに記録しました setName。これは、応答の書き込み時にエラーが発生した可能性があるためです。渡された値はすでに間違っています。

  • リクエスト文字セットをUTF-8に設定するために、Webフィルターを作成しようとしました(念のため)。しかし、フィルターでパラメーター値をログに記録すると、間違った値も取得されました。

  • ついに partialSubmit送信ボタンの属性を削除し、正しい値を取得しました。ただし、インライン検索と検証を実装しようとしているため、これで問題が実際に解決されるわけではありません(ページ全体を再描画したくない)。

したがって、通常のPOSTメッセージを送信すると、期待どおりの結果が得られますが、Ajaxアプローチを使用しようとすると、これらの特殊文字が失われます。

そして、ついに、質問:

この問題を解決する方法について何か提案はありますか?

どうもありがとうございます。

4

4 に答える 4

2

これはtrinidad&WASの既知の問題です:http://www.mail-archive.com/dev@myfaces.apache.org/msg46298.html。2つのjsファイルに小さな変更を加える必要があり、送信された文字をエンコードする必要があります(Naveen Ravindraによる解決策が機能します)。これらのファイルを編集します。

  • trinidad-impl-XXX.jar \ META-INF \ adf \ jsLibsDebug \ xhr \ XMLRequest.js
  • trinidad-impl-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));プロダクションバージョンで。

テスト済み、WAS7.0.0.11で動作します。

于 2011-02-28T22:53:44.330 に答える
1

こんにちは私はあなたの問題を再現することはできません。実際、あなたのようにjsp Pageをプログラムしようとしても、何も起こりません。これが私の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:document

この構成では、óに問題はありませんでした。web.xmlにPARAMETER_ENCODINGが設定されておらず、jsf1.2 trinidad 1.2.14を使用しています。これは実際には答えではありませんが、おそらく役立つでしょう。

よろしく

于 2011-02-25T13:56:32.707 に答える
0

トリニダードを少し忘れましたが、ボタンが入力テキストに影響を与えるために、inputTextコンポーネントに設定された「partialTriggers」属性が必要ではありませんか?ボタンのIDが必要ですか?

于 2011-02-25T12:50:43.170 に答える
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 WebSphereAS7.0を知りません。しかし、おそらくあなたの問題は、この男がここに書いていることと関係があります:リソース応答でのUTF-8文字の表示

于 2011-02-28T13:06:44.183 に答える