我對各種方法的實現有點困惑。 其實,我學習Servlet和JSP,我發現有很多方法,如哪個類具有getSession()方法的實現?
request.getSession();
response.getWriter();
所以請,任何一個可以告訴我在哪裏(在哪一類)的方法(getSession()
,getWriter()
等)的實施都存在?
我對各種方法的實現有點困惑。 其實,我學習Servlet和JSP,我發現有很多方法,如哪個類具有getSession()方法的實現?
request.getSession();
response.getWriter();
所以請,任何一個可以告訴我在哪裏(在哪一類)的方法(getSession()
,getWriter()
等)的實施都存在?
它們存在於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的分支)。
HttpServletRequest
包含您感興趣的getSession()
的實施,由HttpServletRequestWrapper
及其母公司SerlvetRequestWrapper
執行。
不出所料,HttpServletResponse
是getWriter()
的出發點,但實現生活在HttpServletResponseWrapper
(實際上是它的超ServletResponseWrapper
)。
但是,這應該都是可搜索的:您可以從servlet調用這些應用程序。如果你給他們打電話,你已經輸入了他們。如果您已經導入了它們,那麼您將擁有完全合格的課程名稱。如果你有FQN,你可以查看課程的Javadocs。如果你有Javadocs,你可以鏈接到超類/接口。
包裝器不是實現......它們只是在默認情況下將所有方法委託給包裝的實例(按照裝飾器模式進行傳遞),以便開發人員無需重複所有無數的方法開發人員不需要重寫)。 – BalusC
@BalusC好點。 –