オブジェクト指向の特徴とは?
- 抽象化:抽象化とは、オブジェクトのクラスに共通する特徴を要約してクラスを構築するプロセスのことで、データの抽象化と振る舞いの抽象化の両方を含みます。抽象化とは、オブジェクトがどのような属性と振る舞いを持つかだけに注目することであり、それらの振る舞いの詳細には注目しません。
- 継承:継承とは、既存のクラスから継承情報を取得して新しいクラスを作成することです。継承を行うクラスを親クラス、継承を受けるクラスを子クラスと呼びます。
- カプセル化:カプセル化とは通常、データを操作するメソッドにデータをバインドすることで、データへのアクセスは定義されたインターフェイスを通してのみ可能にすることだと考えられています。カプセル化とは、隠せるものはすべて隠し、最も単純なプログラミング・インターフェースだけを外部に提供することだと言えます。
- ポリモーフィズム:ポリモーフィズムとは、異なるサブタイプのオブジェクトが同じメッセージに対して異なる応答をすることを可能にする機能です。つまり、同じオブジェクト参照で同じメソッドを呼び出すだけで、異なる処理を行うことができます。ポリモーフィズムを実装するために必要なことは2つあります。) メソッドの書き換え、2)。 オブジェクトのモデリング
、アクセス修飾子public、private、protected、書かれていない場合の違いは?
、Stringは最も基本的なデータ型ですか?
Javaには、byte、short、int、long、float、double、char、booleanの8つの基本データ型しかありません。
float f=3.4; は正しいですか?
3.4は倍精度数であり、倍精度型を浮動小数点型に代入することは、精度を落とすダウン変換になります。
short s1 = 1; s1 = s1 + 1; Is there mistake? short s1 = 1; s1 += 1; Is there mistake?
short s1 = 1; s1 = s1 + 1; の場合、1はint型なので、s1 + 1の結果もint型になり、shortに代入するために強制的な型変換が必要になります。また、short s1 = 1; s1 += 1;は、s1 += 1;はs1 = ;と等価であり、強制型変換が暗示されているため、正しくコンパイルできます。
intとIntegerの違いは何ですか?
Javaは、ほぼ純粋なオブジェクト指向プログラミング言語ですが、プログラミングの利便性のためか、基本データ型が導入されましたが、これらの基本データ型をオブジェクトとして操作できるようにするため、Javaでは、基本データ型ごとに対応するラッパー型を導入しており、intのラッパークラスはIntegerであり、Java 5以降では、オートボックス/アンボックスの仕組みの導入によりこの2つは相互に変換できます。
class AutoUnboxingTest { public static void main(String[] args) { Integer a = new Integer(3); Integer b = 3; // 3 を Integer 型にオートボックスする int c = 3; System.out.println(a == b); // false つの参照は同じオブジェクトを参照しない System.out.println(a == c); // true a自動的にint型にアンボックスされ、cと比較される。 }}
public class Test03 { public static void main(String[] args) { Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150; System.out.println(f1 == f2); System.out.println(f3 == f4); }}
まず、f1, f2, f3, f4の4つの変数はIntegerオブジェクトの参照なので、次の==演算は値の比較ではなく、参照の比較であることに注意しなければなりません。ボックス化の本質とは?Integer オブジェクトに int 値が代入されると、Integer クラスは static メソッド valueOf
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i);}
&と&&の違いは?
どちらも演算子の左端と右端のブール値が真である必要がありますが、&&の左側の式が偽の場合、右側の式は式から短絡され、演算が実行されないため、&&は短絡演算と呼ばれます。多くの場合、&&の代わりに&&を使用する必要があるかもしれません。例えば、ユーザーのログインを検証して、ユーザー名がnullでなく、空文字列でないことを判断する場合、次のように記述します!= null &&!username.equals("")、2つの順序を交換することはできません、さらに最初の条件が有効ではないため、&演算子を使用することはできません、それは文字列の等しい比較することはできません、それ以外の場合はNullPointerException例外を生成します!NullPointerExceptionがスローされます。注:論理演算子または演算子と短絡演算子または演算子の違いは同じです。
メモリのスタック、ヒープ、静的領域の使用法を説明しなさい。
スタック空間は最も高速に操作できますが、スタックは非常に小さく、通常は多数のオブジェクトがヒープ空間に置かれます。
String str = String("hello");
上記の文では、変数strがスタックに置かれ、newで生成された文字列オブジェクトがヒープに置かれ、リテラル "hello "が静的領域に置かれています。
、Math.round(11.5) is equal to how much?Math.round(-11.5) is equal to how much?
Math.round(11.5)は12を返し、Math.round(-11.5)は-11を返します。四捨五入は、引数に0.5を加えてから切り捨てます。
、スイッチは、バイトに作用することができ、ロングに作用することができ、文字列に作用することができますか?
最も効率的な方法で2の8乗を計算しますか?
2 << 3.
、配列にはlength()メソッドがあり、文字列にはlength()メソッドがありますか?
配列にはlength()メソッドはありませんが、length属性があります。Stringにはlength()メソッドがありますが、JavaScriptでは文字列の長さはlength属性で取得します。
コンストラクタはオーバーライドできますか?
コンストラクタは継承できないのでオーバーライドできませんが、オーバーロードすることはできます。
、2つのオブジェクトは同じ値==true)を持ちますが、異なるハッシュコードを持つことができます。
いいえ、2つのオブジェクトxとyがx.equals(y) == trueを満たす場合、それらのハッシュ・コードは同じになるはずです。 Javaでは、eqaulsメソッドとhashCodeメソッドについてこのように規定しています。2つのオブジェクトが同じであれば、それらのhashCode値は同じでなければなりません。
Stringクラスを継承することは可能ですか?
String クラスは最終クラスであり、継承することはできません。
、オブジェクトがメソッドのパラメータとして渡されると、このメソッドは、オブジェクトのプロパティを変更することができますし、変更の結果を返すことができますので、ここで最終的に転送または参照転送の値ですか?
Java言語のメソッド呼び出しは、引数の値渡しだけをサポートしています。オブジェクト・インスタンスがメソッドの引数として渡される場合、引数の値はオブジェクトへの参照です。オブジェクトのプロパティは呼び出し中に変更できますが、オブジェクトへの参照の変更は呼び出し元には影響しません。
、StringとStringBuilder、StringBufferの違いは?
Javaプラットフォームには、StringとStringBuffer/StringBuilderという2種類の文字列があり、文字列を格納したり操作したりすることができます。Stringは読み取り専用の文字列で、Stringによって参照される文字列の内容は変更できません。一方、StringBuffer/StringBuilderクラスは、直接変更できる文字列オブジェクトを表します。StringBuilderはJava 5で導入され、StringBufferとまったく同じメソッドを持っています。そのため、StringBufferよりも効率的です。
オーバーロードとオーバーライドの違い。オーバーロードされたメソッドは戻り値の型によって区別できますか?
メソッドのオーバーロードとオーバーライドはどちらもポリモーフィズムを実装する方法ですが、前者はコンパイル時のポリモーフィズムを実装し、後者は実行時のポリモーフィズムを実装するという違いがあります。オーバーロードはクラス内で発生し、同じ名前のメソッドでもパラメータ・リストが異なればオーバーロードされたとみなされます。オーバーロードはサブクラスとその親の間で発生し、オーバーロードには、サブクラスのオーバーライドされたメソッドが親のオーバーライドされたメソッドと同じ戻り値型を持ち、親のオーバーライドされたメソッドよりもアクセスしやすく、親のオーバーライドされたメソッドよりも多くの例外を宣言しないことが必要です。オーバーロードには、戻り値の型に関する特別な要件はありません。
、JVMがクラスファイルをロードする主なメカニズムを説明してください。
JVMにおけるクラス・ローディングは、クラス・ローダーとそのサブクラスによって実装されます。 Javaにおけるクラス・ローダーは、Javaの重要なランタイム・システム・コンポーネントで、実行時にクラス・ファイル内のクラスを見つけてロードする役割を果たします。クラス・ローディングとは、クラスの.classファイル内のデータをメモリに読み込むことを指し、通常は.classファイルに読み込むバイト配列を作成します。
抽象クラスとインターフェースの類似点と相違点は何ですか?
抽象クラスやインターフェースはインスタンス化できませんが、抽象クラスやインターフェースへの参照は定義できます。抽象クラスを継承するクラスやインターフェースを実装するクラスは、その抽象メソッドをすべて実装する必要があります。抽象クラスはコンストラクタを定義でき、抽象メソッドと具象メソッドの両方を持つのに対し、インターフェースはコンストラクタを定義できず、すべてのメソッドが抽象なので、インターフェースは抽象クラスよりも抽象的です。抽象クラスのメンバは private、default、protected、public のいずれかですが、インターフェースのメンバはすべて public です。抽象クラスではメンバ変数を定義できますが、インターフェースで定義されるメンバ変数は実質的に定数です。抽象メソッドを持つクラスは抽象クラスとして宣言しなければなりません。
、Javaでメモリリークはありますか。
理論的には、Javaはごみ収集メカニズムのため、メモリリークはありません。しかし、実際の開発では、GCによって回収することができない無駄な、しかし到達可能なオブジェクトが存在する可能性があり、それはまた、メモリリークにつながる可能性があります。たとえば、hibernate のセッションオブジェクトは永続的な状態に属し、ごみコレクタはこれらのオブジェクトをリサイクルしませんが、これらのオブジェクトは無用なごみオブジェクトの中に存在する可能性があり、タイムリーにクローズするか、第1レベルのキャッシュをクリアしないと、メモリリークにつながる可能性があります!
第22回 GCとは?なぜGCが必要なのか
GCとはガベージコレクションの略で、メモリリークを防ぎ、使用可能なメモリを効率的に使用することです。
、String s = new String("xyz"); 文字列オブジェクトはいくつ作成されますか?
静的領域 "xyz "にあるオブジェクトと、newで作成されたヒープ上のオブジェクト。
インターフェースはインターフェースから継承できますか?抽象クラスはインターフェースを実装できますか?抽象クラスは具象クラスを継承できますか?
インターフェースはインターフェースから継承でき、多重継承もサポートされています。抽象クラスはインターフェイスを実装することができ、抽象クラスは抽象クラスだけでなく具象クラスも継承することができます。
Javaにおけるfinalキーワードの用途は?
クラスの変更: クラスを継承できないことを示します;
メソッドを変更する : メソッドをオーバーライドできないことを示します;
Modified variable: 変数が一度しか代入できず、後で値を変更できないことを示します。
次のプログラムの結果を指摘してください。
class A { static { System.out.print("1"); } public A() { System.out.print("2"); }} class B extends A{ static { System.out.print("a"); } public B() { System.out.print("b"); }} public class Hello { public static void main(String[] args) { A ab = new B(); ab = new B(); } }
実行結果:1a2b2b. オブジェクトの生成時にコンストラクタが呼び出される順序は、静的メンバの初期化、親クラスのコンストラクタの呼び出し、非静的メンバの初期化、そして最後に自身のコンストラクタの呼び出しです。
, データ型間の変換: - 文字列を基本データ型に変換するには?- 基本データ型を文字列に変換するには?
- ラッパークラス・メソッドに対応する基本データ型を呼び出す parseXXX (String) や valueOf (String) は、対応する基本データ型を返すことができます;
- もうひとつの方法は、StringクラスのvalueOf()メソッドを呼び出して対応する文字列を返す方法です。
、ストリングの反転と交換を実現するには?
public static String reverse(String originStr) { if(originStr == null || originStr.length() <= 1) return originStr; return reverse(originStr.substring(1)) + originStr.charAt(0); }
Java とJavaSciprt
コードを以下に示します:
String s1 = " ";String s2 = new String(s1.getBytes("GB2312"), "ISO-");
、フォーマット(日付)メソッドでjava.text.DataFormatサブクラスを使用すると、日付をフォーマットすることができます。
class DateFormatTest { public static void main(String[] args) { SimpleDateFormat oldFormatter = new SimpleDateFormat("yyyy/MM/dd"); Date date1 = new Date(); System.out.println(oldFormatter.format(date1)); }}
Java とJavaSciprt
- オブジェクトベースとオブジェクト指向:Javaは真のオブジェクト指向言語であり、単純なプログラムを開発するにもオブジェクトを使って設計する必要があります。JavaScriptはスクリプト言語であり、ウェブにとらわれずユーザーと対話する複雑なソフトウェアを作成するのに使用できます。JavaScriptはオブジェクトベースでイベント駆動型のプログラミング言語であり、設計者が使用できる内部オブジェクトのセットが非常に豊富です。
- 解釈とコンパイル:Javaはソースコードが実行されるためコンパイルが必要。 JavaScriptはソースコードがコンパイルされず、ブラウザが解釈して実行するインタプリタ型プログラミング言語。(JavaScriptの動作効率化技術)
- 強い型付けの変数と弱い型付けの変数:Javaは強い型付けの変数チェック、つまりすべての変数はコンパイル時に宣言されなければなりません。
- コードの形式は同じではありません。
、try {}をreturn文で、その後すぐにtry finally {}の直後に実行されるコードでは、実行するときに、returnの前または後に?
メソッドが呼び出し元に戻る前に実行されます。
なぜなら、finallyブロックがある場合、tryのreturn文はすぐに呼び出し元に戻らず、finallyブロックの実行後に呼び出し元に戻される戻り値を記録し、finallyで戻り値が変更された場合、変更後の値が返されるからです。
、一般的なランタイム例外をいくつか挙げてください。
- ArithmeticException
- ClassCastException
- IllegalArgumentException
- IndexOutOfBoundsException
- NullPointerException
- SecurityException
クラスExampleAはExceptionを継承し、クラスExampleBはExampleAを継承します。
次のコード・スニペットがあります:
try { throw new ExampleB("b")} catch{ System.out.println("ExampleA");} catch{ System.out.println("Exception");}
出力:例A.
class Annoyance extends Exception {}class Sneeze extends Annoyance {} class Human { public static void main(String[] args) throws Exception { try { try { throw new Sneeze(); } catch ( Annoyance a ) { System.out.println("Caught Annoyance"); throw a; } } catch ( Sneeze s ) { System.out.println("Caught Sneeze"); return ; } finally { System.out.println("Hello World!"); } }}
捕まった迷惑
くしゃみ
ハロー・ワールド
try { throw new Annoyance(); } catch (Sneeze s) { System.out.println("Caught Sneeze"); return; } finally { System.out.println("Hello World!"); }
スレッド「main」での例外 com.xq.exceptions.Annoyance
at com.xq.exceptions.Human.main(ExceptionTest.java:14)
try { throw new Annoyance(); } catch (Sneeze s) { System.out.println("Caught Sneeze"); return; } catch (Exception e) { System.out.println("Caught Exception"); return; } finally { System.out.println("Hello World!"); }
捕捉された例外
ハロー・ワールド
、List、Set、MapはCollectionインターフェイスから継承されていますか?
List、Setはそうですが、Mapはそうではありません。 Mapはキーと値のペアをマッピングするコンテナで、ListとSetには明確な違いがあります。Setは散在した要素を格納し、要素の重複を許可しませんが、Listはコンテナの線形構造であり、状況の要素へのアクセスの数値インデックスのためのものです。
コレクションとコレクションの違いは?
コレクションは、インターフェイスであり、それは、セット、リスト、および親インターフェイスの他のコンテナです。
、リスト、マップ、セット要素にアクセスするための3つのインターフェース、それぞれの特徴は?
Listは特定のインデックスで要素にアクセスし、重複した要素を持つことができます。Setは重複した要素を保持することはできません。Mapはキーと値のペアのマッピングを保持し、1対1または多対1にすることができます。
、Threadクラスのsleep()メソッドとオブジェクトのwait()メソッドは、どちらもスレッドの実行を一時停止させます。
sleep()メソッドはThreadクラスの静的メソッドであり、このメソッドを呼び出すと、現在のスレッドが指定された時間の実行を一時停止することができます、他のスレッドへの機会の実行が、オブジェクトのロックはまだ維持されているので、スリープ時間の終了が自動的に再開されます。 wait()はObjectクラスのメソッドであり、オブジェクトのwait()メソッドを呼び出すと、現在のスレッドは、オブジェクトの待機プールに、オブジェクトのロックを放棄することになります。待機プールにあるスレッドを目覚めさせる唯一の方法は、オブジェクトの notify() メソッドを呼び出して待機プールに入り、スレッドがオブジェクトのロックを再取得すれば、待機状態に入ることができます。
スレッドのsleep()メソッドとyield()メソッドの違いは何ですか?
sleep()メソッドはスレッドの優先度を考慮せずに他のスレッドに実行の機会を与えるため、優先度の低いスレッドに実行の機会を与えます;
スレッドは sleep() メソッドを実行するとブロッキング状態になり、 yield() メソッドを実行するとレディ状態になります;
sleep()メソッドはInterruptedExceptionを投げることを宣言していますが、yield()メソッドは例外を宣言していません;
sleep() メソッドは yield() メソッドよりも移植性に優れています。
、あるスレッドがあるオブジェクトの同期メソッドAに入ったとき、他のスレッドはこのオブジェクトの同期メソッドBに入ることができますか?
できません。他のスレッドはオブジェクトの非同期メソッドにのみアクセスでき、同期メソッドにはアクセスできません。これは、非静的メソッドの synchronized 修飾子は、メソッドの実行時にオブジェクトのロックを取得する必要があるためで、すでにメソッド A にアクセスしている場合、つまりオブジェクトのロックがすでに取得されている場合、メソッド B にアクセスしようとするスレッドは、待機中のロックプールでオブジェクトのロックを待つことしかできません。
スレッド同期とスレッドスケジューリングに関連するメソッドを挙げてください。
- wait():スレッドを待ち状態にし、保持しているオブジェクトのロックを解放します;
- sleep():実行中のスレッドをスリープさせます。静的メソッドで、InterruptedException例外を処理するにはこのメソッドを呼び出します;
- notify():待機状態のスレッドをウェイクアップする、もちろん、このメソッドを呼び出すときに、正確にスレッドの待機状態をウェイクアップするのではなく、JVMがウェイクアップするスレッドを決定するために、優先順位とは何の関係もありません;
- notityAll():待機状態のすべてのスレッドをウェイクアップします。このメソッドは、すべてのスレッドにオブジェクトのロックを与えるのではなく、競合させます;
マルチスレッドプログラムの書き方を実装する方法はいくつありますか?
一つはThreadクラスを継承する方法、もう一つはRunnableインターフェイスを実装する方法です。どちらもrun()メソッドをオーバーライドしてスレッドの動作を定義する方法ですが、後者を使用することをお勧めします。Javaの継承は単一継承であるため、クラスには親クラスがあり、Threadクラスの継承が他のクラスから継承できない場合は、Runnableインターフェイスの使用がより柔軟であることは明らかです。
synchronized キーワードの使用法
synchronized キーワードを使用すると、synchronized(object) { ... } で synchronized ブロックのコードを定義するか、synchronized をメソッドの修飾子として宣言することで、オブジェクトまたはメソッドを synchronized としてマークし、オブジェクトとメソッドに相互に排他的にアクセスできるようになります。
同期と非同期の例を挙げてください。
システム内にクリティカルなリソースがある場合、例えば書き込み中のデータが後で他のスレッドによって読み取られる可能性がある場合、あるいは読み込み中のデータが他のスレッドによって既に書き込まれている可能性がある場合、これらのデータには同期的にアクセスしなければなりません。非同期プログラミングは、アプリケーションが実行に時間がかかるオブジェクトのメソッドを呼び出し、そのメソッドが戻ってくるまでプログラムを待たせたくない場合に使用します。実際、同期とはブロッキング処理を意味し、非同期とはノンブロッキング処理を意味します。
Lockは、Java 5以降に導入された新しいAPIであり、キーワードsynchronizedと比較すると、主な共通点: Lockはsynchronizedによって実現されるすべての機能を完了することができます。synchronizedは自動的にロックを解放しますが、Lockはプログラマが手動でロックを解放する必要があります。
トランザクションのACIDとは何ですか?
- 原子性(Atomicity):トランザクション内の操作はすべてかゼロかのいずれかであり、1つの操作の失敗がトランザクション全体の失敗につながります;
- 一貫性:トランザクションの終了時にシステムの状態が一貫していること;
- 分離:同時実行中のトランザクションは、お互いの中間状態を見ることができません;
- 永続性:トランザクション完了後の変更は、致命的な障害が発生した場合でも永続化されます。ロギングと同期バックアップにより、障害発生後もデータを再構築できます。
クラスのオブジェクトを取得する方法は?
- 方法1:Type.class(例:String.class
- 例:"hello".getClass()
オブジェクト指向の「6つの原則と1つのルール」について簡単に説明してください。
- クラスは、そのクラスがすべきことだけをします。
- ソフトウェアの実体は、拡張に対してオープンであり、修正に対してクローズであるべきです。(理想的な状態では、ソフトウェアシステムが新しい機能を追加する必要があるときに、元のシステムからいくつかの新しいクラスを導出する必要があることができ、コードの元の行のいずれかを変更する必要はありません。オープンとクローズを達成するために2つのキーポイントがあります:①抽象化は、抽象的なクラスやインターフェイスのないシステムには、拡張ポイントを持っていないキーです、②変動のカプセル化、システムは、継承構造内の変数のさまざまなカプセル化され、複数の変数が一緒に混合した場合、システムが複雑になります!
- インターフェイス指向プログラミング。
- いつでも、親タイプをサブタイプに置き換えることができます。
- インターフェイスは小規模で専門的であるべきで、決して大規模なものであってはなりません。
- 集約や合成リレーションシップを使用したコードの再利用が優先されます。
- ディミトリの法則は、最小知識の原則としても知られています。
デザインパターンについて知っていることを簡単に説明してください。
デザイン・パターンとは、何度も繰り返し使われてきたコード設計の経験の集合です。デザイン・パターンは、コードを再利用したり、コードを他の人が理解しやすくしたり、コードの信頼性を確保したりするために使われます。
- これらのサブクラスは共通の抽象親クラスを持ち、同じメソッドを実装しますが、これらのメソッドは異なるデータに対して異なる処理を実行します。サブクラスのインスタンスが取得されると、開発者はどのサブクラスのインスタンスが返されるかを考えることなく、基底クラスのメソッドを呼び出すことができます。
- オブジェクトにプロキシオブジェクトを提供し、プロキシオブジェクトが元のオブジェクトへの参照を制御します。
- クラスのインターフェイスを、クライアントが期待する別のインターフェイスに変換します。
- クラスのインスタンスは1つだけ、つまりクラスのオブジェクトのインスタンスは1つだけです。
怠惰なシングルトンパターン、スレッドアンセーフ、マルチスレッドで致命的な正常に動作することはできません。
public class Singleton { private static Singleton instance = null; private Singleton() {} public static synchronized Singleton getInstance(){ if (instance == null) instance new Singleton(); return instance; }}
ハングリーマンシングルトンパターンで、マルチスレッドの同期問題を回避
public class Singleton { private Singleton(){} private static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; }}
、Javaでバブルソートを書く
for(int i=0;i<arr.length-1;i++){//外側ループは、ソートトリップの回数を制御する。for(int j=0;j<arr.length-1-i;j++){//内部ループは、各トリップが何回ソートされるかを制御する。if(arr[j]>arr[j+1]){ int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } }
Javaでバイナリ検索を書く
非再帰的な実装:
public static int biSearch(int []array,int a){ int lo=0; int hi=array.length-1; int mid; while(lo<=hi){ mid=(lo+hi)/2; if(array[mid]==a){ return mid+1; }else if(array[mid]<a){ lo=mid+1; }else{ hi=mid-1; } } return -1; }
再帰的な実装:
public static int sort(int []array,int a,int lo,int hi){ if(lo<=hi){ int mid=(lo+hi)/2; if(a==array[mid]){ return mid+1; } else if(a>array[mid]){ return sort(array,a,mid+1,hi); }else{ return sort(array,a,lo,mid-1); } } return -1; }
サーブレットがプロセスを実行していますか?
Webコンテナは、Servletとそのインスタンス化をロードするには、Servletのライフサイクルが開始され、コンテナは、Servletの初期化のためにそのinit()メソッドを実行します。リクエストは、Servletのサービス()メソッドへの呼び出しが到着すると、サービス()メソッドは、リクエストの必要性に応じて呼び出されますdoGetまたはdoPostおよびその他のメソッドに対応しています;サーバーが閉じられたり、プロジェクトがアンインストールされると、サーバーがServletインスタンスを破棄するときに、この時点でServletのdestroy()メソッドを呼び出します。
フォワーディングとリダイレクションの違いは?
フォワードは、ターンの制御のコンテナは、リソースを要求するサーバーであり、サーバーが直接URLのターゲットアドレスにアクセスし、応答のURLは、コンテンツを読み取るために、ブラウザにこれらのコンテンツを送信すると、ブラウザは、サーバーから送信されたコンテンツがどこにあるかわからないので、それはまだアドレスバーに元のアドレスです。サーバーはブラウザにそのアドレスを再リクエストするようにステータスコードを送信するので、ジャンプ後にブラウザのアドレスバーにリンクアドレスが表示されます。明らかにリダイレクトはサーバーの保護されたリソースにアクセスすることはできませんが、あるウェブサイトから別のウェブサイトにリダイレクトすることはできます。forwardはより効率的なので、必要なときにforwardを使うようにしてください。また、これは実際のリンクを隠すのにも役立ちます。他のサーバーのリソースにアクセスする必要がある場合など、リダイレクトを使わなければならない場合もあります。
、JSPにはどんな組み込みオブジェクトがありますか?その役割は何ですか?
JSPには9つの組み込みオブジェクトがあります:
- request: GET または POST リクエストのパラメータを含むクライアントのリクエストをカプセル化します;
- response: サーバからクライアントへの応答をカプセル化します;
- pageContext: このオブジェクトを通して、他のオブジェクトを取得することができます;
- session: ユーザーのセッションをカプセル化したオブジェクト;
- application: サーバーの実行環境をカプセル化したオブジェクト;
- out: 出力サーバー応答の出力ストリームオブジェクト;
- config: ウェブアプリケーションの設定オブジェクト;
- ページ: JSPページそのもの;
- exception: ページがスローする例外をカプセル化したオブジェクト。
、JSPの4つのスコープについて説明してください。
JSPには、ページ、リクエスト、セッション、アプリケーションの4つのスコープがあります:
- page は、ページに関連するオブジェクトとプロパティを表します。
- リクエストはウェブクライアントが行うリクエストに関連するオブジェクトとプロパティを表します。リクエストは複数のページにまたがり、複数のウェブコンポーネントを含むかもしれません。ページに表示する必要がある一時的なデータは、このスコープに置くことができます。
- セッションは、ユーザーがサーバーと確立したセッションに関連するオブジェクトと属性を表します。ユーザーに関連するデータは、ユーザー自身のセッションに置かれるべきです。
- アプリケーションは、Web アプリケーション全体に関連するオブジェクトとプロパティを表します。これは基本的に、複数のページ、リクエスト、セッションを含む、Web アプリケーション全体にまたがるグローバルなスコープです。





