首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

对Servlet 中 request.setEncoding("utf-八")的分析

2013-11-08 
对Servlet 中 request.setEncoding(utf-8)的分析对Servlet??中?request.setEncoding(utf-8)的分析?首

对Servlet 中 request.setEncoding("utf-8")的分析

对Servlet??中?request.setEncoding("utf-8")的分析

?

首先要知道这里的request为HttpServletRequest,如果我们打印request的话,发现打印出的类型为?RequestFacade(package?org.apache.catalina.connector;?public?class?RequestFacade?implements?HttpServletRequest?)?,这里的RequestFacade对象实现了HttpServletRequest接口。

?

通过源码有如下发现:

?protected?Request?request=null;??

(package?org.apache.catalina.connector)

?public?RequestFacade(Request?request)?{

????????this.request?=?request;

?}

request对象通过RequestFacade对象的构造方法来设值

?

request.setCharacterEncoding(env);

?

2、package?org.apache.catalina.connector

???public?class?Request?implements?HttpServletRequest

?

????public?void?setCharacterEncoding(String?enc)

????????throws?UnsupportedEncodingException?{

????????if?(usingReader)

????????????return;???????

????????//?确保编码格式可用

????????byte?buffer[]?=?new?byte[1];

????????buffer[0]?=?(byte)?'a';

????????String?dummy?=?new?String(buffer,?enc);

????????//?Save?the?validated?encoding

????????coyoteRequest.setCharacterEncoding(enc);

}

在这里发现有个usingReader变量,默认值为false,

?protected?boolean?usingReader?=?false;

在如下两个地方将usingReader设置为true

?

?protected?boolean?usingInputStream?=?false;

????public?ServletInputStream?getInputStream()?throws?IOException?{

?

????????if?(usingReader)

????????????throw?new?IllegalStateException

??????????????(sm.getString("coyoteRequest.getInputStream.ise"));

????????usingInputStream?=?true;

????????if?(inputStream?==?null)?{

????????????inputStream?=?new?CoyoteInputStream(inputBuffer);

????????}

????????return?inputStream;

?

????}

?

????public?BufferedReader?getReader()?throws?IOException?{

?

????????if?(usingInputStream)

????????????throw?new?IllegalStateException

????????????????(sm.getString("coyoteRequest.getReader.ise"));

?

????????usingReader?=?true;

????????inputBuffer.checkConverter();

????????if?(reader?==?null)?{

????????????reader?=?new?CoyoteReader(inputBuffer);

????????}

????????return?reader;

?

????}

3、protected?org.apache.coyote.Request?coyoteRequest;

????coyoteRequest.setCharacterEncoding(enc);

???????

???????public?final?class?Request

?

????public?void?setCharacterEncoding(String?enc)?{

????????this.charEncoding?=?enc;

}

private?String?charEncoding?=?null;

?

?在这里我们可以知道,request对象的setCharacterEncoding方法只是将charEncoding属性设置为enc

?

到现在为止request的编码设置已经完成了,但是究竟在哪使用呢,下面就来看看

request通过如下几个方法来取得请求的参数:

package?org.apache.catalina.connector;

?

?public?String?getParameter(String?name)

?public?String[]?getParameterValues(String?name)

?public?Map?getParameterMap()

?public?Enumeration?getParameterNames()

下面来看一下它们的具体实现:

?

????public?String?getParameter(String?name)?{

????????if?(request?==?null)?{

????????????throw?new?IllegalStateException(

????????????????????????????sm.getString("requestFacade.nullRequest"));

????????}

????????if?(Globals.IS_SECURITY_ENABLED){

????????????return?(String)AccessController.doPrivileged(

????????????????new?GetParameterPrivilegedAction(name));

????????}?else?{

????????????return?request.getParameter(name);

????????}

}

同样的道理?RequestFacade.getParameter(name)方法来调用Request.getParameter(name)

????public?String?getParameter(String?name)?{

????????if?(!parametersParsed)

????????????parseParameters();

????????return?coyoteRequest.getParameters().getParameter(name);

????}

可以发现取参数的时候首先会将所有的参数解析出来

开始定义时?protected?boolean?parametersParsed?=?false;

?

?

?

?

?

?

热点排行