servlet
什么是servlet:
servlet是javaEE的組件杂曲,也是javaEE中的一個(gè)規(guī)范庶艾。服務(wù)器其實(shí)是對(duì)servlet的實(shí)現(xiàn),servlet是一個(gè)程序類解阅,只不過它必須遵循servlet的規(guī)范落竹,要求類實(shí)現(xiàn)javax.servlet.Servlet接口
搭建標(biāo)準(zhǔn)的JavaWeb項(xiàng)目結(jié)構(gòu)
1:創(chuàng)建一個(gè)Java項(xiàng)目泌霍;
2:在該Java項(xiàng)目中創(chuàng)建一個(gè)文件夾webapp货抄,表示W(wǎng)eb項(xiàng)目的根目錄
3:在webapp中創(chuàng)建一個(gè)文件夾WEB-INF
4:在WEB-INF文件夾中創(chuàng)建:lib,classes文件夾
5:把tomcat根目錄下/conf中的web.xml文件拷貝到WEB-INF中朱转,web.xml只需要保留根元素
6:把當(dāng)前項(xiàng)目的classpath路徑改成當(dāng)前項(xiàng)目/webapp/WEB-INF/classes
創(chuàng)建servlet程序
1:將tomcat根/lib/servlet-api.jar拷貝到WEB-INF/lib中蟹地,并且做build path操作
2:創(chuàng)建一個(gè)java類,并且使它實(shí)現(xiàn)javax.servlet.Servlet接口藤为;實(shí)現(xiàn)其中的方法
3:關(guān)聯(lián)servle的源代碼怪与;servlet各個(gè)版本源代碼下載地址http://archive.apache.org/dist/tomcat/
4:Servlet配置,配置web.xml缅疟;
<servlet>
<servlet-name>實(shí)現(xiàn)javax.servlet.Servlet接口的類名</servlet-name>
<servlet-class>實(shí)現(xiàn)javax.servlet.Servlet接口的類的全限定名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>實(shí)現(xiàn)javax.servlet.Servlet接口的類名</servlet-name>
<url-pattern>/資源名</url-pattern>
</servlet-mapping>
5:部署項(xiàng)目分别;在tomcat根/conf/中的server.xml中的<host>元素中添加<Context docBase="/項(xiàng)目路徑/webapp" path="contentPath(可未空,根據(jù)項(xiàng)目而定)">
6:訪問http://ip:prot/contentPath/資源名
? ? 如:http://localhost:8080/contentPath/index
servlet請(qǐng)求流程
?1:瀏覽器先發(fā)送請(qǐng)求:http://localhost:8080/contentPath/index
?2:DNS解析域名(忽略)?
?3:Tomcat解析請(qǐng)求:/contentPath/index 上下文路徑:/contentPath 資源的名稱:/index
?4:解析Tomcat根/conf/server.xml文件,獲取其中所有的元素,并找到path屬性為/contentPath的元素.. 再讀取該元素,再獲取docBase屬性值,該屬性值就是當(dāng)前訪問的WEB項(xiàng)目的根路徑.
?5:從該web的根路徑/WEB-INF下找到web.xml文件.
?6:讀取web.xml文件,獲取所有的元素,并判斷哪一個(gè)的文本內(nèi)容為:/hello. 找不到: 報(bào)404錯(cuò)誤. 找 到: GOTO 7.
?7:通過/index,找到當(dāng)前Servlet的全限定名.?
?8:從Servlet的實(shí)例緩沖池中去獲取全限定名對(duì)應(yīng)的對(duì)象. Map cache = .....;
? ? ? Servlet obj = cache.get("全限定名");
? ? ? if(obj == null{
? ? ? ? ? //第一次請(qǐng)求:GOTO 9.
? ? ? }else{
? ? ? ? ? //非第一次請(qǐng)求:GOTO 12;
? ? ? }
? ? 9:使用反射創(chuàng)建Servlet對(duì)象.
? ? ? Servlet obj = Class.forName("全限定名").newInstance();
? ? 10.把創(chuàng)建的Servlet對(duì)象,存儲(chǔ)到Servlet實(shí)例緩存池中,供下一次請(qǐng)求使用.
? ? ? ? cache.put("全限定名",obj);
? ? 11:容器創(chuàng)建ServletConfig對(duì)象,并調(diào)用init方法,來完成初始化操作.
? ? ? obj.init(config);
? ? 12:容器創(chuàng)建ServletRequest和ServletResponse對(duì)象,并調(diào)用service方法,處理請(qǐng)求.
? ? ? obj.service(req,resp);
? ? 13:在service方法中,對(duì)當(dāng)前請(qǐng)求的客戶端做相應(yīng).