国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Tomcat對(duì)String的編碼處理

2019-11-18 16:23:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  Tomcat的中文處理(一)

看到很多朋友問(wèn)關(guān)于中文的處理問(wèn)題,下面我們以tomcat4.0為servlet,jsp引擎來(lái)說(shuō)說(shuō)unicode的處理。

1)       從客戶端接受請(qǐng)求

當(dāng)客戶端請(qǐng)求tomcat的一個(gè)jsp文檔的時(shí)候,tomcat會(huì)構(gòu)造相應(yīng)的httpServletRequest實(shí)現(xiàn)類(lèi)的實(shí)例來(lái)代表客戶端,通過(guò)對(duì)流servletInputStream讀,我們可以得到客戶端來(lái)的數(shù)據(jù)。

   在jsp中我們通常使用的request.getParameter()來(lái)得到參數(shù)的值,這個(gè)函數(shù)的背后到底怎么樣的呢?怎么樣對(duì)String編碼的呢?

  通過(guò)tomcat的httpServletRequest實(shí)現(xiàn)類(lèi)源代碼考察:

public String getParameter(String name)

    {

        parseParameters();/////////處理parameters

        String values[] = (String[])parameters.get(name);//得到該參數(shù)名字對(duì)應(yīng)的Object(是一個(gè)數(shù)組)

        if(values != null)

        {

            return values[0];

        } else

        {

            return null;

        }

    }

其中parameters是request的一個(gè)map類(lèi)型的數(shù)據(jù)成員,用來(lái)存放接受到的客戶端的數(shù)據(jù)。也就是說(shuō)每當(dāng)客戶端請(qǐng)求的時(shí)候,tomcat構(gòu)造一個(gè)request實(shí)例,該實(shí)例有一個(gè)parameters用來(lái)存放從servlet實(shí)例的寫(xiě)入流的讀來(lái)的客戶端的數(shù)據(jù)。

  從上面的代碼知道最重要的的是parseParameters()函數(shù),它是來(lái)處理parameters的。

下面來(lái)看看:

PRotected void parseParameters()

    {

        if(parsed)

        {

            return;///如果處理過(guò)了,就不要處理了

        }

        ParameterMap results = parameters;/////構(gòu)造parameters對(duì)象的本地引用

        if(results == null)

        {

            results = new ParameterMap();//////如果沒(méi)有實(shí)例

        }

  results.setLocked(false);

        String encoding = getCharacterEncoding();//////////////////////////得到httpServeltRequest的編碼

        if(encoding == null)

        {

            encoding = "ISO-8859-1";//////////如果沒(méi)有指定httpServeltRequest的編碼采用"ISO-8859-1"

        }

       。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

            RequestUtil.parseParameters(results, queryString, encoding);//////////////////////處理編碼

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

                              

                is.read(buf, len, max - len); //////////////////////從流中讀取數(shù)據(jù)

           。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

                RequestUtil.parseParameters(results, buf, encoding);///////////////////////////////////處理編碼

         。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

        parameters = results;//////重置引用

    }

下面再來(lái)看看RequestUtil.parseParameters(results, buf, encoding);/的處理:

在此就不貼源代碼了,

RequestUtil.parseParameters(results, buf, encoding)的處理中對(duì)于buf  byte數(shù)組進(jìn)行處理,構(gòu)造key和value,就是參數(shù)名字和參數(shù)值:

while(ix < data.length) 

            {

                byte c = data[ix++];

                switch((char)c)

                {

                case 38: // '&'

                    value = new String(data, 0, ox, encoding);

                    if(key != null)

                    {

                        putMapEntry(map, key, value);

                        key = null;

                    }

                    ox = 0;

                    break;



                case 61: // '='

    key = new String(data, 0, ox, encoding);

                    ox = 0;

                    break;



                case 43: // '+'

                    data[ox++] = 32;

                    break;



                case 37: // '%'

                    data[ox++] = (byte)((convertHexDigit(data[ix++]) << 4) + convertHexDigit(data[ix++]));

                    break;



                default:

                    data[ox++] = c;

                    break;

                }

            }

            if(key != null)

            {

                value = new String(data, 0, ox, encoding);

                putMapEntry(map, key, value);

            }



顯然對(duì)于參數(shù)名字和參數(shù)的值都是采用的new String(data, 0, ox, encoding);方法來(lái)使用指定的編碼方式構(gòu)造的。


結(jié)論:我們不難看出如果沒(méi)有指定request的編碼方式,那么從客戶端接受到的參數(shù)的名字和參數(shù)值都是以iso-8859-1編碼的String的。

   也就是說(shuō)我們?cè)趈sp的頁(yè)面中的表單元素中給出的參數(shù)值在通過(guò)request.getParamter()得到后的String是以iso-8859-1編碼的。

而且我們看看tomcat為jsp產(chǎn)生的java文件知道,對(duì)于在jsp定義的沒(méi)有指定編碼方式的String的時(shí)候,tomcat是使用的iso-8859-1方式的,而不是系統(tǒng)默認(rèn)的。

  比如:

<%

String name=new String(“你好”);或者String name=”你好”;/////都是使用的iso-8859-1的編碼方式的。

System.out.println(name);/////////////////就會(huì)產(chǎn)生亂碼的。(因?yàn)镃onsole使用的系統(tǒng)的默認(rèn)編碼的,中文系統(tǒng)是gb2321,日文是MS932).

%>

下篇我們介紹httpServletResponse的處理

bill-轉(zhuǎn)自:csdn

(出處:http://m.survivalescaperooms.com)



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 广南县| 蒲城县| 阳春市| 巨野县| 宁波市| 龙口市| 揭阳市| 大安市| 灌云县| 抚宁县| 赤壁市| 上杭县| 香格里拉县| 平山县| 松溪县| 怀柔区| 定日县| 洛隆县| 台山市| 武汉市| 辛集市| 阜宁县| 平山县| 荃湾区| 县级市| 搜索| 新龙县| 博野县| SHOW| 静海县| 称多县| 威宁| 当涂县| 南雄市| 苏尼特右旗| 九江市| 水富县| 顺平县| 林西县| 垦利县| 廊坊市|