2012-01-24 66 views
1

我對各種方法的實現有點困惑。 其實,我學習Servlet和JSP,我發現有很多方法,如哪個類具有getSession()方法的實現?

request.getSession(); 
response.getWriter(); 

所以請,任何一個可以告訴我在哪裏(在哪一類)的方法(getSession()getWriter()等)的實施都存在?

回答

2

它們存在於servletcontainer本身。更重要的是,servletcontainer實際上是Servlet API的整個具體實現。

如果是Tomcat(即open source),request.getSession()的實現由org.apache.catalina.connector.Request類提供。在當前的Tomcat 7.0.25版本看起來是這樣的:

2288 @Override 
2289 public HttpSession getSession() { 
2290  Session session = doGetSession(true); 
2291  if (session == null) { 
2292   return null; 
2293  } 
2294 
2295  return session.getSession(); 
2296 } 

相當於,response.getWriter()實現由org.apache.catalina.connector.Response類提供了看起來像這樣在Tomcat的7.0.25:

628 @Override 
629 public PrintWriter getWriter() 
630  throws IOException { 
631 
632  if (usingOutputStream) { 
633   throw new IllegalStateException 
634    (sm.getString("coyoteResponse.getWriter.ise")); 
635  } 
636 
637  if (ENFORCE_ENCODING_IN_GET_WRITER) { 
638   /* 
639    * If the response's character encoding has not been specified as 
640    * described in <code>getCharacterEncoding</code> (i.e., the method 
641    * just returns the default value <code>ISO-8859-1</code>), 
642    * <code>getWriter</code> updates it to <code>ISO-8859-1</code> 
643    * (with the effect that a subsequent call to getContentType() will 
644    * include a charset=ISO-8859-1 component which will also be 
645    * reflected in the Content-Type response header, thereby satisfying 
646    * the Servlet spec requirement that containers must communicate the 
647    * character encoding used for the servlet response's writer to the 
648    * client). 
649    */ 
650   setCharacterEncoding(getCharacterEncoding()); 
651  } 
652 
653  usingWriter = true; 
654  outputBuffer.checkConverter(); 
655  if (writer == null) { 
656   writer = new CoyoteWriter(outputBuffer); 
657  } 
658  return writer; 
659 
660 } 

所以有各其他servlet容器/應用服務器(Glassfish,JBoss AS,Jetty,WebLogic,WebSphere AS等)自己的實現(儘管他們大多使用Tomcat的分支)。

0

HttpServletRequest包含您感興趣的getSession()的實施,由HttpServletRequestWrapper及其母公司SerlvetRequestWrapper執行。

不出所料,HttpServletResponsegetWriter()的出發點,但實現生活在HttpServletResponseWrapper(實際上是它的超ServletResponseWrapper)。

但是,這應該都是可搜索的:您可以從servlet調用這些應用程序。如果你給他們打電話,你已經輸入了他們。如果您已經導入了它們,那麼您將擁有完全合格的課程名稱。如果你有FQN,你可以查看課程的Javadocs。如果你有Javadocs,你可以鏈接到超類/接口。

+1

包裝器不是實現......它們只是在默認情況下將所有方法委託給包裝的實例(按照裝飾器模式進行傳遞),以便開發人員無需重複所有無數的方法開發人員不需要重寫)。 – BalusC

+0

@BalusC好點。 –

相關問題