我对各种方法的实现有点困惑。 实际上,我正在学习Servlet和JSP,我找到了很多像
这样的方法request.getSession();
response.getWriter();
所以请问,任何人都能告诉我方法(getSession()
,getWriter()
等)的实施在哪里(在哪个班级)?
答案 0 :(得分:2)
它们存在于servlet容器本身中。更重要的是,servletcontainer实际上是Servlet API的整个具体实现。
如果是Tomcat(open source),则request.getSession()
类会提供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 }
的实现。在当前的Tomcat 7.0.25版本中,它看起来像这样:
response.getWriter()
等效地,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 }
实现由org.apache.catalina.connector.Request
类提供,在Tomcat 7.0.25中看起来像这样:
{{1}}
所以彼此的servletcontainer / appserver(org.apache.catalina.connector.Response
,Glassfish,JBoss AS,Jetty,WebLogic等)都有自己的实现(尽管它们主要是使用Tomcat的分支。)
答案 1 :(得分:0)
HttpServletRequest
包含您感兴趣的getSession()
的实施,由HttpServletRequestWrapper
及其父SerlvetRequestWrapper
实施。
不出所料,HttpServletResponse
是getWriter()
的起点,但实现位于HttpServletResponseWrapper
(实际上在其超类ServletResponseWrapper
中)。
然而,这应该是可搜索的:你从servlet中调用它们。如果你打电话给他们,你已经导入了它们。如果您已导入它们,则您具有完全限定的类名。如果你有FQN,你可以查找班级的Javadocs。如果您有Javadoc,则可以链接到超类/接口。