***

12313 ワード

ネット上でこのJSP総括についての文章を抜粋して、全部で7时に分けて総括して、理解の部分があって、一知半解のいくつかの内容もあって、私がもっと深くこの方面の知识を理解してから帰ってきて见て、もっと大きい启発があることを望んでいます.
一、JSPの動作原理
   あるJSPファイルが最初に要求されたとき、JSPエンジンはそのJSPファイルをservletに変換します.このエンジン自体もservletで、JSWDKやWEBLOGICではJspServletです.JSPエンジンはまずこのJSPファイルをJavaソースファイルに変換し、変換時にjspファイルに文法エラーが発見された場合、変換プロセスは中断され、サービス側とクライアントにエラー情報を出力する.変換に成功した場合、JSPエンジンはjavacでJavaソースファイルを対応するclassファイルにコンパイルします.次に、このSERVLETの例を作成し、このSERVLETのjspInit()メソッドが実行され、jspInit()メソッドはservletのライフサイクルで1回のみ実行される.その後、jspService()メソッドが呼び出され、クライアントの要求を処理する.各リクエストに対して、JSPエンジンは、リクエストを処理するための新しいスレッドを作成します.複数のクライアントが同時にJSPファイルを要求する場合、JSPエンジンは複数のスレッドを作成します.各クライアント要求はスレッドに対応します.マルチスレッド方式で実行すると、システムに対するリソースの需要を大幅に低減し、システムの同時量と応答時間を向上させることができるが、マルチスレッドのプログラミング制限に注意すべきであり、servletは常にメモリに存在するため、応答は非常に速い..jspファイルが変更された場合、サーバは設定に基づいてファイルを再コンパイルするかどうかを決定し、再コンパイルが必要な場合は、メモリ内のservletに代わってコンパイル結果を決定し、上記の処理を続行します.JSPは効率的ですが、最初の呼び出しでは変換とコンパイルが必要なため、わずかな遅延があります.また、いつでもシステムリソースが不足している場合、JSPエンジンは何らかの不確定な方法でservletをメモリから削除します.この場合、jspDestroy()メソッドが最初に呼び出され、servletインスタンスが「ゴミ収集」処理にマークされます.jspInit()およびjspDestory()のフォーマットは、データベースへの接続の確立、ネットワーク接続の確立、プロファイルからパラメータの取得など、jspInit()で対応するリソースを解放する初期化作業を行うことができます.

                                                                                                                                                                                                                                       

二、サービス側の出力バッファ
   デフォルトでは、サービス側がクライアントに出力するコンテンツは、クライアントに直接書くのではなく、出力バッファに先に書きます.次の3つの場合にのみ、バッファの内容がクライアントに出力されます.
1.このJSPページの完了情報の出力2.出力バッファがいっぱい3.JSPでout.flush()またはresponse.flushbuffer()が呼び出された出力バッファのサイズは、以下のように出力バッファのサイズを1 KBに設定します.またはresponse.setBufferSize(1);出力バッファのサイズを0に設定します.つまり、バッファしません.またはresponse.setBufferSize(0);
response.getBufferSize()またはout.getBufferSize()で取得可能な出力バッファのサイズはバイト単位です.response.isCommitted()では、サービス側がクライアントにデータを出力したかどうかを確認できます.戻り値がTRUEの場合、データはクライアントに出力され、FALSEの場合はまだありません.
三、サービス側出力リダイレクト
出力リダイレクトには、次の3つの方法があります.
(1)RESPONSE.SETREDERECT("URL")
   この方法は、HTTPプロトコルのHEADER部分を修正することにより、ブラウザにリダイレクト命令を下し、ブラウザにリダイレクトページの内容を表示する.
response.sendRedirect("http://localhost:7001/index.html");

(2)次の方法でもHTTP HEADERの属性を変えることができ、その原理は1と同じである.
 
   

(3)采用

    该方法是利用服务器端先将数据输出到缓冲区的机制,在把缓冲区的内容发送到客户端之前,原来的不发送,改为发送该页面的内容,如果在之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意.

如下面的例子中(1)会输出index.html的内容,(2) 不会输出index.html的内容,而是输出

out.println("@@@@@@@@@@@@@@@@@");

に表示されます.
java.lang.IllegalStateException: Response already committed

例外ですが、クライアントからエラー出力はありません.
(1)

                                                                                                                                                                                                               

                                                                                                                                                                                                               

(2)

                                                                                                                                                                                                          

説明:1.方法(1),(2)は変数を用いてリダイレクトのアドレスを表すことができる.メソッド(3)は,リダイレクトのアドレスを変数で表すことができない.String add="./index.html"; index.htmlにリダイレクトできません
String add=http://localhost:7001/index.html response.sendRedirect(add); リダイレクト可能
http://localhost:7001/index.html
に表示されます.
2.採用方法(1),(2)requestの変数(request.setAttribute()でrequestに保存された値)は新しいページでは採用できないが、採用方法(3)は可能である.以上、(1),(2)リダイレクトを採用した方がよい.
四、JSPでクラスを正しく適用する:
   クラスはJAVA BEANとして使用するべきで、中で直接使用しないでください.以下のコード(1)JSPエンジンで変換するとコードになります(2):一つのクラスをJSPをJAVA BEANとして使用すると、JSPはその作用範囲に応じて対応する内部オブジェクトに保存します.作用範囲がrequestの場合、それをrequestオブジェクトに保存します.そして、最初の呼び出しのみ(オブジェクトの値はnull)はインスタンス化されますが、このクラスのオブジェクトを直接作成すると、JSPが呼び出されるたびにオブジェクトが再作成され、パフォーマンスに影響します.
コード(1)


                                                                                                                                                                                             

コード(2)
demo.com.testdemo test = (demo.com.testdemo)request.getAttribute("test");
if (test == null)
{
       try
       {
                 test = (demo.com.testdemo) java.beans.Beans.instantiate(getClass().getClassLoader(),"demo.com.testdemo");
       }
       catch (Exception _beanException)
       {
               throw new weblogic.utils.NestedRuntimeException("cannot instantiate 'demo.com.testdemo'",_beanException);
       }
       request.setAttribute("test", test);
       out.print(" ");
}
out.print(" ");
test.print("this is use java bean");
                                                                                                                                                                                          
testdemo td= new testdemo();
td.print("this is use new");

五、JSPのデバッグ
   JSPのデバッグは、特にbeanがセッションに存在する場合、より困難です.いくつかのページから中へ行かなければなりません.通常はout.println()またはSystem.out.print()を使用します.問題を調べるためにたくさんの情報を入力します.jbuilderで開発すれば、JSPを直接デバッグできますが、エラーの原因と解決方法を知ることがもっと重要です.以下、JSPのプログラミングでよくあるエラーを分析します.
(1).java.lang.NullPointerException異常は一般的にNULL値の変数を操作することによるものである.次のような操作で投げ出す
java.lang.NullPointerException
String a = null;
a.substring(0,1);

このような異常を避けるためには、変数の操作前にNULL値であるかどうかを確認することが望ましい.
 
   

(2).JSP是用JAVA写的,所以它是大小写敏感的,用过其他编程语言的人最容易犯这个错误。另外在浏览器的地址栏中输入的访问JSP的地址也是区分大小写的.如 http://localhost:7001/demo/t.jsp http://localhost:7001/Demo/t.jsp 是不一样的
(3).在jsp中判断字符串要使用compareTo方法,不要用==,因为在java中String变量不是一个简单的变量而是一个类实例,不同的方法会得到 不同的结果,如下所示:
String str1="ABCD";
  String str2="ABCD"; (  String str2="AB"+"CD"; )
  if (str1==str2)
   out.print("yes");
  else
   out.print("no");
     "yes"。
 
  String str1,str2,str3;
  str1="ABCD";
  str2="AB";
  str3=str2+"CD";
  if (str1==str3)
   out.print("yes");
  else
   out.print("no");
     "no"。
String str1=new String("ABCD");
  String str2=new String("ABCD");
  if (str1==str2)
   out.print("yes");
  else
   out.print("no");
     "no"。
String str1=new String("ABCD");
  String str2=new String("ABCD");
  if (str1.compareTo(str2)==0)
   out.print("yes");
  else
   out.print("no");
     "yes"。

(4)JSPまたはSERVLETの出力がブラウザによってバッファに保存されることを防止する:ブラウザはデフォルトで閲覧したページをバッファに保存するが、デバッグ時には一般的にそうしたくない.以下のスクリプトをプログラムに組み込むことで、JSPまたはSERVLETの出力がブラウザによってバッファに保存されることを防止することができる
 
   

在IE中也可通过设置实现:把/工具/INTERNET选项/常规/设置/的检察所存页面的较新版本,设为每次访问该页时都检查.



六、COOKIE


   HTTP COOKIE实质是服务端与在客户端之间传送的普通HTTP头,可保存也可不保存在客户的硬盘上.如果保存,每一个文件大小不超过4K的文本文件.多个COOKIE可保存到同一个文件中. 如果从编程角度来看,在JSP中COOKIE就是JAVA提供的一个类.常用的方法如下所表示,因为客户端可能不接受COOKIE,所以建议不用它,改用SESSION等其他方式。
public class cookie
{
public String getDomain() //   COOKIE    
public int getMaxAge() //   COOKIE    ,    
public String getName() //   COOKIE   
public String getPath() //   COOKIE     
public boolean getSecure() //   COOKIE     
public String getValue() //   COOKIE  
public void setDomain(java.lang.String pattern) //   COOKIE    
public void setMaxAge(int expiry) //   COOKIE    ,    
public void setPath(java.lang.String uri) //   COOKIE     
public void setSecure(boolean flag) //   COOKIE     
public void setValue(java.lang.String newValue) //   COOKIE  
}

1つのCOOKIEには以下の5つの部分が含まれています.
NAME/VALUEペア、このCOOKIEの名前とその保存値を設定COOKIEは通常サーバに関連しており、ドメインをJAVA.SUN.COMとすると、このCOOKIEはこのドメインに関連しており、そのサイトにのみ機能し、このサイトを閲覧すると、ブラウザはそのCOOKIEの内容をサービス側に送信し、COOKIEはHTTP HEADERの一部として送信され、ドメインが設定されていない場合、COOKIEはこのCOOKIEを作成したサーバーに関連しています.サーバー上でこのCOOKIEを使用できるファイルがあるパスを指定するために使用されます.このパスは、そのサイトの下のパスの下でのみ適用されます."/"サーバー上のすべてのディレクトリがこのCOOKIEを使用できることを示す.COOKIEには有効期限があり、有効期限のデフォルト値は-1である.これはこのCOOKIEを保存していないことを示している.ブラウザが終了すると、このCOOKIEはすぐに失効する.セキュリティオプションtrue/falseは、trueに設定されている場合、サービス側とクライアント間でこのCOOKIEの内容を転送する場合、HTTPSプロトコルを採用する.クライアントがCOOKIEをサポートする方法:次の方法でクライアントにCOOKIEを書いて、成功を確認する.
try
{
Cookie c = new Cookie("mycookie","COOKIE TEST");
response.addCookie(c);
}
catch(Exception e)
{
      System.out.println(e);
}

次に、新しいJSPファイルでは、以下の方法でクライアントのCOOKIEをcookiesに取得し、cookies.length=0の場合、クライアントのブラウザがCOOKIEをサポートしていないことを示します.
try
{
Cookie[] cookies = request.getCookies();
if(cookies.length ==0)
{
      System.out.println("not support cookie");
}
}
catch(Exception e)
{
      System.out.println(e);
}

七、JSPとSERVLETの違い:
   SUNはまずSERVLETを発展させて、その機能は比較的に強くて、体系の設計もとても先進的で、ただ、それはHTML文を出力するのはやはり古いCGI方式を採用して、1つの1つの出力で、だから、HTMLを編纂して修正するのはとても不便です.ASP、PHP、JSPはネスト型のSCRIPT言語である.一つの分散システムは三つの層に分けるべきである:表示層、業務ロジック層、データアクセス層、J 2 EEアーキテクチャにおいて、SERVLETは業務ロジック層を書くために使用するのは強いが、書き込み表示層にとっては不便である.JSPは主に書き込み表示層を便利にするために設計されている.ENTITY BEANはデータアクセス層、SESSION BEANを実現するビジネスロジック層を実現する.簡単なアプリケーションシステムであれば、JSP+BEANSの構造で設計することができる.JSPには表示層に関するものだけを格納すべきである.つまり、HTMLページを出力する部分だけを格納すべきである.すべてのデータ計算、データ分析、データベース連結処理は、すべてビジネスロジック層に属し、JAVA BEANSに格納すべきである.JSPによりJAVA BEANを呼び出すSは、2層の統合を実現している.実際、マイクロソフトのDNA技術は、簡単に言えばASP+COM/DIOM技術である.JSP+BEANSと完全に類似しており、すべての表示層がASPで完了し、すべての業務ロジックがCOM/DIOMで完了している.なぜこれらのコンポーネント技術を採用するのか.単純なASP/JSP言語は非常に非効率的に実行されているため、大量のユーザークリックが発生すると、純粋なSCRIPT語すぐに彼の機能の上限に達し、コンポーネント技術は大幅に機能の上限を高め、実行速度を速めることができる.一方、純粋なSCRIPT言語は表示層と業務論理層を混在させ、修正が不便になり、コードが再利用できなくなり、コンポーネント技術を採用すればコンポーネントだけを変更できる.複雑な応用に対してはENTITY BEAN実を採用すべきである現データアクセス層、SESSION BEANは業務ロジック層を実現し、JSPでSESSION BEANを呼び出し、SESSION BEANでENTITY BEANを呼び出す.つまりJSP+EJBを採用して複雑な分布式システムを構築する.それはJSP+BEANより高いスループット、信頼性、安全性を持つ.以上、簡単な応用に対して、JSP+BAENを採用することができ、複雑な応用システムに対して、JSP+EJB、SERVLを採用すべきである.ETは軽くなりません.JSPで完全に代替できます.