目次
I.はじめに
後にWeb開発の簡単な要約によるTomcatのである-何Xiaobai初心者のウェブ開発(1)とweb.xmlのである-何Xiaobai初心者のウェブ開発(2)によるWeb開発の簡単な要約、私はウェブ開発の少し理解しています、開発プロセスはおそらく次のようになります。
- 1. Webプロジェクトが開発され、最後にプロジェクトコード(フロントエンドページの表示+ビジネスロジック)がMavenを介してwarパッケージにパッケージ化されます。
- 2.サーバーにTomcatをインストールすると、インストールディレクトリにwebappsフォルダーが作成され、最初のステップでパッケージ化されたwarパッケージがこのディレクトリに配置されます。(Webアプリケーションの命名方法から、このTomcatが複数のWebアプリケーションを起動できることもわかります)。
- 3. binディレクトリに入り、.startup.shを実行し、Tomcatを起動すると、warパッケージのweb.xml構成ファイルが読み取られ、Xiaobaiによる初心者のWeb開発の簡単な要約に従います(2) -Webとは.xml内部のクラスをインスタンス化すると、ブラウザーにurlを入力してWebアプリケーションにアクセスできます。
上記の3点は、私のローカルコンピュータでの操作方法に基づいてまとめたものです。Webサイト開発プロセスでの実際の操作プロセスについては後で検討しますが、ほぼこのようになると思います。では、後でWeb開発を学ぶためには、Spring、Spring MVC、Tomcatの関係を学ぶ必要があると思います。リクエストが来るのですが、リクエストを完了する方法は?
2つのWebアプリケーション開発
1.Webアプリケーション開発とは
Webアプリケーションの開発では、通常、B / Sアーキテクチャを使用します。開発の観点からは、Webアプリケーションの開発はAPPの開発と同じだと思いますが、Webページ関連のビジネスロジック+ネットワーク通信+ネットワークが提供する機能の部分に分けることができます。ビジネス層。ユーザーの場合、必要なのはブラウザーのみであり、Webアプリケーションの関連するビジネスロジックとデータはサーバー側に存在します。ブラウザは、Httpプロトコルを介してサーバーと通信し、Webページのコンテンツを取得して、ブラウザを介してユーザーに表示します。
プロセス全体におけるブラウザの役割:
(1)サーバーとのTCP接続を確立します。
(2)Httpリクエストを送信すると、リクエストにGET / POSTのマークが付けられます。
(3)Http応答を受信し、サーバーから返されたコンテンツをブラウザーに表示します。
リクエストとレスポンスの両方にHttpヘッダーとHttpボディが含まれ、レスポンスボディは設定されたContent-Type(text / htmlなど、<html> </ html>を返します)とブラウザに従って対応するWebページデータを返します。この情報が表示されますそれだけです。ブラウザによって取得される最初のリソースは、これらのHtml Webページです。JavaScript、CSS、画像などのリソースがある場合、ブラウザは、対応するリソースURLに従ってサーバーにリクエストを再度送信します。
プロセス全体におけるサーバーの役割:
(1)ブラウザとのTCP接続を確立します。
(2)Http要求を識別し、Http要求を受信して処理します。
(3)処理されたHttpリクエストをブラウザに返します。
役割の分割から、サーバーはすでにHttp要求とその他のネットワーク通信作業を処理および解析しており、ブラウザーはHttp要求の送受信を担当し、WebアプリケーションはWebサーバーに配置するだけでよいことがわかります。Java EEでは、Http要求を処理するためにHttpServletが提供されているため、サーバーがHttpServletを実装している限り、ネットワーク通信を実現できます。
2.シンプルなWebアプリケーション
HttpSerlvetは、クライアントから送信されたHttpリクエストを処理するためのクラスとして理解できると思います。これには、次の2つのメソッドがあります。
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
パラメータHttpServletRequestreq、HttpServletResponse respは、要求と応答を表します。このHttpSerlvetを使用する場合、TCPとの対話方法を気にする必要はなく、Httpを解析する必要もありません。たとえば、doGet()メソッドでは、次のことだけが必要です。ブラウザをreqから取得し、このメソッドでビジネスロジックを完了します。データベースの読み取りと書き込みの操作、最後に結果をrespに書き込むと、ブラウザは関連データと要求と応答のロジックを受信できます。 resとrespにカプセル化されています。
このHttpSerlvetを使用して、Webアプリケーション開発の簡単な例を完成させます。
(1)IDEAを介してMavenプロジェクトを作成します
(2)pom.xmlを構成し、サーブレットを導入します
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
ここで、依存関係は<provided>(つまり、<scope> Provided </ scope>の設定)として導入する必要があることに注意してください。これにより、依存関係はコンパイル時にのみ使用され、最後に.warパッケージにパッケージ化されません。 Tomcatは後で使用されます対応するサーブレットAPIはすでにサーバーに存在します。
(3)構成パッケージのタイプは.warであり、構成は最終的に.warの名前にパッケージ化されます。
<packaging>war</packaging>
<build>
<finalName>builder-spring</finalName>
</build>
(4)javaディレクトリにFirstServlet javaファイルを作成し、簡単な表示文を記述します。
@WebServlet(urlPatterns = "/")
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter writer = resp.getWriter();
writer.write("<h1> Hello Web ,This is a simple web!</h1>");
//强制输出
writer.flush();
}
}
もちろん、getOutputStream()
書き込みストリームを取得することもできます。もう1つの注意点は、書き込みが完了した後にflush()を呼び出す必要があることです。そうしないと、データを時間内にブラウザーに返すことができず、close()は閉じたTCP接続であり、このメソッドを呼び出すことができません。
(5)プロジェクトプロジェクトのmain / webapp / WEB-INFディレクトリにWebアプリケーション記述ファイルweb.xmlを作成します。
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>build spring</display-name>
</web-app>
(6)IDEAに付属のMavenを介してパッケージ化し、clean-> compile-> packageを順番に実行してから、ターゲットディレクトリにbuild-spring.warパッケージを生成します。
(7)build-spring.warパッケージをTomcatインストールディレクトリwebappsにコピーし、binディレクトリに戻り、.startup.shを実行して、ターミナルコマンドウィンドウに表示します。
MacBook-Pro:bin j1$ ./startup.sh
Using CATALINA_BASE: /Users/j1/Documents/java/apache-tomcat-9.0.41
Using CATALINA_HOME: /Users/j1/Documents/java/apache-tomcat-9.0.41
Using CATALINA_TMPDIR: /Users/j1/Documents/java/apache-tomcat-9.0.41/temp
Using JRE_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home
Using CLASSPATH: /Users/j1/Documents/java/apache-tomcat-9.0.41/bin/bootstrap.jar:/Users/j1/Documents/java/apache-tomcat-9.0.41/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
(8)ブラウザにhttp:// localhost:8080 / builder-spring /と入力します。ここで、/ builder-spring /はwarパッケージの名前であり、次のインターフェイスが表示されます。
もちろん、http:// localhost:8080 / builder-spring /?count = 2を介して パラメーターを追加することもできます。その後、FirstServletのHttpServletRequestを介して直接読み取ることができます。
@WebServlet(urlPatterns = "/")
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
String count = req.getParameter("count");
PrintWriter writer = resp.getWriter();
writer.write(String.format("<h1> Hello Web %s ,This is a simple web!</h1>",count));
//强制输出
writer.flush();
}
次のようにブラウザにアクセスします。
上記の手順により、簡単なWebアプリケーションが正常に作成されました。ブラウザが「http:// localhost:8080 / builder-spring /」にアクセスすると、リクエストが送信され、Tomcatが表示されます(前の初心者のWeb開発の簡単な要約(1)-何ですかTomcatも言及されていますTomcatは実際にはサーブレットコンテナです)処理のためにFirstServletにリクエストを渡します(@WebServlet(urlPatterns = "/")はマッピング関係を提供します)。
さらに、このURLの構成は、実際にはpom.xmlで構成した<finalName>と、FirstServletの@WebServlet(urlPatterns = "/")です。
上記のコードはgithubにアップロードされています。githubアドレスはhttps://github.com/wenjing-bonnie/build-spring.gitです。
3.実際のWebアプリケーション
もちろん、Webアプリケーションには多くのサーブレットがあり、各サーブレットはパスにマップされます。したがって、完全なWebアプリケーションの開発では、Webページに関連するビジネスロジックを実際にはいくつかのプロセスに分割できます。
- (1)異なるパスマッピングに対応する異なるサーブレット。
各サーブレットがビジネスロジックを処理するとき、実際には次のプロセスに分割できます。
1)HttpServletRequestからリクエストパラメータを読み取ります。
2)複雑なビジネスロジックの処理:データベースの読み取りと書き込みに共通の操作クラスが必要であり、データベース内の各テーブルがいくつかのカプセル化クラスに対応している必要があり、これらのテーブルの操作用のカプセル化クラスが必要です。複数のデータベーステーブルの操作が含まれる場合があります。つまり、複数のテーブルの操作クラスを導入する必要があります。
3)HttpServletResponseに応答データを書き込むと、応答データはブラウザが表示するデータの一部であることがわかります(上記の例では、応答データは文字列の表示にのみ使用できますが、実際の開発ではjspなどのより多くのページ関連のレンダリングになります);
明らかに、このプロセスでは、クラスインスタンスの多くのインスタンス化とロード、およびこれらのクラスインスタンスのライフサイクルの管理が行われ、サーブレットのModel-View-Controllerデザインパターンに抽象化することもできます。
- (2)Webサーバーは、パスマッピングルールに従って、対応するサーブレットにさまざまなパスを転送します。この転送機能は通常、サーバーのディスパッチャーによって実行されます。
次に、ネットワーク通信とネットワークがビジネス層に提供する機能がTomcatによって完成されます。前回と比較すると、Web開発の簡単な要約でTomcatのです-何Xiaobai初心者(1)とweb.xmlのである-何Xiaobai初心者のためのWeb開発の簡単な要約(2) 、これらのプロセスは、特定の対応を持っているようです。
- (1)Tomcatはサーブレットコンテナであり、サーブレットをインスタンス化して要求と応答を処理するために使用されます。Tomcatコネクタは、ブラウザとの接続を確立し、ブラウザから送信された要求を受信し、応答をブラウザに返す役割を果たします。
- (2)Tomcatのコンテナ内のエンジンは、サーブレットをインスタンス化し、サーブレットのライフサイクルを管理し、基盤となるネットワーク通信を完了するために使用されます。
- (3)DispatcherSerlvetはweb.xmlに登録され、ブラウザーから送信された要求を対応するパスの処理クラスにマップします。
現在、Webアプリケーション開発のいくつかの知識ポイントが明らかになり始めているようです。
Webアプリケーション開発の3つのブレークポイントデバッグ
上記の簡単な例から、Webアプリケーション開発は、ブラウザから送信されたHttpリクエストを処理するサーブレットを実際に作成していることがわかります。もちろん、確立されたルールに従って、最終的なサーブレットをwarパッケージにパッケージ化する必要があります。 Tomcatを介してwarパッケージをロードし、これらのサーブレットを実行します。
簡単なWebアプリケーションの例で前述した6番目と7番目の手順では、IDEAを介してwarパッケージをパッケージ化し、ローカルにインストールされたTomcatを介してwarパッケージを開始する必要があります。ブレークポイントのデバッグについてはどうでしょうか。実際、TomcatはJavaプログラムでもあります。.startup.shを介してTomcatを起動するには、JVMを起動してTomcatのmain()メソッドを実行し、warパッケージをロードした後にサーブレットを初期化してブラウザにサービスを提供します。実際、TomcatスタートアップWebプロジェクトをコードの形で完成させることができます。
(1)上記のプロジェクトコードのまま、javax.servletをTomcat関連の依存関係に置き換えます。
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>${tomcat.version}</version>
</dependency>
(2)Tomcatインスタンス化のmain()メソッドを増やします
public class FirstServletTest {
public static void main(String[] args) throws LifecycleException {
//创建Tomcat
Tomcat tomcat = new Tomcat();
tomcat.setPort(Integer.getInteger("port", 8080));
tomcat.getConnector();
//创建webapp
Context context = tomcat.addWebapp("", new File("src/main/webapp").getAbsolutePath());
WebResourceRoot resources = new StandardRoot(context);
DirResourceSet set = new DirResourceSet(resources, "/WEB-INF/classes", new File("target/classes").getAbsolutePath(), "/");
resources.addPreResources(set);
context.setResources(resources);
//启动Tomcat
tomcat.start();
tomcat.getServer().await();
}
}
(3)main()メソッドを実行すると、以下のIDEAに表示され、組み込みTomcatが正常に開始されたことを示します。Tomcatはこのプロジェクトをルートディレクトリに自動的に配置します。ルートディレクトリには、http:から直接アクセスできます。 // localhost:8080 /?count = 2は、対応するサーブレットにアクセスします
二月 08, 2021 2:00:25 下午 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-nio-8080"]
二月 08, 2021 2:00:25 下午 org.apache.catalina.core.StandardService startInternal
信息: Starting service [Tomcat]
二月 08, 2021 2:00:25 下午 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet engine: [Apache Tomcat/9.0.36]
二月 08, 2021 2:00:25 下午 org.apache.catalina.startup.ContextConfig getDefaultWebXmlFragment
信息: No global web.xml found
二月 08, 2021 2:00:27 下午 org.apache.jasper.servlet.TldScanner scanJars
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
二月 08, 2021 2:00:27 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-nio-8080"]
このように、FirstServletTestのmain()を実行することにより、ブレークポイントを使用してプロジェクトを簡単にデバッグできます。しかし、実際のWebアプリケーション開発では、このようにブレークポイントデバッグであるかどうかはわかりません。自分で調べて調査する必要があります。
コードのgithubアドレスは次のとおりです:https://github.com/wenjing-bonnie/build-spring.git
4つの要約
Webアプリケーション開発のこの単純な例を通して、前比較のTomcatである-何Xiaobai初心者によるWeb開発の簡単な要約(1)とである-何Xiaobai初心者のためのWeb開発の簡単な要約(2)要約のweb.xmlのを、シンプル今明らかなことを要約してください:
- 1. Webアプリケーション開発プロジェクトは、Mavenを介してwarパッケージにパッケージ化され、サーブレットをサポートするWebサーバー上で実行されます。
- 2. TomcatはサーブレットをサポートするWebサーバーです。Webアプリケーションサービスがオンラインになるたびに、サーバーにインストールされているTomcatの関連ディレクトリにwarパッケージを配置し、Tomcatを起動する必要があります。
- 3. Tomcatが起動すると、warパッケージのweb.xmlファイルが読み取られ、対応するクラスがインスタンス化されます。
- 4.ブラウザーが要求を送信すると、最初にWebサーバーとのTCP接続が確立され、ブラウザーが要求を送信します。
- 5. Tomcatが要求を受信すると、パスに従って対応する処理クラスに一致するDispatcherServletが存在します。
- 6.処理後の応答はブラウザに送信され、ブラウザはデータを表示する責任があります
- 7. HttpServletは、基盤となるTCPおよびその他の関連するネットワークロジックを気にする必要はありません。HttpServletRequestから要求パラメーターを取得し、ビジネスロジックの後で、処理されたデータをHttpServletResponseに書き込むだけです。
さらに、サーブレットに関するいくつかの知識ポイントを記録します。HttpServletResponseに応答データを書き込むときに、ブラウザがリダイレクトするか転送するかを指定できます。
- 1.リダイレクト
ブラウザがURLをリクエストすると、サーバーはデータを処理してブラウザに返した後、アドレスが変更されたことをブラウザに通知します。ブラウザはリクエストを再送信する必要があります。リダイレクトは次のコードで実行されます。
String redirectToUrl = "/xxxx";
// 发送重定向响应:
resp.sendRedirect(redirectToUrl);
ブラウザは次の応答を受け取りました。
HTTP/1.1 302 Found
Location: /xxxx
Locationから返されたURLに従って、新しいリクエストが再度送信されます。次に、ブラウザに2つのリクエストが表示されます。もちろん、リダイレクトは一時的なリダイレクト(302応答)と永続的なリダイレクト(301応答)に分けられます。この2つの違いは、永続的なリダイレクトです。ブラウザはLocationによって送信されたURLを置き換え、次に前のURLが要求されたときに、Locationに対応するURLが直接送信されます。コードを渡す
// HttpServletResponse.SC_MOVED_PERMANENTLY:301
//HttpServletResponse.SC_FOUND:302
resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
resp.setHeader("Location", "/xxxx");
- 2.転送
転送とは、内部転送を指します。サーブレットは、ブラウザから送信された要求を処理するときに、それ自体を処理するのではなく、処理のために別のサーブレットに転送します。コードに実装:
req.getRequestDispatcher("/xxxx").forward(req, resp);
後続のリクエスト処理は、実際には「/ xxxx」に対応するサーブレットに渡されて処理されます。
リダイレクトと比較すると、この転送はサーバーによって内部的にのみ実行されます。ブラウザーの場合、要求は1つだけ送信され、処理自体は行われません。ブラウザーには常に1つのURLしかありません。
最近は毎日充実しています、是非!!!!!次回は、Xiaobai初心者のWeb開発(4つ)の簡単な要約を見ていきます-Webアプリケーション開発におけるMVC