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

来源:互联网 发布:小学生网络教育 编辑:程序博客网 时间:2024/05/18 03:54

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

首先要知道这里的requestHttpServletRequest,如果我们打印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;

原创粉丝点击