JavaRush /Java Blog /Random-JA /Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート...
Макс
レベル 41

Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 1)

Random-JA グループに公開済み
こんにちは。この記事では、単純な CRUD アプリケーションを作成する過程で、Maven、Spring、Hibernate、MySQL、Tomcat などに初めて遭遇したことを共有したいと思います。これは 4 の最初の部分です。この記事は主に、ここですでに 30 ~ 40 のレベルを完了しているが、まだ純粋な Java を超えて冒険をしていなく、オープンワールドに参入し始めたばかり (またはこれから始めようとしている) 人を対象としています。これらすべてのテクノロジー、フレームワーク、その他の聞きなれない言葉。 Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 1) - 1

コンテンツ:

導入

私は、それが使用されているさまざまな例を調べることで、新しいテクノロジーやフレームワークについて学び始めました。通常、何かを最もよく理解するには、本格的なアプリケーションの例を使用して実際に動作しているのを見るからです。通常、このような例はCRUDアプリケーション ( CreateReadUpdateDelete ) であり、インターネットにはさまざまな複雑さのこのような例が溢れています。問題は、通常、そこでどのように、何が、なぜ行われたのか、なぜこれこれの依存関係が追加されたのか、なぜこれこれのクラスが必要なのかなどについて詳しく説明していないことです。ほとんどの場合、彼らは、最終 POM ファイルとクラスの最終バージョンを備えた、完全に完成したアプリケーションを取得し、経験豊富な人にとっておそらく明らかと思われる小さな事柄には焦点を当てずに、単純に各アプリケーションを実行します。私はそのような例をたくさん見てきましたが、通常、すべてがどのように機能するかは明らかですが、どのようにしてこのような結果に至ったのかは完全には明らかではありません。したがって、このような例は、経験豊富な開発者の立場からではなく、Spring や Hibernate などを扱ったことのない初心者の立場から役立つと判断しました。
Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 1) - 2
最も単純な Hello World レベルから始めて、CRUD アプリケーションを作成するプロセス全体を (私の理解が許す限り) できるだけ詳しく説明しようとします。まず第一に、私は自分自身のためにこれを行っています。なぜなら、何かを説明したり、伝えたり、説明しようとすると、頭の中でよりよく吸収され、整理されるからです。しかし、これが誰かにとって役に立ち、何かを理解するのに役立つのであれば、私はとてもうれしいです。この例では、 MavenTomcatSpringHibernate 、およびMySQLを使用して単純な CRUD アプリケーションを作成してみましょう。MavenMySQLのインストール、アイデアのUltimateバージョンの使用などの準備手順。詳しく説明する必要はないと思いますが、これで問題ないと思います。この例では、xml を使用せずに Java クラス (JavaConfig と呼ばれる) を使用して構成が構成されることに注意してください。

プロジェクトの作成

したがって、私は初心者なので、あいまいなアーキタイプは使用しません。Spring Initializr はまだ怖く聞こえます。したがって、最も一般的な単純な Maven プロジェクトを作成します。私はドメイン名を持っていないので、groupid には と書きtestgroup、artifactid にはたとえば名前を書きますfilmography(これは映画のリストになります)。私たちはプロジェクトを作成し、Enable auto-importアイデアが提案されたときに選択します。このおかげで、POM ファイル (プロジェクト オブジェクト モデル、このファイルは Maven プロジェクトの全体構造を記述します) に変更を加えるたびに、すべてが即座にプロジェクトに自動的に適用されます。ライブラリは、すでにローカル リポジトリがある場合はローカル リポジトリから取得されます。または、これまでに扱ったことのない新しい依存関係を使用する場合は、Maven は中央リポジトリからインターネット経由でライブラリをダウンロードするだけです。Maven には、ソースとドキュメントをダウンロードする機能もあります (Download Sources および/または Documentation)。また、クラスやメソッドで不明な点がある場合は、ソース コードにアクセスして内部でどのように動作するかを確認できるため、非常に便利です。いくつかの詳細を追加しましょう。これは Web アプリケーションであり、Tomcatを使用します。アプリケーションを Tomcat にデプロイするには、アプリケーションを war アーカイブ (Web アプリケーション リソース、Web アプリケーション用の特別な形式) の形式で転送する必要があります。これを行うには、アプリケーションが war アーカイブにコンパイルされるように、次の行を POM ファイルに追加します。
<packaging>war</packaging>
Web ソース用の特別なディレクトリも必要になります。この場合、 JSPページといくつかの Web リソース が存在します。mainディレクトリを作成しましょうwebapp。これは標準の Maven ディレクトリ構造であるため、正確にそのmainように呼ばれ、 とまったく同じ方法で配置される必要があります。パッケージをインストールし、これが Web プロジェクトであると判断すると、ディレクトリは自動的に Web アプリケーション ソースとしてマークされ (青い点が表示されます)、Web に関連するすべてのものがこのフォルダー内で検索されます。そして一瞬。デフォルトでは、Maven は言語バージョン 1.5 を使用しますが、たとえばバージョン 1.8 - Java 8 を使用したいと考えています (10 または 11 を選択できますが、そこから先の機能を使用する予定はないため、8 にします) )。これは非常に簡単に解決できます。Google で「Maven java 8」のようなものを記述し、Maven が必要なバージョンのクラスをコンパイルできるように、POM ファイルに何を追加する必要があるかを確認します。その結果、次のことがわかります。 javaresourceswarwebappMaven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 1) - 3

Spring MVC接続

どこかから始めなければなりません。計画によれば、データベースに接続して Hibernate を使用することになりますが、現時点ではこれは少し怖すぎるように思えます。まずはもっと単純なことをする必要があります。Spring MVC、これはすでに優れています。私たちは長い間 MVC パターンに慣れており、コースの大規模なタスクの半分で使用されました。ここからダンスが始まります。Spring MVC で Web アプリケーションを作成するには、Servlet-API も必要です。それは、要求と応答の相互作用の助けを借りて行われます。これを接続してみます。Google にアクセスし、 Maven リポジトリで必要な依存関係を探し、それらを に追加しますpom.xml「外部ライブラリ」セクションでは、 spring-webmvcだけでなく、他の多くのものもロードされているMaven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 1) - 4ことがわかります。それらの。Spring corecontextBeanなどの依存関係を追加で含める必要はありません。必要なものはすべてspring-webmvcとともにプルアップされました。

ちょっとした免責事項を述べておく必要があります。通常、既に追加されているライブラリとバンドルされている場合でも、使用するライブラリごとに依存関係を個別に追加することをお勧めします。これは、いくつかの問題や不具合を回避するのに役立ちます。

簡単な例です。ある API を使用する依存関係を追加し、同時にこの API の何らかの実装をプルアップするとします。次に、同じ API を使用する別の依存関係を追加し、その実装の一部も取得しましたが、今回は異なります。したがって、同じ API の 2 つの異なる実装が存在することになります。そして、私たち自身がこの API のいくつかのメソッドをどこかで使用したい場合、問題が発生します。システムはどの実装を使用するかを認識せず、おそらく私たちが期待したものではなく、ランダムに選択するためです。また、いずれかの実装の依存関係を明示的に指定した場合は、その依存関係が優先されます。

ただし、これはそれほど厳密な推奨事項ではなく、主に、さまざまな企業のさまざまなライブラリが使用される大規模なプロジェクトに適用されます。POM ファイルを過度にロードしないように、ここではこれを行いません。問題は発生しないと予想されます。しかし、それでも、このことを心に留めておく価値はあります。

もう一つメモ。provided依存とはどういう意味ですかjavax.servlet-api? スコープは依存関係の範囲です。providedこれは、依存関係がアプリケーションのコンパイルとテストの段階で利用可能になりますが、アーカイブされないことを意味します。実際、アプリケーションをデプロイするにはサーブレット コンテナである Tomcat を使用します。Tomcat にはすでにそのようなライブラリが含まれているため、それらをそこに転送してアーカイブに不必要な負荷をかける必要はありません。将来に向けて、同じ理由で通常の方法を使用せずに実行しますmain。これは、Tomcat 内にすでに存在するためです。

ページとコントローラーの作成

今度は簡単なものを作ってみましょう。まず、ビューを保存するwebapp追加のディレクトリ (例: )を作成しましょう。pagesjsp ページを作成し、いくつかのページを作成します。将来的には映画のリストを表示するページが必要になります。たとえばfilms.jsp、編集用に別のページを作成することもできますeditPage.jsp。今のところ深刻なことは何も入力しません。テストのために、あるページから別のページへのリンクを作成します。 次に、リクエストを処理するクラスが必要です。コントローラ。新しいパッケージを追加しcontroller、その中にクラスを作成しましょうFilmController(一般に、すべてを別のパッケージにパッケージ化する必要はありません。このアプリケーションは非常に小さくてシンプルですが、通常のプロジェクトには多くのコントローラー、構成クラス、モデルが存在する可能性があります) 、など、小さなプロジェクトから始める場合でも、混乱がないよう、すべてを秩序正しく構造化された方法で行うことにすぐに慣れることをお勧めします)。このクラスでは、リクエストに応じてビューを返すメソッドを作成します。
package testgroup.filmography.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class FilmController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView allFilms() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("films");
        return modelAndView;
    }

    @RequestMapping(value = "/edit", method = RequestMethod.GET)
    public ModelAndView editPage() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("editPage");
        return modelAndView;
    }
}
ポイントは何ですか?Spring MVC には と呼ばれるものがありますDispatcherServlet。これはメイン コントローラーと似ており、すべての受信リクエストがそれを通過し、特定のコントローラーに渡されます。アノテーションは@ControllerSpring MVC にこのクラスがコントローラーであることを伝えるだけであり (まあ、一般に論理的ですが)、ディスパッチャーはアノテーションをチェックして@RequestMapping適切なメソッドを呼び出します。アノテーションを使用すると、@RequestMappingコントローラー メソッドのアドレスを設定でき、それによってクライアント (ブラウザー) で使用できるようになります。これをコントローラー クラスに適用して、いわばすべてのメソッドのルート アドレスを設定することもできます。このメソッドのallFilms()パラメータはvalue「 」に設定されているため、ブラウザにhttp://host:port//の組み合わせが入力されるとすぐに呼び出されます(つまり、デフォルトではhttp://localhost:8080/またはhttpです)。://127.0 .0.1:8080/ )。このパラメータは、サポートされるリクエストのタイプ (GET、POST、PUT など) を指定します。ここではデータを受け取るだけなのでGETを使います。その後、追加および編集するメソッドが表示されると、すでに POST リクエストが存在します。(ちなみに、メソッドを示すアノテーションの代わりに、 アノテーション などを同等に使用することもできます) ) 。このメソッドでは、オブジェクトを作成し、返す必要があるビューの名前を設定します。 method@RequestMapping@GetMapping@PostMapping@GetMapping@RequestMapping(method = RequestMethod.GETModelAndView

構成

構成の設定に進みましょう。パッケージ内にconfigクラスを作成しましょうWebConfig。型のオブジェクトを返すメソッドが 1 つだけありますViewResolver。これは、名前で表現を見つけるのに必要なインターフェイスです。
package testgroup.filmography.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "testgroup.filmography")
public class WebConfig {

    @Bean
    ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}
@Configurationこのクラスが構成クラスであり、beanコンポーネントの定義と依存関係が含まれていることを Spring に伝えます。Bean はSpring によって管理されるオブジェクトです。アノテーションは Bean を定義するために使用されます@Bean@EnableWebMvcから Spring MVC 設定をインポートできますWebMvcConfigurationSupport。たとえば、WebMvcConfigurer多数のメソッドを備えたインターフェイスを実装し、すべてを好みに合わせてカスタマイズすることもできますが、ここではまだ詳しく説明する必要はありません。標準設定で十分です。 @ComponentScanSpring に管理すべきコンポーネントをどこで探すかを指示します。アノテーションまたはその派生クラス ( 、、@Componentなど)でマークされたクラス。これらのアノテーションは、クラス Bean を自動的に定義します。このメソッドでは、その実装を作成し、 の表現を正確に検索する場所を決定します。したがって、コントローラー メソッドで名前 " " を設定すると、ビューは " " として検出されます。したがって、構成クラスがありますが、今のところ、これはある種の別のクラスにすぎず、アプリケーションにはまったく影響しません。 。この設定を Spring コンテキストに登録する必要があります。このためにはクラスが必要です。パッケージ内で、その後継となるAppInitializerを作成し、そのメソッドを実装します。 @Controller@Repository@ServiceviewResolver()webappfilms/pages/films.jspAbstractAnnotationConfigDispatcherServletInitializerconfig
package testgroup.filmography.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}
最後のメソッドはアドレスを登録します。構成クラスを登録するにはさらに 2 つのメソッドがあります。ViewResolverなどが定義されているWeb 設定は、 に配置されますgetServletConfigClasses()。これらすべてについてはドキュメントやさまざまなガイドを読んだほうがよいでしょうが、私たちの場合はまだこれを詳しく調べる必要はありません。WebConfig原則として、私たちのものRootClassesは両方で定義でき、両方を一度に定義することもできます。それでも機能します。もう一つ。フォームからロシア語の文字を含む値を送信すると、結果が走り書きになる場合、エンコードに問題がある可能性があります。この問題を解決するには、リクエストを前処理するフィルターを追加します。AppInitializerクラスに移動し、メソッドをオーバーライドしますgetServletFilters。このメソッドで目的のエンコーディングを指定します。もちろん、ページやデータベースなど、他の場所と同じである必要があります。
protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[] {characterEncodingFilter};
    }
すべてがセットアップされているようです。実行して何が起こるか確認してください。 「実行」 -> 「実行」 -> 「構成の編集」 -> 「新しい構成の追加」 -> 「Tomcat サーバー」 -> 「ローカル」 次に、デプロイするアーティファクトを選択する必要があります。アイデア自体がヒントになります。警告: デプロイメント用にマークされたアーティファクトはありません[修正]ボタンをクリックし、[...: war Exploded]を選択します。または、 「デプロイメント」 -> 「追加」 -> 「アーティファクト」 -> 「...: war Exploded」に移動することもできます。 Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 1) - 5また、「Deployment」に移動して、 「Applecation context」フィールド(これは、アプリケーションがブラウザーで使用できる URL アドレスの一部になります) を「」に設定する必要があります/Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 1) - 6そうすれば、アプリケーションはhttp://localhost:8080/ですぐに利用できるようになります(ただし、そこで何かを指定することもできます。たとえば、「/filmography」です。その後、これをすべてのアドレスに追加するだけです。つまり、たとえば、" http://localhost:8080/edit"ですが、 "http://localhost:8080/filmography/edit"になります)。「実行」をクリックし、開始するまで待ちます。私が得たものは次のとおりです。 Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 1) - 7すべて問題ないようですが、注意点が 1 つあります。実際、私たちのページは現在公開されており、アドレス バーにパスを書き込むことで直接アクセスできます。http://localhost:8080/pages/films.jspと入力すると、コントローラーが知らないうちにページを受信しました。これはどういうわけかあまり正しくないので、webapp特別なディレクトリを作成しますWEB-INF。内部にあるものは一般公開されず、コントローラーを介してのみアクセスできます。pagesビュー ( ) を含むディレクトリを に配置しWEB-INFViewResolverそれに応じてプレフィックスに追加します。
viewResolver.setPrefix("/WEB-INF/pages/");
これでhttp://localhost:8080 にページが表示されましたが、http://localhost:8080/WEB-INF/pages/films.jspに直接アクセスしようとすると404 エラーが発生します。最も単純な Web アプリケーション、いわゆる Hello World です。現在のプロジェクト構造は次のようになります。
Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 1) - 8

モデル

すでにビューとコントローラーがありますが、MVC には 3 番目の文字もあるので、図を完成させるためにモデルも追加します。パッケージ内で、たとえば次のフィールドをmodel持つクラスを作成しましょう: 、(タイトル)、(リリース年)、(ジャンル)、(つまり、この映画をすでに視聴したかどうか)。 Filmint idString titleint yearString genreboolean watched
package testgroup.filmography.model;

public class Film {
    private int id;
    private String title;
    private int year;
    private String genre;
    private boolean watched;
// + Getters and setters
}
特別なものは何もなく、通常のクラス、プライベートフィールド、ゲッターとセッターです。このようなクラスのオブジェクトはPOJO(Plain Old Java Object) とも呼ばれます。「単純な Java オブジェクト」。このようなオブジェクトを作成してページに表示してみましょう。今のところ、作成方法と初期化方法についてはあまり心配しません。これを試してみるには、たとえば次のように、愚かにもコントローラ内に直接作成してみましょう。
public class FilmController {
    private static Film film;

    static {
        film = new Film();
        film.setTitle("Inception");
        film.setYear(2010);
        film.setGenre("sci-fi");
        film.setWatched(true);
    }
そして、ModelAndViewメソッドを使用してこのオブジェクトを私たちのオブジェクトに追加しますaddObject
@RequestMapping(method = RequestMethod.GET)
    public ModelAndView allFilms() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("films");
        modelAndView.addObject("film", film);
        return modelAndView;
    }
これで、このオブジェクトをページに表示できるようになりました。Hello World の代わりにとfilms.jsp書き${film}、属性名「film」に対応するオブジェクトがここに置き換えられます。これを実行して何が起こったのか見てみましょう (オブジェクトの明確な出力のために、クラスがFilm再定義されましたtoString())。
Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 1) - 9

モデル-ビュー-コントローラー

この段階で、すでに本格的な Spring MVC アプリケーションが完成したように見えます。次に進む前に、すべてをもう一度見て、すべてがどのように機能するかを理解することをお勧めします。インターネット上では、これに関する多くの写真や図が見つかります。私はこれが好きです。
Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 1) - 10
ブラウザー行にリクエストを書き込むと、リクエストは受け入れられDispatcher Servlet、このリクエストを処理するのに適したコントローラーが見つかりますHandlerMapping(これはコントローラーを選択するためのインターフェースであり、利用可能なコントローラーのどれにそのようなアドレスを受け入れるメソッドがあるかを確認します)。 、適切なメソッドを呼び出してControllerビューに関する情報を返します。その後、ディスパッチャーはViewResolver'a を使用して目的のビューを名前で見つけます。その後、モデル データがこのビューに転送され、出力としてページが取得されます。このようなもの。 続く... Maven、Spring、MySQL、Hibernate および最初の CRUD アプリケーションの紹介 (パート 1) Maven、Spring、MySQL、Hibernate および最初の CRUD アプリケーションの紹介 (パート 2) Maven、Spring、MySQL、Hibernate および最初の CRUD アプリケーション (パート 3) Maven、Spring、MySQL、Hibernate および最初の CRUD アプリケーションの概要 (パート 4)
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION