Struts についての理解を話してください。
struts は、MVC パターンに従って設計された Web 層フレームワークであり、実際にはサーブレットです。このサーブレットは、ActionServlet、または ActionServlet のサブクラスと呼ばれます。 (推奨される調査: Java インタビューの質問)
web.xml ファイル内の特定の特性を満たすすべてのリクエストをこのサーブレットに渡して処理することができ、このサーブレットは設定を参照します。各リクエストは、処理のために異なるアクションに割り当てられます。
(Struts は複数の設定ファイルを持つことができ、各設定ファイルはモジュールに応じて設定できるため、設定ファイルの過度の拡張を防ぐことができます)
2. ActionServlet はリクエストをアクションに渡します。以前は、リクエスト パラメータは formbean オブジェクト (つまり、Java クラス、このクラスの各属性はリクエスト パラメータに対応します)
3 にカプセル化されていました。ActionServlet は formbean オブジェクトを渡すことに注意してください。アクションに追加されます。実行メソッドの前に、検証のために formbean の validate メソッドが呼び出される場合があります。検証に合格した後でのみ、formbean オブジェクトがアクションの実行メソッドに渡されます。それ以外の場合は、エラー ページが返されます。このエラー ページは、 input 属性で指定します。
4. アクションが実行されると、表示された結果ビューが返されます。この結果ビューは、ActionForward オブジェクトによって表されます。actionForward オブジェクトは、struts-config.xml の構成を通じて JSP ページに関連付けられます設定ファイル。
プログラムは struts-config.xml 構成ファイル内の JSP ページに設定された論理名を使用するため、これにより、アクション プログラム コードと返される JSP ページ名を分離できます。
(上記では、自分自身の使用経験に基づいて自分の意見について話すこともできます)
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 を使用した際の面倒な経験に基づいて、休止状態についての感想を話すこともできます)
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 つの要素を構成するだけで済みます。
(上記については、自分の経験に基づいた意見を話すこともできます)
Struts の長所と短所について話す
利点:
1. 明確な構造を持つ MVC パターンを実装することで、開発者はビジネス ロジックの実装のみに集中できるようになります。利用できるタグが豊富で、Strutsタグライブラリ(Taglib)を柔軟に活用すれば、開発効率が大幅に向上します
3. ページナビゲーションにより、システムのコンテキストがより明確になります。設定ファイルを通じてシステム全体の各部のつながりを把握することができ、後のメンテナンスに非常に役立ちます。この利点は、別の開発者グループがプロジェクトを引き継ぐ場合にさらに明らかになります。
4. 例外処理メカニズムを提供します。
5. データベース接続プールの管理
6. I18N
をサポートします。欠点:まず、表示層に移動するときに、転送を設定する必要があります。表示層に 10 個の JSP がある場合、struts を 10 回設定する必要がありますが、これには、ディレクトリやファイルの変更は含まれません。注意: 構成を変更するたびに、プロジェクト全体を再デプロイする必要があり、Tomcate のようなサーバーを再起動する必要があります。
次に、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 の式言語は、コレクションとインデックスのプロパティの処理が非常に弱いです。
七、アクションの実行制御が難しい Struts でアクションを作成する場合、その実行順序を制御するのは非常に困難です。機能要件を実現するには、サーブレットを書き直す必要がある場合もあります。
八、アクション実行前後の処理 Strutsはアクション処理時にクラスベースの階層を利用しており、アクション処理前後の操作が難しいです。
9. イベントのサポートが不十分です。Struts では、フォームは実際に Action クラス (または DispatchAction) に対応します。つまり、Struts では、フォームは実際に 1 つのイベントにのみ対応します。Struts このイベント メソッドは、アプリケーション イベントはアプリケーション イベントと呼ばれます。コンポーネント イベントと比較すると、アプリケーション イベントは粒度の粗いイベントです。
iBatis と Hibernate の違いは何ですか?同じ点: Shield the jdbc api を処理せずにデータにアクセスできるように、jdbc api の基礎となるアクセスの詳細を確認します。
jdbc API プログラミング プロセスは修正されており、SQL ステートメントと Java コードが混合されています。多くの場合、SQL ステートメントを結合する必要があり、詳細は非常に面倒です。
ibatis の利点: jdbc API の基礎となるアクセスの詳細を保護します。SQL ステートメントを Java コードから分離します。エンティティ オブジェクトとオブジェクトのコレクションと呼ばれる結果セットを自動的にカプセル化する機能を提供します。queryForList はオブジェクトのコレクションを返します。 queryForObject は単一のオブジェクトを返します。エンティティ オブジェクトのプロパティを SQL ステートメントに自動的に渡すパラメーターを提供します。
Hibernate は、完全に自動化された ORM マッピング ツールです。SQL ステートメントを自動的に生成できます。Ibatis では、XML 構成ファイルに SQL ステートメントを自分で記述する必要があります。Hibernate は、ibatis よりもはるかに責任があり、強力です。 Hibernate は SQL ステートメントを自動的に生成するため、ステートメントを制御することはできず、具体的で効率的な SQL を作成することもできません。
それほど複雑ではない SQL クエリの場合、休止状態を使用すると完了することができます。ただし、特に複雑なクエリの場合、休止状態に適応するのは困難です。現時点では、ibatis を使用するのが良い選択です。ibatis はまだ自分たちによって制御されているためです。 SQL文を書きます。
休止状態で複数テーブルのクエリを実行する場合、各テーブルから複数のフィールドを取得するにはどうすればよいですか?つまり、クエリ結果セットには対応するエンティティ クラスがありません。この問題を解決するにはどうすればよいですか?
解決策 1: Object[] データに従ってデータを取り出し、自分で Bean を形成します
解決策 2: 各テーブルの Bean のコンストラクターを作成します。例: テーブル 1 2 つのフィールド field1 と field2 を検索すると、Bean(type1 filed1, type2 field2) というコンストラクターがあり、この Bean を HQL で直接生成できます。
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 が現在のデータベース内のデータを変更しないようにするため、キャッシュされたデータがデータベース内の実際のデータと不一致になります。
JDO とは何ですか?
JDO は、Java オブジェクト永続性の新しい仕様です。Java データ オブジェクトの略語であり、一部のオブジェクトへのアクセスに使用されるデータ ウェアハウスでもあります。データの種類。 のオブジェクト用の標準化された API。 JDO は透過的なオブジェクト ストレージを提供するため、開発者はデータ オブジェクトを保存するために追加のコード (JDBC API の使用など) を必要としません。
これらの退屈な日常的なタスクは JDO 製品プロバイダーに移管され、開発者はビジネス ロジックに時間と労力を集中できるようになりました。さらに、JDO は基盤となるあらゆるデータ上で実行できるため、柔軟性があります。
比較: JDBC はリレーショナル データベース (RDBMS) 専用です。JDO はより汎用的で、リレーショナル データベース、ファイル、XML およびオブジェクト データベース (ODBMS) などのあらゆるデータの基礎となるストレージ機能を提供します。アプリケーションはよりポータブルになり、より強力になります。
Hibernate の 1 対多の双方向関連付けと多対多の双方向関連付けの違いは何ですか? ?
1 対多の関連マッピングと多対 1 の関連マッピングの基本原則は同じです。つまり、多の端に外部キーを追加して、多の端にある外部キーをポイントします。主な違いは、メンテナンス面が異なることです。
違いは、維持される関係にあります。
1 対多の関連付けマッピングは、一方の端からデータをロードする一方で、多数の端から複数のデータのペアをロードすることを指します。連想マッピングとは、一方の端のデータをロードしながら、一方の端のデータもロードすることを意味します。
Hibernate はどのように読み込みを遅延させますか?
1. Hibernate2 遅延読み込みの実装: a) エンティティ オブジェクト b) コレクション (コレクション)
2. Hibernate3 は属性の遅延ロード機能を提供します. Hibernate がデータをクエリするとき、データはメモリ上に存在しませんが、プログラムが実際にデータを操作するとき、オブジェクトはメモリ上に存在するため、遅延ロードが実現されます。サーバーのメモリ オーバーヘッドが節約されるため、サーバーのパフォーマンスが向上します。
以上がJava フレームワークの面接での質問 (1)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。