对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;
?
?
?
?
?
?