2017-06-15 20 views
2

Tomcatコンテナはservice(ServletRequest req, ServletResponse res)メソッドをどのように呼び出しますか? どこでこの呼び出しの実装を探すことができますか?
reqresのオブジェクト(service()メソッドに渡されたもの)がどのように作成されているかを確認するにはどうすればよいですか?Tomcatコンテナはservice()メソッドをどのように呼び出しますか?

+0

https://github.com/apache/tomcat – PeterMmm

答えて

1

Tomcat ArchitectureページはTODOステータスですが、少なくともリクエスト処理のUML sequence diagramへのリンクがあります。 Tomcatのソースコードと組み合わせることは、良い出発点です。

+0

ありがとう、それは私が必要としたものです。 – Warp

0

サーブレットのライフサイクルは、基本となるコンテナによって制御されます。サーブレットが初期化され、要求があると、Tomcatはサーブレットのサービスメソッドを呼び出してリクエストを処理します。 サービスメソッドは、サーブレットクラスに要求を委任します。ここで、doGetメソッドまたはdoPostメソッドのreqオブジェクトおよびresオブジェクトにアクセスできます。

public void doGet(HttpServletRequest req, HttpServletResponse res){ 
} 

アップデート:クライアントからの要求に応じて 1、コンテナは、2つのオブジェクトを作成します。HttpServletRequestのとHttpServletResponseの。 2.リクエストに基づいて、コンテナは正しいサーブレット(URLマッピングに従って)を見つけ、その特定のリクエスト用の新しいスレッドを作成し(1対1マッピング - リクエストごとに新しいスレッド)、作成されたServletのサービスメソッドを呼び出しますHttpServletRequestおよびHttpServletResponseオブジェクトを引数として使用します。 3.要求メソッド(GETまたはPOST)に基づいてservice()メソッドはServletでdoGet()またはdoPost()メソッドを呼び出し、同じHttpServletRequestおよびHttpServletResponseオブジェクトを引数として渡します。

これは一言で言えば、サーブレットの仕様です。 Tomcatの動作は実装固有のものであり、仕様によって制御されるものではありません。 Tomcatでどのように実装されているかを知る必要がある場合は、ソースコードを確認することができます。

+0

私は理解しますが、service()はどのくらい正確に呼び出されていますか? このサービスメソッドに送信されるオブジェクトはどのように作成されますか? tomcatコードの場合は 'ServletRequest request = new ServletRequest(); ServletResponse responce =新しいServletResponse(); request.doStuff(): responce.doStuff(): サービス(リクエスト、レスポンス) ' – Warp

+0

私は自分の答えを更新しました。 – fg78nc

0

あなたがそれを知りたい場合は、最初のクローンApache Tomcatのソースコード

git clone https://github.com/apache/tomcat.git 

その後クローン化されたリポジトリ内で、それはserviceメソッドが呼び出される場所検索するには、このコマンドを起動します。

grep -H -n -r "\.service(" --include=*.java 

ます短いファイルリストが見つかります:

java/javax/servlet/jsp/PageContext.java:107:  * in this PageContext until the return from the current Servlet.service() 
java/org/apache/catalina/connector/Request.java:3128:   //  that set towards the start of CoyoyeAdapter.service() 
java/org/apache/catalina/core/ApplicationFilterChain.java:231:    servlet.service(request, response); 
java/org/apache/catalina/servlets/DefaultServlet.java:411:   super.service(req, resp); 
java/org/apache/catalina/servlets/WebdavServlet.java:349:   super.service(req, resp); 
java/org/apache/coyote/ajp/AjpProcessor.java:403:     getAdapter().service(request, response); 
java/org/apache/coyote/AsyncStateMachine.java:41: *     been called during a single Servlet.service() method. The 
java/org/apache/coyote/AsyncStateMachine.java:58: *     been called during a single Servlet.service() method. The 
java/org/apache/coyote/http11/Http11Processor.java:498:     getAdapter().service(request, response); 
java/org/apache/coyote/http2/StreamProcessor.java:257:   adapter.service(request, response); 
java/org/apache/jasper/Constants.java:41:  * HttpJspBase.service(). This is where most of the code generated 
java/org/apache/jasper/servlet/JspServlet.java:385:   wrapper.service(request, response, precompile); 
java/org/apache/jasper/servlet/JspServletWrapper.java:440:     servlet.service(request, response); 
java/org/apache/jasper/servlet/JspServletWrapper.java:443:    servlet.service(request, response); 

最もintresting 1つはjava/org/apache/catalina/core/ApplicationFilterChain.javaです。より多くの偶然が見つかるだろうが、Tomcatのソースコードには非常に似たメソッドを持っている別のインタフェースがあるので、その多くはそうである。java/org/apache/coyote/Adapter.java無視する。

java/org/apache/catalina/core/ApplicationFilterChain.javaを取得すると、行231を編集してサービスメソッドの呼び出し場所を確認できます。

ただし、reqresのオブジェクトは、その場所には作成されません。それらがどのように作成されているかを見つけることは、もう少し複雑で時間がかかるようです。

関連する問題