1. Struts についての理解を話してください
(推奨されるその他の関連する面接の質問: Java 面接の質問と回答)
1. Struts は MVC パターンに従って設計された Web 層フレームワークであり、実際には Servlet であり、この Servlet は ActionServlet、または ActionServlet のサブクラスと呼ばれます。 web.xml ファイル内の特定の特性を満たすすべてのリクエストをこのサーブレットに渡して処理することができ、このサーブレットは構成ファイルを参照して、各リクエストを処理するさまざまなアクションに割り当てます。
(Struts は複数の設定ファイルを持つことができ、各設定ファイルはモジュールに応じて設定できるため、設定ファイルの過度の拡張を防ぐことができます)
2. ActionServlet はリクエストをアクションに渡します。以前は、リクエスト パラメータは formbean オブジェクト (つまり、Java クラス、このクラスの各属性はリクエスト パラメータに対応します) にカプセル化されていました。
3. ActionServlet は formbean を渡すことに注意してください。オブジェクトをアクションに渡す 実行メソッドの前に、検証のためにフォームビーンの検証メソッドを呼び出すことができます。検証に合格した後でのみ、フォームビーン オブジェクトはアクションの実行メソッドに渡されます。それ以外の場合は、エラー ページが返されます。このエラー ページは、 input 属性で指定します。
4. アクションが実行された後、表示された結果ビューが返される必要があります。この結果ビューは、ActionForward オブジェクトによって表されます。actionForward オブジェクトは、struts-config の構成を通じて JSP ページに関連付けられます。これは、プログラムが struts-config.xml 構成ファイル内の JSP ページに設定された論理名を使用するため、アクション プログラム コードと返された JSP ページ名を分離できるためです。
(上記では、自分の経験に基づいた自分の意見について話すこともできます)
2. Hibernate についての理解を話します。
1. オブジェクト指向ソフトウェアの内部操作プロセスは、さまざまな新しいオブジェクトを絶えず作成し、オブジェクト間の関係を確立し、オブジェクト メソッドを呼び出して各オブジェクトのステータスを変更したりオブジェクトの消滅を行ったりするプロセスとして理解できます。 , プログラムの処理や動作は何であれ、本質的には結果を得ることが目的であり、直前の瞬間と次の瞬間のプログラムの実行結果の差がオブジェクトの状態の変化として反映されます。記憶の中で。
2. プログラムがシャットダウンされてメモリ領域が不足した場合に、プログラムの実行状態を維持するには、メモリ上のオブジェクトの状態を永続化デバイスに保存し、オブジェクトの状態を復元する必要があります。通常、大量のオブジェクト情報を保存するために、これらはすべてリレーショナル データベースに保存されます。 Java プログラムの実行機能の観点から見ると、オブジェクトの状態を保存する機能は、システム操作の他の機能に比べて非常に目立たない補助的な機能であるはずです。Java はこの機能を実装するために jdbc を使用しますが、この目立たない機能には記述が必要です。大量のコードがあり、実行するのはオブジェクトの保存とオブジェクトの復元だけであり、これらの大量の JDBC コードには技術的な内容は含まれておらず、基本的に一連の日常的な標準コード テンプレートを使用して記述されています。繰り返しの作業。
3. Java プログラムの実行中に生成されたオブジェクトとリカバリ オブジェクトをデータベースに保存すると、実際には、Java オブジェクトとリレーショナル データベース レコード間のマッピング関係が実現され、これは ORM (つまり、Object RelationMapping) と呼ばれます。この機能を実装するには JDBC コードが使用され、カプセル化された製品は ORM フレームワークと呼ばれ、Hibernate は人気のある ORM フレームワークの 1 つです。 Hibernate フレームワークを使用すると、JDBC コードを記述する必要がありません。save メソッドを呼び出すだけで、オブジェクトをリレーショナル データベースに保存できます。get メソッドを呼び出すだけで、データベースからオブジェクトをロードできます。
4. Hibernate を使用する基本プロセスは、Configuration オブジェクトの構成、SessionFactory の生成、セッション オブジェクトの作成、トランザクションの開始、CRUD 操作の完了、トランザクションの送信、およびセッションの終了です。
5. Hibernate を使用する場合は、まず hibernate.cfg.xml ファイルを設定する必要があります。このファイルはデータベース接続情報やダイアレクトなどを設定し、各エンティティ、hibernate に対応する hbm.xml ファイルも設定します。 .cfg.xml 各 hbm.xml ファイルをファイルに登録する必要があります。
6. Hibernate を適用する場合、セッション、カスケード、遅延読み込み、HQL クエリのキャッシュ原理を理解することが重要です。
(上記では、JDBC を使用した際の面倒な経験に基づいて、休止状態についての感想を話すこともできます)
3 番目に、Spring についての理解を話します。
1. Spring はファクトリ パターンを実装するファクトリ クラスです (ここでファクトリ パターンが何であるかを明確に説明する必要があります)。このクラスは BeanFactory と呼ばれます (実際にはインターフェイス)。 、通常は BeanFactory サブクラス ApplicationContext です。 Spring は大規模なファクトリ クラスに相当し、その構成ファイルでは、インスタンス オブジェクトの作成に使用されるクラス名とインスタンス オブジェクトのプロパティが
2. Spring は IOC を適切にサポートします。IOC はプログラミングのアイデアであり、アーキテクチャ技術です。このアイデアは、モジュール間の適切な分離を実現するために使用できます。IOC は DI (Depency Injection) とも呼ばれます。
3. Spring は、AOP テクノロジの優れたカプセル化を提供します。AOP はアスペクト指向プログラミングと呼ばれます。これは、システム内に無関係なクラスのメソッドが多数あることを意味します。特定のシステム関数のコードを、これらの多くのメソッドに追加する必要があります。 as 、ロギングの追加、許可判定の追加、例外処理の追加 このアプリケーションは AOP と呼ばれます。
AOP 関数はプロキシ テクノロジを使用して実装されています。クライアント プログラムはターゲットを呼び出すのではなく、プロキシ クラスを呼び出します。プロキシ クラスとターゲット クラスは外部的に同じメソッド ステートメントを持ちます。実現するには 2 つの方法があります。同じメソッド ステートメント。1 つは同じインターフェイスを実装するもので、もう 1 つはターゲットのサブクラスとして実装するものです。
JDK では、Proxy クラスを使用して動的プロキシを生成し、インターフェイスの実装クラスを生成しますが、特定のクラスのサブクラスを生成したい場合は、CGLI B を使用できます。生成されたプロキシ クラスのメソッドに、システム関数とターゲット クラスを呼び出す対応するメソッドを追加します。システム関数のプロキシは Advice オブジェクトとして提供されます。プロキシ オブジェクトを作成するには、少なくともターゲット クラスとアドバイスクラスは必須です。 Spring はこのサポートを提供しており、プロキシ機能と AOP 機能を実装するには、Spring 構成ファイルでこれら 2 つの要素を構成するだけで済みます。
(上記については、ご自身の使用経験に基づいた意見でも構いません)
4. Struts の長所と短所について話す
利点:
1. 明確な構造で MVC モデルを実装するため、開発者はビジネス ロジックの実装のみに集中できます。
2. 豊富なタグが利用可能です。Struts タグライブラリ (Taglib) を柔軟に使用できれば、開発を大幅に改善できます 効率
3. ページ ナビゲーションにより、システムのコンテキストがより明確になります。設定ファイルを通じてシステム全体の各部のつながりを把握することができ、後のメンテナンスに非常に役立ちます。この利点は、別の開発者グループがプロジェクトを引き継ぐ場合にさらに明らかになります。
4. 例外処理メカニズムを提供します。
5. データベース接続プールの管理
6. I18N
をサポートします。欠点:
1 , 表示層に切り替えるときは、転送を設定する必要があります。表示層に 10 個の JSP がある場合、Struts を 10 回設定する必要があります。これには、ディレクトリやファイルの変更は含まれません。再度転送を変更する必要があります。構成を変更するたびに、プロジェクト全体を再デプロイする必要があり、Tomcate のようなサーバーも再起動する必要があることに注意してください。
2. Struts のアクションはスレッド セーフ モードである必要があります。 1 つのインスタンスのみがすべてのリクエストを処理できます。したがって、アクションで使用されるすべてのリソースを均一に同期する必要があり、これによりスレッド セーフティの問題が発生します。
3. テストが不便 Struts の各アクションは Web 層と結合しているため、テストが Web コンテナに依存しており、単体テストの実装も困難です。ただし、単体テストを実装できる Junit 拡張ツール Struts TestCase があります。
4. 型変換. Struts の FormBean はすべてのデータを String 型として扱い、型変換にツール Commons-Beanutils を使用できます。ただし、その変換はすべてクラス レベルで行われ、変換タイプは構成できません。型変換中にエラー メッセージをユーザーに返すことも非常に困難です。
5. サーブレットへの依存度が高すぎる Struts は、Action を処理するときに ServletRequest と ServletResponse に依存する必要があるため、Servlet コンテナを取り除くことができません。
6. フロントエンドの表現言語に関しては、Struts は JSTL を統合しているため、主に JSTL 表現言語を使用してデータを取得します。ただし、JSTL の式言語は、コレクションとインデックスのプロパティの処理が非常に弱いです。
7. アクションの実行を制御するのは難しい Struts でアクションを作成する場合、その実行順序を制御するのは非常に困難です。機能要件を実現するには、サーブレットを書き直す必要がある場合もあります。
8. アクションの実行前後の処理 Struts がアクションを処理する場合、クラス階層に基づいて処理が行われるため、アクションの処理前後の操作が困難です。
9. イベントのサポートが不十分です。Struts では、フォームは実際に Action クラス (または DispatchAction) に対応します。つまり、Struts では、フォームは実際に 1 つのイベントにのみ対応します。Struts このイベント メソッドは、コンポーネント イベントと比較して、アプリケーション イベントは粒度の粗いイベントです。
(ビデオ チュートリアルの推奨事項: java コース)
5. の違いは何ですか? iBatis と Hibernate?
同じ点: jdbc api の基礎となるアクセスの詳細をシールドすることで、jdbc api を処理せずにデータにアクセスできるようにします。
jdbc API プログラミング プロセスは修正されており、SQL ステートメントと Java コードが混合されています。多くの場合、SQL ステートメントを結合する必要があり、詳細は非常に面倒です。
ibatis の利点: jdbc API の基礎となるアクセスの詳細を保護します。SQL ステートメントを Java コードから分離します。エンティティ オブジェクトとオブジェクトのコレクションと呼ばれる結果セットを自動的にカプセル化する機能を提供します。queryForList はオブジェクトのコレクションを返します。 queryForObject は単一のオブジェクトを返します。エンティティ オブジェクトのプロパティを SQL ステートメントに自動的に渡すパラメーターを提供します。
Hibernate は、SQL ステートメントを自動的に生成できる、完全に自動化された orm マッピング ツールです。ibatis では、SQL ステートメントを xml 構成ファイルに自分で記述する必要があります。Hibernate は、ibatis よりもはるかに責任があり、強力です。 Hibernate は SQL ステートメントを自動的に生成するため、ステートメントを制御することはできず、具体的で効率的な SQL を作成することもできません。一部のそれほど複雑でない SQL クエリの場合は、休止状態を使用すると完了できます。ただし、特に複雑なクエリの場合、休止状態に適応するのは困難です。現時点では、ibatis を使用するのが良い選択です。ibatis では SQL ステートメントを自分で記述する必要があるためです。 . .
6. 休止状態で複数テーブル クエリを実行し、各テーブルから複数のフィールドを選択します。つまり、クエリ結果セットには、それに対応するエンティティ クラスがありません。この問題を解決するにはどうすればよいですか?
解決策 1: Object[] データに従ってデータを取得し、自分で Bean を作成します
解決策 2: 各テーブル (テーブル 1 など) の Bean のコンストラクターを作成します。 field1 を検索する必要があり、field2 には 2 つのフィールドがあり、Bean(type1filed1,type2 field2) というコンストラクターがあり、この Bean は HQL で直接生成できます。
7. Hibernate の 2 次キャッシュを紹介します
次の考えに従って答えてください:
(1) まず、キャッシュとは何かを明確に説明します
(2) それに、hibernate のセッションは 1 次キャッシュです。つまり、1 次キャッシュがあるのに、なぜ 2 次キャッシュが必要なのでしょうか?
(3) 最後に、 Hibernate の 2 次キャッシュを構成する方法について説明します。
1. キャッシュとは、以前にデータベースからクエリされ使用されたオブジェクトをメモリ (データ構造内) に保存することです。オブジェクトが将来使用される場合、このデータ構造は通常、HashMap または HashMap に似ています。 、最初にこのオブジェクトがキャッシュ内にあるかどうかをクエリし、存在する場合はキャッシュ内のオブジェクトを使用し、存在しない場合はデータベースをクエリし、次回使用するためにクエリされたオブジェクトをキャッシュに保存します。
2. Hibernate のセッションは一種のキャッシュです。通常、これを Hibernate の第 1 レベル キャッシュと呼びます。セッションを使用してデータベースのオブジェクトをクエリする場合、セッションは最初にそれが内部に存在するかどうかもチェックします。このオブジェクトが存在する場合は直接返され、存在しない場合はデータベースにアクセスし、クエリ結果を内部に保存します。
セッションはセッション プロセスを表し、セッションはデータベース接続に関連付けられているため、セッションを長時間開いたままにしないことをお勧めします。通常、セッションは 1 つのトランザクションでのみ使用され、次の時点で閉じる必要があります。取引の終わり。また、Session はスレッドセーフではなく、複数のスレッドで共有すると問題が発生しやすくなります。通常、グローバルな意味でのキャッシュのみが実際のキャッシュ アプリケーションであり、キャッシュ価値が大きいため、Hibernate のセッション レベル キャッシュのキャッシュ機能は明確ではなく、アプリケーション価値は大きくありません。 Hibernate の 2 次キャッシュは、複数のスレッドと複数のトランザクションがこのキャッシュを共有できるように Hibernate のグローバル キャッシュを構成します。私たちが望んでいるのは、ある人が一度使用すると、他の人もそれを使用できるようになることです。
3. 2 次キャッシュは Hibernate から独立したソフトウェア コンポーネントであり、複数のメーカーや組織が EHCache や OSCache などのキャッシュ製品を提供しているサードパーティ製品です。 Hibernate で 2 次キャッシュを使用するには、まず、hibernate.cfg.xml 構成ファイルで使用するメーカーのキャッシュ製品を構成する必要があります。次に、キャッシュ製品独自の構成ファイルを構成する必要があります。最後に、どのエンティティを構成する必要がありますHibernate のオブジェクトを 2 次キャッシュの管理に含める必要があります。 2 次キャッシュの原理を理解し、この考え方を理解すれば、Hibernate の 2 次キャッシュを構成するのは簡単です。
拡張知識: SessionFactory は 2 次キャッシュに関連付けることができます。つまり、2 次キャッシュは 1 つのデータベース内のデータのキャッシュのみを担当できます。Hibernate の 2 次キャッシュを使用する場合は、次の点に注意してください。他のアプリケーションや SessionFactory が現在のデータベース内のデータを変更しないようにするため、キャッシュされたデータがデータベース内の実際のデータと不一致になります。
8. JDO とは何ですか?
JDO は Java オブジェクト永続性の新しい仕様です。Java データ オブジェクトの略語であり、特定のデータ ウェアハウスにアクセスするために使用されるツールでもあります。 . オブジェクトの標準化された API。 JDO は透過的なオブジェクト ストレージを提供するため、開発者はデータ オブジェクトを保存するために追加のコード (JDBC API の使用など) を必要としません。これらの退屈な定型タスクは JDO 製品プロバイダーに移管され、開発者は時間と労力をビジネス ロジックに集中できるようになりました。さらに、JDO は基盤となるあらゆるデータ上で実行できるため、柔軟性があります。
比較: JDBC はリレーショナル データベース (RDBMS) 専用です。JDO はより汎用的で、リレーショナル データベース、ファイル、XML、オブジェクト データベース (ODBMS) などのあらゆるデータの基礎となるストレージ機能を提供します。 .、アプリケーションをよりポータブルにします。
9. Hibernate の 1 対多と多対多の双方向関連付けの違いは何ですか? ?
1 対多の関連マッピングと多対 1 の関連マッピングの基本原則は同じです。つまり、多の端に外部キーを追加して、一方の端の外部キーをポイントします。主な違いは、メンテナンスの終了が異なることです。
違いは、維持される関係にあります:
1 対多の関連付けマッピングは、1 つの端のデータをロードしながら、多くの端のデータをロードすることを指します。マッピングとは、複数の端のデータを同時にロードすることを指し、複数の端のデータをロードし、一方の端のデータを同時にロードします。
10. Hibernate はどのように読み込みを遅延させますか?
1. Hibernate2 の遅延読み込み実装: a) エンティティ オブジェクト b) コレクション (コレクション)
2. Hibernate3 は属性の遅延読み込み機能を提供しますHibernate がデータをクエリするとき、データはメモリに存在しません。プログラムが実際にデータを操作するとき、オブジェクトはメモリに存在するため、遅延読み込みが実現します。これにより、サーバーのメモリ オーバーヘッドが節約され、サーバーのパフォーマンスが向上します。 。 パフォーマンス。
推奨される関連チュートリアル: Java 入門チュートリアル
以上がJava で頻繁に聞かれる基本的な面接の質問—(6)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。