how tomcat works 读书笔记(二)----------一个简单的servlet容器(三)

2015-07-20 17:26:47 · 作者: · 浏览: 24
seUri("sdf")); PrintWriter out = response.getWriter(); out.println("Hello. Roses are red."); out.print("Violets are blue."); out.flush(); }

我把servlet类中的service改成上面的样子,大家看看,其实request的parseUri方法在servlet里是不应该被使用的!
那怎么办?
第一种,将parseUri方法的public方法改成默认的访问修饰符,包外的类就不能访问了。
不过还有另一种方式
门面模式!!
在上面的例子中,我们写的request实现了ServletRequest,我们可以再写一个类RequestFacade类让他也实现ServletRequest(response 类似)
\


package ex02.pyrmont;


import java.io.IOException;
import java.io.BufferedReader;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;


public class RequestFacade implements ServletRequest {


  private ServletRequest request = null;


  public RequestFacade(Request request) {
    this.request = request;
  }


    public String getRemoteHost() {
    return request.getRemoteHost();
  }


  //省略对ServletRequest接口的实现
  //servletrequest接口的方法 在RequestFacade 内部实现时 都调用类的属性request来实现


  public void setCharacterEncoding(String encoding)
    throws UnsupportedEncodingException {
    request.setCharacterEncoding(encoding);
  }


}
再看看  ServletProcessor 改成如下


    Servlet servlet = null;
    RequestFacade requestFacade = new RequestFacade(request);
    ResponseFacade responseFacade = new ResponseFacade(response);
    try {
      servlet = (Servlet) myClass.newInstance();
      servlet.service((ServletRequest) requestFacade, (ServletResponse) responseFacade);
    }
    catch (Exception e) {
      System.out.println(e.toString());
    }
    catch (Throwable e) {
      System.out.println(e.toString());
    }
httpServer 也改成如下
 if (request.getUri().startsWith("/servlet/")) {
          ServletProcessor2 processor = new ServletProcessor2();
          processor.process(request, response);
        }


app1给servlet里面传递的参数实际上是Request类型的,有调用parseUri方法的危险。
app2给servlet里面传递的参数实际上是RequestFacade,它根本就没有parseUri方法,自然就安全了。



这篇文章中 对书中的源码有删减 大家可以 下载完整版本的
深入剖析tomcat 源码
http://down.51cto.com/data/486495