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