傳智播客javaweb筆記全套_第1頁
傳智播客javaweb筆記全套_第2頁
傳智播客javaweb筆記全套_第3頁
傳智播客javaweb筆記全套_第4頁
傳智播客javaweb筆記全套_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Lesson1一、eclipse工具的使用1.java代碼的位置 1)選擇工作空間workspace選擇一個文件夾存放程序(代碼)不要用中文和空格 2)新建一個java工程(Project) 3)建包建類2.快捷鍵alt+/:代碼自動補齊,需要配置的翻開preferences(首選項),搜keys,翻開快捷鍵配置面板搜alt+/,取消綁定搜contentassist,取消原先的綁定,配置成alt+/ctrl+1:錯誤自動修復,注意,放行的紅叉是可修復的,圓形的是不可修復的 導包的三種方式: 1〕將類名敲完整,按下alt+/進展補齊,會自動導包 2)ctrl+1,修正錯誤 3)ctrl+shift+o整理包,導入需要的包,去掉多余的導包語句ctrl+shift+f:代碼格式化 ctrl+2,L自動聲明變量shift+enter光標直接進入下一行ctrl+alt+方向鍵(向上向下)復制行alt+方向鍵(向上向下)移動當前行3.斷點調(diào)試1)可以對程序進展調(diào)試 在行的開頭雙擊左鍵打斷點,用debug方式來運行程序,程序就會停留在斷點位置F5跳入(stepinto)跳入方法內(nèi)部F6跳過,讓當前行運行F7跳出返回上一層程序resume直接運行到下一個斷點2)查看源代碼建議使用斷點調(diào)試的方式,注意當前運行環(huán)境需要包含源碼4.junit單元測試 1)寫一個java類,聲明測試方式 修飾符為publicvoid, 在方法前面加注解,(@Test) 此方法就可以進展測試了(交給junit運行) 2)需要在測試方法前做初始化工作 寫一個靜態(tài)方法publicstaticvoidinit() 在方法前加注解@BeforeClass 3)需要在測試后釋放資源 寫一個靜態(tài)方法 在方法前加注解@AfterClass二、jdk5新特性1.靜態(tài)導入1)導入類的靜態(tài)屬性importstaticjava.lang.System.out;out.println("haha");2)導入類的靜態(tài)方法importstaticjava.lang.Math.*; //導入Math類的所有靜態(tài)成員intnum=abs(-10);2.增強for循環(huán)1)作用:對存儲對象的容器進展迭代2)jdk5以前怎么迭代3)增強for循環(huán)迭代數(shù)組String[]arr={"a","b","c"}; //數(shù)組的靜態(tài)定義方式,只試用于數(shù)組首次定義的時候//傳統(tǒng)方式for(inti=0;i<arr.length;i++){ //i依次表示數(shù)組的角標 Strings=arr[i]; System.out.println(s);}System.out.println("");//在jdk5中我們可以使用增強for循環(huán)迭代//增強for循環(huán)括號里寫兩個參數(shù),第一個是聲明一個變量,變量類型必須是數(shù)組元素的類型//第二個就是需要迭代的容器//for循環(huán)會循環(huán)容器的length次,每次都將容器的第n-1個元素賦值給聲明的變量for(Strings:arr){ //循環(huán)體,執(zhí)行 //每次都將arr中的第n-1個元素給s System.out.println(s); //}3.根本數(shù)據(jù)類型的包裝類int-->Integerbyte-->Byteshort-->Shortlong-->Longchar-->Characterdouble-->Doublefloat-->Floatboolean-->Boolean1)Integerx=1;x=x+1;經(jīng)歷了什么過程?裝箱à拆箱à裝箱2)為了優(yōu)化,虛擬機為包裝類提供了緩沖池,Integer池的大小-128~127一個字節(jié)的大小3)String池Java為了優(yōu)化字符串操作提供了一個緩沖池面試題:Strings=“abc〞和Strings=newString(“abc〞)的區(qū)別Strings=newString(“abc〞)創(chuàng)立了幾個對象Strings=“a〞+“b〞+“c〞+“d〞創(chuàng)立了幾個對象Strings1=“a〞Strings2=“b〞Strings3=s1+s2;s3==〞ab〞?/*1.Strings="abc",虛擬機首先會檢查String池里有沒有"abc"對象(通過equals方法) //如果有,直接返回引用,如果沒有,會在池里創(chuàng)立一個“abc〞對象,并返回引用 Strings1="abc"; Strings2="abc"; System.out.println(s1==s2); //result:true */ /*2.Stringstr=newString("abc");不管緩沖池是否有"abc",都會在堆內(nèi)存創(chuàng)立一個"abc"對象,返回引用 //此時,負責檢查并維護緩沖池,其實堆內(nèi)存的對象是緩沖池中"abc"對象的一個拷貝 Strings1=newString("abc"); Strings2=newString("abc"); System.out.println(s1==s2);//result:false */ /*3.Strings="a"+"b"+"c"+"d";java編譯器有個合并量的優(yōu)化功能 //在編譯階段就把"a"+"b"+"c"+"d"合并為〞abcd“ Strings="a"+"b"+"c"+"d"; // Strings="abcd"; System.out.println(s=="abcd");//result:true */ /*4.Strings1="a";Strings2="b";Strings3=s1+s2; //String是常量,不能相加的,java如何實現(xiàn)的? StringBuildersb=newStringBuidler(s1); sb.append(s2); s3=sb.toString();也就是說實際上s3是方法返回的String對象但凡方法返回的字符串對象都是在堆內(nèi)存的 */ Strings1="a"; Strings2="b"; Strings3=s1+s2; //堆內(nèi)存的對象 System.out.println(s3=="ab");//result:false4)單列集合CollectionListlist=newArrayList();list.add("aaa");list.add("bbb");list.add("ccc");//傳統(tǒng)方式1/*1.獲得迭代器Iteratoriter=list.iterator();//2.循環(huán)判斷迭代器是否有下一個while(iter.hasNext()){ Stringstr=(String)iter.next(); //將迭代器的指針移向下一個,并將迭代當前指向的元素返回 System.out.println(str);}*///傳統(tǒng)方式2for(Iteratoriter=list.iterator();iter.hasNext();){ Strings=(String)iter.next(); System.out.println(s);}System.out.println("");//增強for循環(huán),沒有使用泛型的集合能不能使用增強for循環(huán)迭代?能for(Objectobj:list){ Strings=(String)obj; System.out.println(s);}5)雙列集合MapMapmap=newHashMap();map.put("a","aaa");map.put("b","bbb");map.put("c","ccc");//傳統(tǒng)方式迭代1//1.獲得所有的keySetkeys=map.keySet();//2.迭代keys獲得所有的keyIteratoriter=keys.iterator();while(iter.hasNext()){ Stringkey=(String)iter.next(); //abc //3.根據(jù)key獲得對應的value Stringvalue=(String)map.get(key); System.out.println(key+"="+value);}System.out.println("");//傳統(tǒng)方式2,必須掌握這種方式//1.獲得所有的鍵值對Entry對象Setentrys=map.entrySet();//2.迭代出所有的entryiter=entrys.iterator();while(iter.hasNext()){ Map.Entryentry=(Entry)iter.next(); //分別獲得key和value Stringkey=(String)entry.getKey(); Stringvalue=(String)entry.getValue(); System.out.println(key+"="+value);}System.out.println("");System.out.println("增強for循環(huán)迭代,");//增強for循環(huán)迭代,//原那么上map集合是無法使用增強for循環(huán)來迭代的,//因為增強for循環(huán)只能針對實現(xiàn)了Iterable接口的集合進展迭代//Iterable是jdk5中新定義的接口,就一個方法iterator方法//只有實現(xiàn)了Iterable接口的類,才能保證一定有iterator方法//java有這樣的限定是因為增強for循環(huán)內(nèi)部還是用迭代器實現(xiàn)的//而實際上,我們可以通過某種方式來使用增強for循環(huán)for(Objectobj:map.entrySet()){ //obj依次表示Entry Map.Entryentry=(Entry)obj; System.out.println(entry.getKey()+"="+entry.getValue());}6〕集合迭代注意問題//在使用迭代器迭代集合的過程中,不能對集合進展增刪操作@Testpublicvoidtest4(){ Listlist=newArrayList(); list.add("wangwu"); list.add("zhangsan"); list.add("lisi"); Iteratoriter=list.iterator(); while(iter.hasNext()){ Stringname=(String)iter.next(); if("wangwu".equals(name)){ //從集合中刪掉 //list.remove(name); //迭代過程中刪除元素需要調(diào)用迭代器的方法 iter.remove(); //刪除我迭代的集合被我迭代的最后一個元素 } }//124 System.out.println(list.size());}@Testpublicvoidtest5(){ Listlist=newArrayList(); list.add("aa"); list.add("bb"); //使用ListIterator迭代器 ListIteratorlistIterator=list.listIterator(); while(listIterator.hasNext()){ listIterator.next(); //迭代過程中增加元素 listIterator.add("cc"); } System.out.println(list.size());}7)增強for循環(huán)注意問題//在使用增強for循環(huán)時,不能對元素進展賦值int[]arr={1,2,3};for(intnum:arr){ num=0;}System.out.println(arr[1]);4.可變參數(shù)1)jdk5中方法的形參可以定義為可變參數(shù),傳入實參個數(shù)可變//設(shè)計一個方法求n個數(shù)的和publicstaticintgetSum(int...arr){ //可變參數(shù)在方法中仍被看做一個數(shù)組 intsum=0; for(intnum:arr) sum+=num; returnsum;}2)為例演示傳入不同參數(shù)的情況//list長度為3Listlist=Arrays.asList("a","b","c");//list長度為1,因為考慮語法String[]arr={"a","b","c"};Listlist=Arrays.asList(arr);//同時符合和的語法,此時會優(yōu)先考慮的語法 //原因是有了新功能要保證以前的代碼不出錯,向后兼容//現(xiàn)在就需要將arr作為一個元素存入集合Objectobj=arr;Listlist2=Arrays.asList(obj); //此時只符合的語法,不符合的語法,沒有歧義Listlist3=Arrays.asList(newObject[]{arr}); //優(yōu)先考慮,所以數(shù)組會拆開//System.out.println(list3.size());//根本數(shù)據(jù)類型數(shù)組只符合的語法int[]nums={1,2,3};list=Arrays.asList(nums);System.out.println(list.size());5.枚舉問題:對象的某個屬性的值不能是任意的,必須為固定的一組取值其中的某一個解決方法:在setGrade方法中做判斷,不符合格式要求就拋出異常直接限定用戶的選擇,通過自定義類模擬枚舉的方式來限定用戶的輸入寫一個Grade類,私有構(gòu)造函數(shù),對外提供5個靜態(tài)的常量表示類的實例jdk5中新定義了枚舉類型,專門用于解決此類問題枚舉就是一個特殊的java類,可以定義屬性、方法、構(gòu)造函數(shù)、實現(xiàn)接口、繼承類//枚舉類就是一個java類,也可以聲明屬性,方法,構(gòu)造函數(shù)publicenumGrade4{ A("90-100"),B("80-89"),C("70-79"),D("60-69"),E("0-59"); privateStringvalue; privateGrade4(Stringvalue){ this.value=value; } publicStringgetValue(){ returnvalue; }}//枚舉類就是一個java類,也可以繼承抽象和實現(xiàn)接口publicenumGrade5{ //抽象類不能創(chuàng)立實例對象 A("90-100"){ //new了一個Grade5的子類實例 publicStringtoLocaleString(){ return"優(yōu)"; } } ,B("80-89"){ //new了一個Grade5的子類實例 publicStringtoLocaleString(){ return"良"; } } ,C("70-79"){ //new了一個Grade5的子類實例 publicStringtoLocaleString(){ return"中"; } } ,D("60-69"){ //new了一個Grade5的子類實例 publicStringtoLocaleString(){ return"差"; } } ,E("0-59"){ //new了一個Grade5的子類實例 publicStringtoLocaleString(){ return"不及格"; } }; privateStringvalue; privateGrade5(Stringvalue){ this.value=value; } publicStringgetValue(){ returnvalue; } //對外提供一個方法,返回枚舉的本地信息 //一個方法不知道如何實現(xiàn),可以定義為抽象的 publicabstractStringtoLocaleString();}練習:請編寫一個關(guān)于星期幾的枚舉WeekDay,要求:枚舉值:Mon,Tue,Wed,Thu,Fri,Sat,Sun星期一。。。。星期日該枚舉要有一個方法,調(diào)用該方法返回中文格式的星期。6.反射1〕java代碼的階段:一段java代碼在程序運行期間會經(jīng)歷三個階段:source-->class-->runtime2)Class對象:在java中用一個Class對象來表示一個java類的class階段 Class對象封裝了一個java類中定義的成員變量、成員方法、構(gòu)造方法、類名、包名等獲得class對象的三種方式和區(qū)別://1.根據(jù)給定的類名來獲得用于類加載Stringclassname="cn.itcast.reflect.Person"; //來自配置文件Classclazz=Class.forName//2.如果拿到了對象,不知道是什么類型用于獲得對象的類型Objectobj=newPerson();Classclazz1=obj.getClass(); //獲得對象具體的類型//3.如果是明確地獲得某個類的Class對象主要用于傳參Classclazz2=Person.class; //在java中所有的類型都會對應一個Class對象intIntegerClassintClazz=int.class;ClassintarrClazz=int[].class;ClassvoidClazz=void.class;3〕反射反射就是獲得一個java類的各個組成局部 //反射類的成員方法 Classclazz=Person.class; Methodmethod=clazz.getMethod(methodName,newClass[]{paramClazz1,paramClazz2}); method.invoke(); //反射類的構(gòu)造函數(shù) Constructorcon=clazz.getConstructor(newClass[]{paramClazz1,paramClazz2,...}) con.newInstance(params...) //反射類的屬性 Fieldfield=clazz.getField(fieldName); field.setAccessible(true); field.setObject(value);4)反射用在哪里 到底框架是什么?框架就是將開發(fā)中大量重復的代碼集中起來寫個通用的程序 框架就是用反射來實現(xiàn)的, 框架需要現(xiàn)在的類調(diào)用將來寫的類 框架是將來的程序員調(diào)用的,框架不能實現(xiàn)完整的功能,框架只是一些一些通用的代碼; 框架要依賴將來寫的類來運行. 現(xiàn)在寫的類要調(diào)用將來寫的類,我們先針對接口進展調(diào)用,將來的類需要實現(xiàn)接口,那么方法就固定了 但是將來寫的類的類名我們無法獲知,這時就需要調(diào)用者通過配置文件告訴框架具體的類名7.泛型1)泛型是一種可變化的類型,類型不確定,需要調(diào)用者來指定2)用途: 一個類的多個成員方法用到的參數(shù)類型或返回值類型都是未知的類型,但又需要是同一個類型,就可將方法的 參數(shù)類型定義為泛型,此泛型必須在類上先予以聲明才能在方法中使用 一個方法的多個參數(shù)和返回值需要是同一個類型,也可以用泛型來解決,在方法返回值前面聲明泛型泛型的細節(jié):1〕泛型到底代表什么類型取決于調(diào)用者傳入的類型,如果沒傳,默認是Object類型2〕使用帶泛型的類創(chuàng)立對象時,等式兩邊指定的泛型必須一致 原因:編譯器檢查對象調(diào)用方法時只看變量,然而程序運行期間調(diào)用方法時就要考慮對象具體類型了3〕等式兩邊可以在任意一邊使用泛型在另一邊不使用(考慮向后兼容)3.泛型的根本概念以List<E>為例:<>念著typeof例,List<String>就是ListtypeofStringList<E>中的E稱為類型參數(shù)變量方法定義參數(shù)形式參數(shù)List<Integer>中的Integer稱為實際類型參數(shù)整個List<E>稱為泛型類型GenericType整個List<Integer>稱為參數(shù)化的泛型類型4.泛型的使用 1)使用帶泛型的類時,在創(chuàng)立對象時可以為泛型指定實際類型參數(shù),指定的具體類型相當于給泛型傳參 2)子類在繼承父類的時候,可以為父類定義的泛型指定實際類型參數(shù) classB<T> classAextendsB<String> 通過子類A獲得的父類類型就是一個參數(shù)化的類型 3)調(diào)用方法時傳入?yún)?shù)的具體類型將作為方法中泛型的實際類型Lesson2Servlet(超級重要)1.javaweb學什么用java語言開發(fā)動態(tài)的web資源,接下來就是介紹如何開發(fā)動態(tài)的web資源對于java程序員而言,所謂動態(tài)web資源就是可以運行在效勞器上的java程序2.實現(xiàn)效勞器管理java程序 開發(fā)人員寫好一個java類,到底有哪些方法tomcat效勞器是不可能知道的 tomcat效勞器欲執(zhí)行我們編寫的java類,就需要知道我們的java類有哪些方法,然后在適當?shù)臅r間調(diào)用這些方法,所以我們在寫的java程序要想運行在效勞器上,就interface Servlet{...}Servlet接口中就定義了可以被tomcat效勞器調(diào)用的java方法 通常來講,我們將實現(xiàn)了Servlet接口的java類稱之為Servlet編寫好的Servlet需要在web.xml文件中做配置,才能供外界訪問3.實現(xiàn)第一個Servlet程序?qū)懸粋€java類實現(xiàn)Servlet接口packagecn.itcast.servlet;importjava.io.*;importjavax.servlet.*;publicclassHelloWorldServletextendsGenericServlet{ //實現(xiàn)service方法 publicvoidservice(ServletRequestrequest,ServletResponseresponse) throwsServletException,java.io.IOException{ //向瀏覽器輸出一句話 PrintWriterout=response.getWriter(); out.write("helloworld!!!"); } publicvoidinit()throwsServletException{ //初始化servlet時被調(diào)用 System.out.println("init()"); } publicvoiddestroy(){ //摧毀servlet時被調(diào)用 System.out.println("destroy()"); }}3.2.導入servletjar包3.3.編譯帶包的類3.4.將包拷貝至day05/WEB-INF/classes目錄下-->發(fā)布web工程3.5.在web.xml文件中做映射<!--做servlet映射--> <!--servlet元素用于給一個類起別名--> <servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class>cn.itcast.servlet.HelloWorldServlet</servlet-class> </servlet> <!--servlet-mapping元素用于將一個Servlet映射到url--> <!—url必須以/開頭,/表示當前web應用即上下文路徑--> <servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/HelloWorldServlet</url-pattern> </servlet-mapping> 注意:servlet對象一旦創(chuàng)立就會駐留在內(nèi)存中,為所有的請求效勞,servlet對象什么時候銷毀? 直到效勞器關(guān)閉時或web應用被移除才銷毀3.6.Servlet執(zhí)行流程圖4.用eclipse工具開發(fā)Servlet4.1.建一個webproject4.2.在src下建包,創(chuàng)立一個java類實現(xiàn)Servlet接口4.3在Webroot\WEB-INF\web.xml做servlet映射4.4配置tomcat效勞器4.5將web工程發(fā)布至tomcat效勞器 發(fā)布的web應用名稱可以配置:web工程右鍵選properties-->myeclipse-->web 默認情況使用工程名作為發(fā)布后的web應用名4.6啟動tomcat效勞器運行程序5.Servlet對象一般來講我們開發(fā)一個Servlet會去繼承Servlet在eclipse下開發(fā)Servlet可以直接新建一個Servlet,覆寫Servlet的doGet和doPost方法繼承Servlet的原因是:Servlet實現(xiàn)了service方法,將ServletRequst和ServletResponse強轉(zhuǎn)為子類ServletRequest和ServletResponse,讓我們用起來更加方便,同時,在service方法中,它判斷了請求方式,根據(jù)請求方式來調(diào)用doGet和doPost二、Servlet細節(jié)1.*號統(tǒng)配符一個Servlet可以映射為多個路徑在映射Servlet路徑時可以使用‘/*’或‘*.擴展名’的形式注意:兩者不能同時使用 /*具有較高的優(yōu)先級2.load-on-startup元素<servlet>元素下可以配置<load-on-startup>子元素,配置方式如下:<load-on-startup>1</load-on-startup>如果一個Servlet配置了該項,web容器會在web應用被加載時就初始化該Servlet,數(shù)字越小那么越先初始化3.效勞器下所有web應用中的web.xml都會自動繼承該文件中所有的配置DefaultServlet幫我們?nèi)eb應用下讀取a.html文件,并打給瀏覽器,如果沒有發(fā)送404頁面也就說,我們通過ie訪問效勞器訪問的都是Servlet4.Servlet線程平安問題解決Servlet線程平安問題:加上同步的鎖(lock)實現(xiàn)SingleThreadModel接口的Servlet效勞器會做判斷,當有請求過來,如果Servlet對象忙著呢,效勞器會再創(chuàng)立一個Servlet對象為用戶提供效勞,如果Servlet閑置,就直接提供效勞這樣的方式實際上是回避了線程平安問題,單線程訪問Servlet,這樣的方式不可取Lesson3一、WEB效勞器1.根本概念WEB在英語中即表示網(wǎng)頁的意思,它用于表示Internet主機上供外界訪問的資源以及超鏈接所組成的鏈表放在internet網(wǎng)上供外界訪問的文件或程序被稱為web資源web資源被分為:靜態(tài)web資源:html、css、jpg動態(tài)web資源:Servlet、Jsp2.什么是WEB效勞器?就是一臺電腦,安裝了一個效勞器軟件3.為什么需要安裝WEB效勞器 思考問題:從一臺計算機的IE瀏覽器如何去訪問另一臺計算機中的文件3.1兩臺計算機是如何實現(xiàn)通訊的? IP地址(計算機的唯一標識)IPV44個字節(jié)的整數(shù),每個字節(jié)以點號隔開00每個字節(jié)的取值0~255在計算機中程序會綁定在某一個端口0~65535盡量用1024以上的連接一臺計算機就需要輸入ip地址和端口號作為接收方,應該綁定ip,監(jiān)聽指定的端口3.2在本地寫程序添加一個效勞,供別人來訪問,假設(shè)監(jiān)聽8888端口3.3編碼實現(xiàn)了一個本地效勞器程序 作用:管理本地的資源,只要將html頁面放到指定的目錄下,外界就可以訪問了3.4安裝效勞器的目的:開發(fā)好的web資源可以發(fā)布到效勞器上,這樣外界就可以通過瀏覽器訪問了//ServerSocket對象可以監(jiān)聽端口ServerSocketserversocket=newServerSocket(6666);while(true){ Socketsocket=serversocket.accept(); //等待客戶端的連接請求,一旦有請求過來,就完畢阻塞,返回客戶端對象 //一旦有客戶來訪問,就另開一個新線程去提供效勞,main線程繼續(xù)等待下一個客戶的連接 newThread(newMyService(socket)).start();}//提供效勞InputStreamin=socket.getInputStream();Thread.sleep(200);intlen=in.available();//估計此流不受阻塞能讀取的字節(jié)數(shù)byte[]buffer=newbyte[len];in.read(buffer);Stringrequest=newString(buffer);//截取第一行StringfirstLine=request.substring(0,request.indexOf("\n"));StringuriName=firstLine.split("")[1];OutputStreamout=socket.getOutputStream();//根據(jù)需要訪問的資源創(chuàng)立File對象=newFile("src"+uriName);if(!()){ out.write("對不起!您訪問的資源不存在!別瞎搞??!".getBytes()); out.close(); return;}//從文件讀,往瀏覽器寫fis=new(file);buffer=newbyte[1024];while((len=fis.read(buffer))>0){ out.write(buffer,0,len);}socket.close();二、Tomcat效勞器的安裝和配置1.使用tomcat6.0.20.rar文件解壓即完成安裝2.tomcat就是一個java程序,一定會用到j(luò)re tomcat的啟動是通過startup.bat文件,實際上startup.bat中是去調(diào)用 catalina.bat文件,而且是通過%catalina_home%\bin\catalina.bat去找 所以為了保證效勞器啟動正常,需要配置catalina_home環(huán)境變量為tomcat的安裝目錄3.tomcat的目錄構(gòu)造bin:存放一些執(zhí)行文件conf:存放效勞器的配置文件lib:存放tomcat所依賴的jar文件logs:存放日志文件temp:存放臨時文件webapps:webapplications存放所有的web應用程序(web資源)work:tomcat的工作目錄,jsp翻譯成的Servlet就在這個目錄下4.web應用多個web資源存放在一個目錄下即為一個web應用(web應用程序、web工程)web應用的目錄構(gòu)造 靜態(tài)web資源直接放在目錄下 java類放在classes目錄下 web.xml文件負責管理web應用下所有的web資源 所有jar包放在lib目錄下三、WEB應用的映射1.虛擬目錄 一個web應用(效勞器上一個目錄)需要供外界訪問的路徑,需要映射虛擬目錄 在tomcat6中,放在webapps下的web應用,效勞器會自動做映射(將文件夾名稱作為虛擬路徑) 對于webapps目錄外的web應用需要手動映射虛擬路徑1.1.在server.xml文件可以配置 <host> <Contextpath=〞/itcast〞docBase=〞f:\itcast〞/> </host>1.2.在%tomcat目錄%\conf\catalina\localhost下寫一個xml文件 文件名就是虛擬目錄<ContextdocBase=〞f:\itcast〞/> 多級目錄配置aaa#bbb.xml對應/aaa/bbb 如果文件名是ROOT.xml那就是配置了缺省的web應用,訪問時不需要輸入虛擬目錄Web.xml的作用: 管理web應用下所有的web資源通俗地講,一個web應用下所有的web資源如何被外界訪問都需要在此文件下做映射包括咱們后面學的Servletjsp都需要在這個文件中做映射實驗:配置web應用的首頁在web應用下新建目錄WEB-INF,在此目錄下新建web.xml文件<?xmlversion="1.0"encoding="ISO-8859-1"?><web-appxmlns=""xmlns:xsi=""xsi:schemaLocation=""version="2.5"><welcome-><welcome-</welcome-file></welcome-></web-app>3.域名解析一個完整url協(xié)議名主機名端口號資源名〔uri〕IE訪問效勞器的原理,在IE中輸入的地址中包含域名,域名就需要被翻譯成效勞器的IP,才能訪問到效勞器IE瀏覽器IE瀏覽器sina效勞器看windows是否注冊了該主機名DNS效勞器(網(wǎng)絡(luò)效勞商)解析域名,獲得一個IP4.web應用映射的練習:新建一個web應用配置成缺省的web應用配置首頁配置tomcat監(jiān)聽端口為80在windows中注冊主機名5.虛擬主機效勞器允許在一個IP上配置多個主機,即虛擬主機中的起了兩個作用:找DNS效勞器,作為域名被解析為IP通過Host頭告訴效勞器訪問的主機名配置方式:在server.xml文件中配置Host元素,需要指定name〔主機名〕、appBase(默認web應用存放目錄)appBase目錄下所有的web應用,tomcat會自動映射虛擬路徑<Hostname=""appBase="F:\sohu\webapps"/>做實驗:給新配置的虛擬主機配置缺省的web應用<Hostname=""appBase="F:\sohu\webapps"> <Contextpath=""docBase="F:\sohu\webapps\abc"/></Host>

分析web資源訪問過程/訪問一個a.html靜態(tài)web資源,IE做了什么事1)將作為域名發(fā)送給DNS,解析成IP地址,訪問一臺效勞器2)發(fā)送Host頭〔〕,告訴效勞器我要訪問的虛擬主機,效勞器拿著Host頭找匹配的Host元素3)將abc作為虛擬目錄,告訴效勞器我要訪問的web應用,效勞器拿著abc找匹配的web應用虛擬目錄對應是一個web應用的目錄,所以虛擬目錄也被我們稱作web應用路徑(web應用的上下文contextpath)三、協(xié)議1.tcp/ip協(xié)議:網(wǎng)絡(luò)通信協(xié)議(連接) ip協(xié)議:ip地址對應一臺計算機〔互聯(lián)網(wǎng)層〕 tcp高級協(xié)議:三次握手,發(fā)送請求、返回響應、傳輸數(shù)據(jù) (傳輸層)2.協(xié)議是建立在tcp協(xié)議的根底之上 (應用層)3.協(xié)議的版本(w3c) 1.0:建立連接,發(fā)送一次請求就斷開 1.1:建立連接,可以無限次發(fā)送請求四、請求消息請求消息內(nèi)容:包括一個請求行、假設(shè)干消息頭、以及實體內(nèi)容,其中的一些消息頭和實體內(nèi)容都是可選的,消息頭和實體內(nèi)容之間要用空行隔開。請求行PO 消息頭Accept:image/gif,image/x-xbitmap,*/*Referer:Content-Type:application/x-UA-CPU:x86Accept-Encoding:gzip,deflateUser-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;GTB6.5;CIBA)Host:localhost:8080Content-Length:33Connection:Keep-AliveCache-Control:no-cacheCookie:JSESSIONID=B0B3FB4FFB0315B3D3C620548DD4E1EB空一行消息體username=zhangsan&password=1234561.請求行GET為請求方式:get方式的請求參數(shù)直接跟在url后面,例如:/itcast/a.html?username=aaa&password=111POST方式:post方式請求參數(shù)放在消息體中傳輸,相對平安,get大小限制1K,post無數(shù)據(jù)量限制2.請求消息頭:IE瀏覽器用于向效勞器說明情況的(瀏覽器使用環(huán)境)Accept:text/html,image/* 說明瀏覽器承受的數(shù)據(jù)類型Accept-Charset:ISO-8859-1 說明瀏覽器使用的字符編碼Accept-Encoding:gzip,compress說明瀏覽器支持的壓縮格式Accept-Language:en-us,zh-cn說明瀏覽器的語言環(huán)境Host:說明瀏覽器要訪問的主機名If-Modified-Since:Tue,11Jul200018:23:51GMT 文件的修改事件,用于做緩存Referer:說明請求來自哪里,防盜鏈(做實驗)User-Agent:Mozilla/4.0(compatible;MSIE5.5;WindowsNT5.0)說明瀏覽器內(nèi)核Cookie 向效勞器發(fā)送CookieConnection:close/Keep-Alive 說明連接狀態(tài)Date:Tue,11Jul200018:23:51GMT客戶端計算機時間3.實體內(nèi)容(消息體)瀏覽器向效勞器發(fā)送的數(shù)據(jù),例如上傳的文件、提交的表單等五、響應消息響應消息的內(nèi)容包括:一個狀態(tài)行(類比請求信息的〞請求行〞)、假設(shè)干消息頭、以及實體內(nèi)容,其中的一些消息頭和實體內(nèi)容都是可選的,消息頭和實體內(nèi)容之間要用空行隔開。/1.1200OKContent-Type:text/html;charset=GB18030Content-Length:766Date:Thu,07Jul202115:40:02GMT<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>MyJSP'index.jsp'startingpage</title></head><body> hello</body></html>1.狀態(tài)行/1.1404NotFound響應狀態(tài)碼:說明效勞器的響應狀態(tài)常用狀態(tài)碼狀態(tài)碼含義100~199表示成功接收請求,要求客戶端繼續(xù)提交下一次請求才能完成整個處理過程200~299表示成功接收請求并已完成整個處理過程,常用200300~399為完成請求,客戶需進一步細化請求。例如,請求的資源已經(jīng)移動一個新地址,常用302、307和304400~499客戶端的請求有錯誤,常用404500~599效勞器端出現(xiàn)錯誤,常用500200:一切OK302\307請求重定向,你訪問我,我通知你訪問另一個資源304通知瀏覽器去讀緩存404找不到資源,客戶端的請求有錯誤500效勞器程序出錯(效勞器端的程序拋異常了)2.響應消息頭效勞器向瀏覽器說明情況(處理結(jié)果)Location:通知瀏覽器去訪問另一個資源Server:apachetomcat 說明效勞器Content-Encoding:gzip 通知瀏覽器數(shù)據(jù)的壓縮格式Content-Length:80 通知瀏覽器發(fā)送數(shù)據(jù)的長度Content-Language:zh-cn 通知瀏覽器語言環(huán)境Content-Type:text/html;charset=GB2312 通知瀏覽器文件的格式和編碼Last-Modified:Tue,11Jul200018:23:51GMT 告訴瀏覽器文件的修改時間Refresh:1;url= 通知瀏覽器自動刷新Content-Disposition:attachment; 通知瀏覽器以下載的方式翻開資源Set-Cookie:SS=Q0=5Lb_nQ;path=/search 發(fā)cookieExpires:-1//3種制止緩存的頭字段 Cache-Control:no-cachePragma:no-cache Connection:close/Keep-Alive 連接狀態(tài)Date:Tue,11Jul200018:23:51GMT系統(tǒng)時間3.實體內(nèi)容(響應消息體)一般為效勞器發(fā)送給ie瀏覽器的頁面數(shù)據(jù)六、s協(xié)議1.s是一種加密協(xié)議能保證數(shù)據(jù)的平安2.不對稱加密對稱加密3.s1)制作數(shù)字證書keytool-genkey-aliastomcat-keyalgRSA2)將證書拷貝至tomcat\conf3)修改server.xml文件配置s連接器<Connectorport="8443"protocol="/1.1"SSLEnabled="true"maxThreads="150"scheme="s"secure="true"clientAuth="false"sslProtocol="TLS" keystoreFile="conf\.keystore"keystorePass="123456"/>

4)重啟效勞器翻開ie訪問5)ie中安裝證書繼續(xù)瀏覽查看證書安裝證書刪除證書:Lesson5一、ServletConfig對象作用:封裝Servlet初始化參數(shù)1.可以在web.xml文件中Servlet元素下為Servlet配置初始化參數(shù)<init-param> <param-name>name</param-name> <param-value>aaaa</param-value></init-param>2.web容器在初始化Servlet時,會將初始化參數(shù)封裝到一個ServletConfig對象中,傳給init方法3.我們在Servlet中覆寫init方法,就可以獲得ServletConfig4.父類GenericServlet中定義了一個成員變量用于記住此對象,并提供了getServletConfig方法我們可以直接調(diào)用此方法獲得config對象5.再調(diào)用getInitParameter(name)方法獲得想要配置項//指定編碼 //獲得ServletConfig對象 ServletConfigconfig=getServletConfig(); Stringencoding=config.getInitParameter("encoding"); System.out.println("encoding="+encoding);二、ServletContext對象:ServletContext被稱為servlet的上下文1.ServletContext對象代表整個web應用2.ServletContext對象是一個“域〞對象(即:可以存儲數(shù)據(jù)的對象)ServletContext對象的內(nèi)部維護了一個map集合,key是String類型value是Object類型classServletContext{ privateMap<String,Object>map;}3.ServletContext作為域?qū)ο?,多個Servlet可以共享數(shù)據(jù)Servlet6//1.獲得ServletContext對象ServletContextcontext=getServletContext();//2.存入域context.setAttribute(“name〞,“zhangsan〞);Servlet7//獲得context域,getAttributeStringname=(String)getServletContext().getAttribute("name");web應用的初始化參數(shù) getContext().getInitParameter(“name〞);5.統(tǒng)計一個web應用的訪問量在context域中維護一個count變量 訪問Servlet時,取出變量加16.實現(xiàn)請求轉(zhuǎn)發(fā)實現(xiàn)請求轉(zhuǎn)發(fā)需要用到轉(zhuǎn)發(fā)對象RequestDispatcher,RequestDispatcher有一個forward方法能轉(zhuǎn)發(fā)請求7.如何讀取工程中的文件〔分兩種情況〕7.1.讀取web工程下的資源文件 //獲得絕對路徑StringrealPath=(相對web應用的路徑); 注意URLurl=ServletContext.getResource();web的url //獲得與文件關(guān)聯(lián)的流 InputStreamin=ServletContext.getResourceAsStream(“〞;7.2讀取java工程下的文件 //不能相對虛擬機目錄不能用絕對路徑 //只能類加載的方式讀//獲得流ClassLoaderclassLoader=Demo.class.getClassLoader(); InputStreamin=classLoader.getResourceAsStream("a.txt"); //獲得絕對路徑URLurl=Demo.class.getClassLoader().getResource("a.txt");Stringpath=url.getPath();類加載方式缺點1〕不能讀取類路徑以外文件2)由于需要加載到內(nèi)存,不能讀大文件3)web工程中如果用類加載的方式讀類加載實際上讀取的是內(nèi)存中加載的文件,此時將讀不到硬盤上資源文件的修改解決方法:通過絕對路徑去讀硬盤上的文件避開內(nèi)存的文件 例如:Demo.Class.getClassLoader().getResource("a.txt").getPath()三、Servlet緩存 Servlet的Service()方法中的代碼 //調(diào)用方法longlastModified=getLastModified(req); //如果為-1,就直接放行,給最新的if(lastModified==-1){doGet(req,resp);}//方法返回不是-1

else{ //讀取IE發(fā)送的頭If-Modified-SincelongifModifiedSince=req.getDateHeader(HEADER_IFMODSINCE); //拿著客戶端的時間頭和方法的返回值比擬if(ifModifiedSince<(lastModified/1000*1000)){//Iftheservletmodtimeislater,calldoGet()//Rounddowntothenearestsecondforapropercompare//AifModifiedSinceof-1willalwaysbeless //方法的返回值大于ie發(fā)送過來的時間頭 //重新向瀏覽器發(fā)送了一個時間頭maybeSetLastModified(resp,lastModified); //放行,發(fā)送頁面doGet(req,resp);}else{ //方法的返回值沒有大于ie發(fā)送過來的時間頭 //發(fā)送304狀態(tài)碼,讓用戶去讀緩存resp.setStatus(ServletResponse.SC_NOT_MODIFIED);}}Lesson6一、中文亂碼問題1.出現(xiàn)亂碼的原因1)在計算機中數(shù)據(jù)以二進制的形式進展存儲的,數(shù)據(jù)的傳輸也是通二進制的形式2〕需要存字符,會出現(xiàn)字符與字節(jié)之間的轉(zhuǎn)換(輸入字符讀到的字符)3)字符和字節(jié)之間如何實現(xiàn)轉(zhuǎn)換?都是通過查碼表4)字符到字節(jié)是編碼,字節(jié)到字符是解碼,編碼和解碼用到了不同碼表就會出現(xiàn)亂碼問題2.解決亂碼1)拿到亂碼根本上都是由于解碼錯誤導致的,解決方法,重新編碼再解碼2)以后將文件交給解析器,出現(xiàn)亂碼,首先想到是否通知別人文件的編碼格式Servlet對象一旦創(chuàng)立就駐留在內(nèi)存,Request和response對象,web容器會針對每次用戶的請求創(chuàng)立一個request和response請求完畢,響應發(fā)給ie。Request和response對象就會立即被銷毀二、Response對象1.responsegetWriter方法獲得字符流,用于向瀏覽器輸出字符數(shù)據(jù)中文亂碼問題ServletServletgetWriter().write(“中國〞)Tomcatweb容器中國默認編碼iso-8859-16363utf-8989789Response中國IE瀏覽器6363–>??gb2312解錯碼2.文件下載文件名中文亂碼問題由于文件名是跟著content-disposition頭發(fā)送給瀏覽器的但凡頭的數(shù)據(jù)都會經(jīng)過url編碼,編成全世界通用的符號,這樣傳輸過程中才不會亂碼3.請求重定向 發(fā)送302狀態(tài)碼和location頭 ie向瀏覽器發(fā)送了兩次請求第一次直接請求資源,第二次重定向的頁面 地址欄是有變化4.getWriter和getOutputStream不能同時使用,有沖突 response的流我們不用關(guān)閉,交給web容器去管理三、Request對象1.request幫助我們?nèi)~@取ie瀏覽器發(fā)送給效勞器的請求消息(請求行消息頭消息體)2.request獲得請求參數(shù):getParameter()和getParameterValues()3.request中文參數(shù)亂碼問題IEIE老張url編碼utf-8%E8%80%81%E5%BC%A0tomcatweb容器%E8%80%81%E5%BC%A0request對象解碼iso-8859-1è????

亂碼程序setCharacterEncoding設(shè)置request編碼Stringdata=getParameter()Request中文參數(shù)亂碼的解決方法:post方式下:request.setCharacterEncoding(“utf-8〞);//指定處理消息體的解碼方式get方式下: 1) 手動解決亂碼問題byte[]bytes=username.getBytes("iso-8859-1");Stringstr=newString(bytes,"utf-8"); 2) 在%tomcat%\conf\server.xml中找到當前連接器元素Connector 配置URIEncoding屬性它用于指定web容器的url解碼方式 3) 配置useBodyEncodingForURI屬性指定為true 用于讓tomcat按照處理消息體的編碼方式處理消息頭超鏈接提交參數(shù):也是使用get方式提交,(和表單的區(qū)別是,表單提交,ie會自動進展url編碼) 而超鏈接提交,ie不進展url編碼,此時我們需要將超鏈接中的中文參數(shù)手動進展url編碼. 同理:在效勞器端的處理方式和表單get方式的處理一樣4.請求轉(zhuǎn)發(fā)Servlet負責處理用戶的請求,處理完的結(jié)果交給jsp來做顯示(在Servlet中不輸出任何數(shù)據(jù),所有數(shù)據(jù)的顯示都交給jsp)獲得RequestDispatcher對象做請求轉(zhuǎn)發(fā),時,需要將處理結(jié)果存入request域帶給jsp時,web容器(如:tomcat)會清空response中的數(shù)據(jù)后,無法向response輸入數(shù)據(jù)面試題:請求轉(zhuǎn)發(fā)forward和包含include的區(qū)別Forward的時候,web容器會清空response的數(shù)據(jù),并且轉(zhuǎn)發(fā)之后,當前Servlet就無法再寫入數(shù)據(jù)了Include的時候,web容器會讓兩個Servlet的數(shù)據(jù)都寫入responsemvc的過程1)用戶發(fā)送請求〔提交表單,超鏈接〕2)Servlet做處理,將數(shù)據(jù)(響應結(jié)果)封裝到j(luò)avabean對象3)將javabean對象存入request域4)請求轉(zhuǎn)發(fā)給jsp5)jsp頁面中從request域取出數(shù)據(jù)做顯示IE瀏覽器IE瀏覽器ServletjavabeanjspWeb資源訪問的流程1.客戶端(IE)發(fā)送請求給效勞器2.用一個Servlet來響應客戶的需求根本上分為兩種:1)查看數(shù)據(jù) 請求轉(zhuǎn)發(fā)給jsp做顯示2)用戶登陸\購置商品完成某一個特定的功能結(jié)果都是成功或失敗 請求重定向到一個目標資源面試題:請求轉(zhuǎn)發(fā)和請求重定向的區(qū)別?1)請求重定向地址欄有變化請求轉(zhuǎn)發(fā)地址欄無變化2)請求重定向客戶端向效勞器發(fā)送兩次請求請求轉(zhuǎn)發(fā)發(fā)送一次請求3)應用場景: 一件事情做完了,應該做第二件事情了,就請求重定向(用戶登陸、購物) Servlet處理完了,讓jsp做顯示,用請求轉(zhuǎn)發(fā)(mvc設(shè)計模式)web應用中的路徑怎么寫?讀取web中的文件用context讀取,嚴禁用絕對路徑,通通以〞/〞開頭原那么:就看路徑是給瀏覽器用的還是給效勞器用的,給瀏覽器用的,要加上web應用的名稱給效勞器用的,斜線〞/〞即表示:當前web應用(/表示web應用,不用加web應用的名稱)各種場景:1)請求轉(zhuǎn)發(fā) : 地址是給效勞器用的,不需要加web應用 /b.jsp/servlet/Servlet12)請求重定向3)超鏈接: 路徑給瀏覽器用的,所以需要加上web應用名稱/day06/a.jsp記?。郝窂揭浴?〞開頭,請求轉(zhuǎn)發(fā)不加web應用名,其他的全部都要加Lesson7會話技術(shù)(包括cookie和sessionCookie是客戶端技術(shù),Session是效勞器端技術(shù))會話,用戶翻開瀏覽器,點了一些超鏈接,關(guān)閉瀏覽器的過程會話過程中會產(chǎn)生一些數(shù)據(jù),這些數(shù)據(jù)是每個用戶獨享的,需要找個地方存起來會話技術(shù)就是解決上述問題的,Cookie是客戶端技術(shù),Session是效勞器端技術(shù)Cookie對象Cookie對象的創(chuàng)立Cookiecookie=newCookie(key,value);發(fā)送CookieResponse.addCookie(cookie);獲取指定的Cookie//獲得用戶發(fā)送的所有Cookie Cookie[]cookies=request.getCookies(); //如果沒發(fā)Cookie過來,為null //遍歷找到lastAccessTime StringlastAccessTime=null;for(inti=0;cookies!=null&&i<cookies.length;i++){ Stringname=cookies[i].getName(); //一個Cookie的nameif("lastAccessTime".equals(name)){ //找到了,幾下valuelastAccessTime=cookies[i].getValue(); }}設(shè)置Cookie的有效時間cookie默認情況下在當前瀏覽器進程有效,如果想讓cookie長期駐留客戶機的硬盤,就需要指定時間cookie.setMaxAge(time)time以秒為單位setMaxAge(0)通知瀏覽器刪除該Cookie顯示用戶最近的瀏覽記錄兩個頁面顯示所有的商品(從數(shù)據(jù)庫找出商品顯示),顯示最近的記錄(讀取客戶發(fā)送的Cookie中存的id,找出書顯示)CookieDemo2顯示商品的詳細信息,并向客戶端發(fā)送Cookie,難點如果產(chǎn)生新的Cookie將客戶端帶過來的Cookie分割后存入集合,根據(jù)不同的情況將新的id加進去,迭代集合用分隔符串起來CookieDemo3Session對象session的原理request對象有個方法是getSession()首先看瀏覽器是否發(fā)送了Cookie(JSESSIONID),如果發(fā)了,拿著id去內(nèi)存中找對應的session對象返回;如果沒有發(fā)Cookie或者沒找到對應的Session對象,創(chuàng)立一個新的Session對象getSession(booleancreate)create為true的時候,如果內(nèi)存有session就返回,沒有就創(chuàng)立新的create為false的時候,意味著只查找不創(chuàng)立,有就返回,沒有不創(chuàng)立,返回null;session的運行要依靠cookie來發(fā)送JSESSIONID如果想讓多個瀏覽器共享一個session,我們就需要人工發(fā)送Cookie,并設(shè)置Cookie的有效時間3.如果瀏覽器禁用Cookie,那么Session也玩不起來了要想讓session好用,就需要在頁面跳轉(zhuǎn)時發(fā)送sessionid有一個技術(shù)url重寫:重寫后的地址會在原有的url地址的根底上加上JSESSIONID 超鏈接或表單提交的地址,重寫方式如下:StringnewUrl=response.encodeURL(url); 請求重定向的地址,重寫方式如下:StringnewUrl=response.encodeRedirectURL(url);session的應用(重點)簡單購物車的實現(xiàn)ListServletBuyServletListCartServlet用戶登錄Login.jspLoginServletindes.jspLogoutServlet防止表單重復提交(2種方法) 1.可以用js來做,但是只能增加用戶的體驗,不能完全防止壞人 2.用session做防表單重復提交 FormServletHandleFormServletTokenProcessorLesson13JSP入門全稱:javaserverpage1.web資源的運行原理html:靜態(tài)web資源,DefaultServlet讀取html文件,通過response輸出給IE瀏覽器Servlet:動態(tài)web資源,web容器(Servlet引擎)解析web.xml文件,找到url對應的java類 通過反射創(chuàng)立Servlet對象,調(diào)用service方法 Class.forName(“〞).newInstance();jsp: 動態(tài)web資源jsp頁面的執(zhí)行過程:(重要)第一次被訪問的時候,web容器(jsp引擎)會將jsp翻譯成一個Servlet,然后調(diào)用servlet的service方法 2.jsp翻譯后的Servlet會被放到%tomcat安裝目錄%\work\Catalina\localhost\webcontext被再次訪問的時候,web容器會去直接調(diào)用Servlet的service()方法,所以通常來講jsp只是在第一次被訪問的時候比擬慢 4.如果jsp頁面做了修改,此時web容器會重新翻譯jsp2.jsp是什么實際上jsp就是Servlet,只是提供了一種比擬直觀的書寫方式,因為寫jsp就像在寫Htmljsp中可以寫java代碼,有兩種jsp中寫java代碼的方法:1)jsp腳本表達式內(nèi)容會被放到out.print()里面,輸出給瀏覽器格式:<%=newDate()%>2)jsp腳本片段內(nèi)容會原封不動地被翻譯到Servlet的service方法中<% //java代碼%>3.jsp和Servlet的區(qū)別1)Servlet適合寫java代碼,因為Servlet就是一個java類 在開發(fā)中使用Servlet對用戶發(fā)送的請求進展處理并做出響應2)jsp適合做數(shù)據(jù)美化,作為數(shù)據(jù)顯示模板 因為jsp頁面直接書寫HTML標簽3)工程中的web層通常使用mvc設(shè)計模式Servlet+jsp+javabean 其中, Servlet做控制器,處理用戶請求jsp作為顯示模板javabean作為封裝數(shù)據(jù)的實體4)如何養(yǎng)成一種良好的編碼風格 在Servlet中應防止做任何的數(shù)據(jù)輸出 在jsp中應防止去直接書寫java代碼,而實際上要做到這點很難,所以需要用到el和jstljsp語法1.模板元素 在jsp頁面中所有的html標簽局部被稱作模板元素,用于對整個網(wǎng)頁進展布局2.jsp腳本:jsp中的java代碼被稱作jsp腳本 jsp腳本有三種形式 1)腳本表達式:被翻譯到out.print()方法中<%=newDate()%> 2)腳本片段:被翻譯到service()方法中<% for(inti=0;i<10;i++){ System.out.printl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論