JavaWeb学習day 10(基礎強化)


第1章環境の設定
OSのインストール、バックアップのインストール(ミラー):
  • JDK:環境変数
  • を設定する
  • Eclipse:解凍すればいい
  • Eclipse自己解凍ディレクトリは中国語
  • を含まない
  • コードワークスペースディレクトリには中国語
  • は含まれていません.
  • Tomcat:解凍中国語カタログを含まない
  • MySql:インストール:符号化utf 8
  • を選択
    Eclipseの設定
  • 1_関連TOMCAT
  • 開発中、環境が変化(tomcatを再関連付け)、
  • serversウィンドウのtomcat
  • を削除
  • Project Explorerウィンドウの下にあるserver
  • windowの再関連付け->preferences->servers->runtime->tomcat

  • 第2章カスタム注記
    2.1注釈とは何ですか.
    注記はインタフェース、クラスと同様にデータ型に属する.
    2.2注記作用
  • 1_コンパイルチェック
  • 2_構成(後期使用)
  • 3_ヘルプ文書生成
  • 2.3注記の特徴
  • 注記は、変数、メソッド、クラスの上に
  • をロードすることができる.
  • 注記属性があってもなくてもよい
  • @Override
  • @Test(timeout=1000):実行時間が1秒を超えるエラー
  • 注記有効範囲(ソースコード、コンパイル期間、実行期間)
  • ソース期間有効:Stringクラス上@Author,@Since,@See役割:コマンドjavadocコマンドを使用して現在のソースコードをヘルプファイルに生成し、Stringクラス上の関連注釈
  • を識別できます.
  • コンパイル期間有効:@Override@Deprescated@Suppresswarning作用:コンパイラ部分情報
  • に伝える
  • 実行中有効:@Test役割:現在のコードでJunit方式で実行すると、Junitは@Test注釈を含むメソッド
  • を実行します.

    2.4 JDKに出てくる3つの注釈を振り返る
    @Override @Deprecated @Suppresswarning
  • @override:この注記は、現在のメソッドが親を書き換えるメソッドであることを示す
  • を意味します.
  • @Suppresswarning:コンパイラの警告を抑制@Suppresswarning{"unused","rawtypes"}属性の変数は使用されず、属性2文には汎用型
  • は追加されていません.
  • @Deprecated:以下の方法は古い方法であることを宣言し、
  • を使用することをお勧めしません.
    2.5カスタム注記
  • 形式:
  •   public @interface     {
         
         public            1();
         public            2()  default     ;
      }
    
  • カスタム注記プロパティがサポートするタイプ:
  • 基本データ型(4種類8種類)、String,Class,Annotation(注釈タイプ)、列挙タイプ、および上記の1次元配列タイプ
  • 注記:構成
  • の構成:開発時に一部の情報をプログラムに書き込むことを望まない、例えばデータベースのユーザー名とパスワードは、ユーザー名とパスワードを保存することができる.txt , .properties , .xmlファイルでは、プログラムによりファイルの内容を読み取る
  • .
  • フレームワーク:多くのツールクラスの組み合わせ、目的:プロジェクト開発の加速
  • 後期の学習では,フレームワーク部分hibernate,spring,struts 2の多くの情報を構成する必要があり,2つの形式構成(xml,注釈)
  • を提供した.
  • はいつ注釈で構成されますか?
  • 構成情報が変更されない場合、例えばservletパスは、注釈の形式
  • を使用することを推奨する.
  • 構成情報が頻繁に変更される必要がある場合、データベースのユーザー名やパスワード情報など、従来の方法(.txt,.properties,.xml)
  • を推奨します.
    <students>
      <stu>
       <stuNum>s002</stuNun>
       <stuPhone>
          <stuHomePhone>124324</stuHomePhone>
          <stuCmpPhone>12342143</stuCmpPhone>
       </stuPhone>
      </stu>
    </students>
    
  • テストカスタム注釈
  • を使用
    @MyAnno01(timeout=100,c=java.util.Date.class,strs={
         "aaa","bbb"})
    public void test01(){
         
    }
    
  • バイトコード上の注釈情報md.isAnnotationPresent(MyTest.class)
  • を反射により読み出す.
    2.6ケース:シミュレーションJunit
  • 1_カスタム注記@MyTest
  • は、メタ注釈@Rentention@Targetを介して現在の注釈の役割ドメインおよびターゲットオブジェクトを宣言し、宣言がなければ実行中に注釈の情報を取得できない
  • である.
  • 2_UserDaoの定義
  • 4メソッドaddUser delUser uptUser getUserを作成し、最初の3つのメソッドに注記
  • をロードします.
  • 3_クラスMyJunitの定義、JUnitのシミュレーション
  • UserDao.classファイルはメモリにロードされ、
  • バイトコードファイルに取得するすべての方法
  • メソッドを巡回し、各メソッドに@MyTest注記
  • がロードされているかどうかを判断する
  • 現在のメソッドに@MyTestが設定されている場合、現在のメソッド
  • が実行されます.
    注釈要求:理解し、授業コードを実現する.開発中の地位:dom 4 jのようにXMLファイルを解析する.XMLファイルの解析プログラマは解析しない、配置XMLファイルの後期の開発では注釈をカスタマイズせず、注釈情報を反射して読み取る.
    第3章動的エージェントを用いてウェブサイトの文字セット符号化問題を解決する
    3.1設計モード
    ソフトウェア開発の過程で、似たような問題に遭遇し、問題の解決方法をモデル(セット)の単例、工場、アダプタ、装飾者、動的エージェントを抽出する.
    3.2グーグル自動車シーン
  • javaは自動車開発約定interface ICar{start run stop}class GoogleCar implements ICar{}
  • を設計した.
  • は、グーグルCarを生態圏プラットフォームに接続する際に、自動車の起動機能
  • を強化することを望んでいる.
  • デコレーションモード
  • シーン:二次開発の場合、ソースコードを取得することができず、継承を使用できない前提で、既に存在するオブジェクト上の機能を強化する.
  • 前提:装飾されたオブジェクトGoogleCarが実現するすべてのインタフェース
  • を取得することができる.
  • 実装構想:カスタム定義装飾類実装ICarインタフェースは、カスタム装飾類に被装飾のオブジェクト
  • を伝達する.
  • の弊害:実装インタフェースの方法が多すぎると、装飾クラスの方法が多すぎる冗長性
  • .
  • ダイナミックエージェントモード
  • 原理:仮想マシンによってメモリに類似のMyCarを作成する.classファイル
  • MyCarを作成します.classファイルは仮想マシンに次のように伝えます.
  • 1_作成されたバイトコードファイルには、どのような方法があるべきか
  • 2_作成されたバイトコード上の方法は、
  • をどのように実現するか.

  • バイトコードローダ:
  • jdkには、各種バイトコードファイルをメモリにロードするプログラムがある.これらのプログラムは、バイトコードローダ
  • と略称する.
  • バイトコードファイルclassファイルをメモリにロードする方法IOストリーム技術を用いてファイルに取得するデータをメモリ
  • にロードする最下位実装プロセス
  • バイトコードローダ:3種類のブートクラスローダ、拡張クラスローダ、アプリケーションクラスローダ
  • 
    public class TestClassLoader {
         
    	public static void main(String[] args) {
         
    		
    		//  String     
    		ClassLoader classLoader = String.class.getClassLoader();
    		System.out.println(classLoader);
    		//  String.class ,int.class                ,     ,          c c++
    		
    		//  ext(extendtion)                ExtClassLoader:      
    		ClassLoader classLoader2 = sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader();
    		System.out.println(classLoader2);
    	
    		//   :                
    		//         AppClassLoader
    		ClassLoader classLoader3 = TestClassLoader.class.getClassLoader();
    		System.out.println(classLoader3);
    	}
    }
    

    3.3ケース:動的代理店は全局の文字化けしの問題を解決する
    ステップ
  • 1_new DynamicWeb Project -->Index.html
  • <h1>post      </h1>
    <form action="/day18_v3/ServletDemo" method="post">
    	User:<input type="" name="username"/><br/>
    	<input type="submit"/>
    </form>
    
    <h1>get      </h1>
    <form action="/day18_v3/ServletDemo" method="get">
    	User:<input type="" name="username"/><br/>
    	<input type="submit"/>
    </form>
    
  • 2_ServletDemo
  • post/getメソッドにかかわらず、次の文を実行しても中国語の文字化けしの問題はありません
  • String um=request.getParameter("username");
    System.out.println(um);
    
  • 3_フィルタではrequest上のgetParameter()機能を強化
  • 構想:
  •           get/post  request.getMethod();
         post,      : request.setCharacterEncoding(“utf-8”);    ,  
         get,     String v=request.getParameter(name);
          v    ,  
    
    import java.io.IOException;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    
    public class EncodingFilter implements Filter {
         
    
        public EncodingFilter() {
         
        }
    
    	public void destroy() {
         
    	}
    	public void init(FilterConfig fConfig) throws ServletException {
         
    	}
    	
    	
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
         
    		// request     HttpServletRequest
    		final HttpServletRequest req=(HttpServletRequest)request;
    		// JDK          :   req    getParameter(name);API
    		HttpServletRequest myReq=(HttpServletRequest)Proxy.newProxyInstance(EncodingFilter.class.getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
         
    			
    			@Override
    			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
         
    				
    				Object obj=null;
    				
    				if(method.getName().equalsIgnoreCase("getParameter")){
         
    					//        
    					String md=req.getMethod();
    					if("get".equalsIgnoreCase(md)){
         
    						//get     
    						//  req    getParameter  
    						String v=(String)method.invoke(req, args);
    						//  
    						String vv=new String(v.getBytes("iso-8859-1"),"utf-8");
    						return vv;
    						
    					}else{
         
    						//post     
    						req.setCharacterEncoding("utf-8");
    						obj=method.invoke(req, args);
    					}
    					
    					
    				}else{
         
    					obj=method.invoke(req, args);
    				}
    				return obj;
    			}
    		});
    		//         
    		System.out.println(myReq.hashCode());
    		//       
    		chain.doFilter(myReq, response);
    	}
    }