web開發(fā)初級(jí)學(xué)習(xí)_第1頁
web開發(fā)初級(jí)學(xué)習(xí)_第2頁
web開發(fā)初級(jí)學(xué)習(xí)_第3頁
web開發(fā)初級(jí)學(xué)習(xí)_第4頁
web開發(fā)初級(jí)學(xué)習(xí)_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、oschina 軟件庫有一個(gè)分類web框架,該分類中包含多種編程語言的將近500個(gè)項(xiàng)目。web框架是開發(fā)者在使用某種語言編寫web應(yīng)用服務(wù)端時(shí)關(guān)于架構(gòu)的最佳實(shí)踐。很多web框架是從實(shí)際的web項(xiàng)目抽取出來的,僅和web的請(qǐng)求和響應(yīng)處理有關(guān),形成一個(gè)基礎(chǔ),在開發(fā)別的應(yīng)用項(xiàng)目的時(shí)候則可以從這個(gè)剝離出來的基礎(chǔ)做起,讓開發(fā)者更關(guān)注更具體的業(yè)務(wù)問題,而不是web的請(qǐng)求和響應(yīng)的控制??蚣芎芏?,但套路基本類似,幫你隱藏很多關(guān)于 http 協(xié)議細(xì)節(jié)內(nèi)容,專注功能開發(fā)。但對(duì)一個(gè)初學(xué)者來說,過早的接觸框架往往是事倍功半!同樣一個(gè)問題,換一種框架你可能需要從頭開始研究。下面是針對(duì)初學(xué) java 開發(fā) web 過程一

2、些個(gè)人見解和思路,高手可略過。1. 基本要求:java 編程基礎(chǔ)有良好的 java 語言編程基礎(chǔ),這是必須的,在討論 web 開發(fā)技術(shù)時(shí)提了一個(gè) java 編程基礎(chǔ)的問題會(huì)被鄙視的。2. 環(huán)境準(zhǔn)備 (eclipse + tomcat)選擇一個(gè)你喜愛的servlet容器,或者說大一點(diǎn)就是應(yīng)用服務(wù)器,推薦 tomcat 、resin 或者 jetty 這些輕量級(jí)的產(chǎn)品。這三個(gè)產(chǎn)品下載 zip 包解壓后就可以用了。如果你不熟悉 tomcat 的話請(qǐng)不要使用 exe 版本的 tomcat,那會(huì)徒增很多煩惱。也不建議在 eclipse 等一些開發(fā)環(huán)境中集成 tomcat 的做法,也會(huì)徒增煩惱。把應(yīng)用服務(wù)

3、器啟動(dòng)起來并能訪問到其默認(rèn)的頁面為準(zhǔn)。關(guān)于開發(fā)工具不推薦使用 myeclipse 和 eclipse 的 jee 版本,徒增煩惱、運(yùn)行緩慢而且還讓你無法了解 web 項(xiàng)目的結(jié)構(gòu)。普通的 eclipse 或者你喜歡的開發(fā)工具就足夠了,能支持普通 java 項(xiàng)目開發(fā)即可。為了方便,我做了一個(gè)最基本的java 項(xiàng)目 servletdemo.zip ,你可將它導(dǎo)入到 eclipse 里就是一個(gè)完整的、最簡單的 web 項(xiàng)目。然后將下面 xml 內(nèi)容替換 tomcat 下的 conf/server.xml 文件:01<?xml version='1.0' encoding='

4、;utf-8'?>02<server port="8005" shutdown="shutdown">03 <service name="catalina">04 <connector port="8080" protocol="http/1.1" connectiontimeout="20000"redirectport="8443" uriencoding="utf-8"/>05 &

5、lt;engine name="catalina" defaulthost="localhost">06 <host name="localhost">07 <context path="" docbase="d:workdirservletdemowebapp" reloadable="true"/>08 </host>09 </engine>10 </service>11</server>其中

6、d:workdirservletdemo 替換為你導(dǎo)入的項(xiàng)目路徑,再次啟動(dòng) tomcat 后在瀏覽器打開 http:/localhost:8080/hello 便可看到 hello world 的輸出信息。3. 了解 servlet 和 filter好了,我已經(jīng)把環(huán)境搭起來了,接下來該干嘛呢?前面的步驟為的是搭建一個(gè)測試的環(huán)境,然后讓你了解一個(gè)最基本的 java web 項(xiàng)目的結(jié)構(gòu)。一個(gè)最基本的 java web 項(xiàng)目所需的 jar 包只需要一個(gè) servlet-api.jar ,這個(gè) jar 包中的類大部分都是接口,還有一些工具類,共有 2 個(gè)包,分別是 javax.servlet 和 ja

7、vax.servlet.http。我把這個(gè)jar包放到了 webapp 目錄外的一個(gè)獨(dú)立 packages 文件夾里,這是因?yàn)樗械?servlet 容器都帶有這個(gè)包,你無需再放到web項(xiàng)目里,我們放到這里只不過是編譯的需要,運(yùn)行是不需要的。如果你硬是把 servlet-api.jar 放到 webapp/web-inf/lib 目錄下,那么 tomcat 啟動(dòng)時(shí)還會(huì)報(bào)一個(gè)警告信息。java web 項(xiàng)目還需要一個(gè)非常重要的配置文件 web.xml ,在這個(gè)項(xiàng)目中已經(jīng)被我最小化了,只保留有用的信息:01<?xml version="1.0" encoding=&quo

8、t;utf-8"?>02<!doctype web-app public "-/sun microsystems, inc./dtd web application 2.3/en"03 "04<web-app>05 06 <servlet>07 <servlet-name>hello_world</servlet-name>08 <servlet-class>demo.helloservlet</servlet-class>09 <load-on-startup&g

9、t;1</load-on-startup>10 </servlet>11 12 <servlet-mapping>13 <servlet-name>hello_world</servlet-name>14 <url-pattern>/hello</url-pattern>15 </servlet-mapping>16 17</web-app>每個(gè) servlet 都必須在 web.xml 中定義并進(jìn)行 url 映射配置,早期 java 開發(fā) web 在沒有框架滿天飛的時(shí)候,這個(gè)文件會(huì)定義

10、了大量的 servlet,或者有人為了省事干脆來一個(gè) /servlet/* 來通過類名直接調(diào)用 servlet。servlet 規(guī)范里還有另外一個(gè)非常重要而且非常有用的接口那就是 filter 過濾器。下面是一個(gè)最簡單的 filter 類以及相應(yīng)的定義方法:01package demo;02 03import java.io.ioexception;04 05import javax.servlet.filter;06import javax.servlet.filterchain;07import javax.servlet.filterconfig;08import javax.servl

11、et.servletexception;09import javax.servlet.servletrequest;10import javax.servlet.servletresponse;11import javax.servlet.http.httpservletrequest;12 13public class hellofilter implements filter 14 15 override16 public void init(filterconfig arg0) throws servletexception 17 system.out.println("fil

12、ter 初始化");18 19 20 override21 public void dofilter(servletrequest req, servletresponse res,22 filterchain chain) throws ioexception, servletexception 23 httpservletrequest request = (httpservletrequest)req;24 system.out.println("攔截 uri="+request.getrequesturi();25 chain.dofilter(req,

13、res);26 27 28 override29 public void destroy() 30 system.out.println("filter 結(jié)束");31 32在 web.xml 中的配置必須放在 servlet 的前面:01<?xml version="1.0" encoding="utf-8"?>02<!doctype web-app public "-/sun microsystems, inc./dtd web application 2.3/en"03 "04&l

14、t;web-app>05 06 <filter>07 <filter-name>hellofilter</filter-name>08 <filter-class>demo.hellofilter</filter-class>09 </filter>10 11 <filter-mapping>12 <filter-name>hellofilter</filter-name>13 <url-pattern>/*</url-pattern>14 </fil

15、ter-mapping>15 16 <servlet>17 <servlet-name>hello_world</servlet-name>18 <servlet-class>demo.helloservlet</servlet-class>19 <load-on-startup>1</load-on-startup>20 </servlet>21 22 <servlet-mapping>23 <servlet-name>hello_world</servlet-

16、name>24 <url-pattern>/hello</url-pattern>25 </servlet-mapping>26 27</web-app>訪問 http:/localhost:8080/hello 時(shí)看看 tomcat 控制臺(tái)有何輸出信息。4. servlet 和 http 的對(duì)應(yīng)關(guān)系servlet 是 j2ee 最重要的一部分,有了 servlet 你就是 j2ee 了,j2ee 的其他方面的內(nèi)容擇需采用。而 servlet 規(guī)范你需要掌握的就是 servlet 和 filter 這兩項(xiàng)技術(shù)。絕大多數(shù)框架不是基于 serv

17、let 就是基于 filter,如果它要在 servlet 容器上運(yùn)行,就永遠(yuǎn)也脫離不開這個(gè)模型。為什么 servlet 規(guī)范會(huì)有兩個(gè)包,javax.servlet 和 javax.servlet.http ,早先設(shè)計(jì)該規(guī)范的人認(rèn)為 servlet 是一種服務(wù)模型,不一定是依賴某種網(wǎng)絡(luò)協(xié)議之上,因此就抽象出了一個(gè) javax.servlet ,同時(shí)在提供一個(gè)基于 http 協(xié)議上的接口擴(kuò)展。但是從實(shí)際運(yùn)行這么多年來看,似乎沒有發(fā)現(xiàn)有在其他協(xié)議上實(shí)現(xiàn)的 servlet 技術(shù)。javax.servlet 和 javax.servlet.http 這兩個(gè)包總共加起來也不過是三十四個(gè)接口和類。你需要通

18、過 j2ee 的 javadoc 文檔 熟知每個(gè)類和接口的具體意思。特別是下面幾個(gè)接口必須熟知每個(gè)方法的意思和用途:· httpservlet· servetconfig· servletcontext· filter· filterconfig· filterchain· requestdispatcher· httpservletrequest· httpservletresponse· httpsession· 一些 listenser 類再次強(qiáng)調(diào) httpservletrequ

19、est 和 httpservletresponse 這兩個(gè)接口更應(yīng)該是爛熟于心。如果你從字面上無法理解某個(gè)方法的意思,你可以在前面那個(gè)項(xiàng)目的基礎(chǔ)上做實(shí)驗(yàn)看看其輸出,再不行你可以到討論區(qū)提問,這樣的提問非常明確,很多人都可以幫到你。為什么我這么強(qiáng)調(diào) httpservletrequest 和 httpservletresponse 這兩個(gè)接口,因?yàn)?web 開發(fā)是離不開 http 協(xié)議的,而 servlet 規(guī)范其實(shí)就是對(duì) http 協(xié)議做面向?qū)ο蟮姆庋b,http協(xié)議中的請(qǐng)求和響應(yīng)就是對(duì)應(yīng)了 httpservletrequest 和 httpservletresponse 這兩個(gè)接口。你可以通過

20、httpservletrequest 來獲取所有請(qǐng)求相關(guān)的信息,包括 uri、cookie、header、請(qǐng)求參數(shù)等等,別無它路。因此當(dāng)你使用某個(gè)框架時(shí),你想獲取http請(qǐng)求的相關(guān)信息,只要拿到 httpservletrequest 實(shí)例即可。而 httpservletresponse接口是用來生產(chǎn) http 回應(yīng),包含 cookie、header 以及回應(yīng)的內(nèi)容等等。5. 再談?wù)?sessionhttp 協(xié)議里是沒有關(guān)于 session 會(huì)話的定義,session 是各種編程語言根據(jù) http 協(xié)議的無狀態(tài)這種特點(diǎn)而產(chǎn)生的。其實(shí)現(xiàn)無非就是服務(wù)器端的一個(gè)哈希表,哈希表的key就是傳遞給瀏覽器的

21、名為 jsessionid 的 cookie 值。當(dāng)需要將某個(gè)值保存到 session 時(shí),容器會(huì)執(zhí)行如下幾步:a. 獲取 jsessionid 值,沒有的話就生成一個(gè),也就是 request.getsession() 這個(gè)方法b. 拿到的 httpsession 對(duì)象實(shí)例就相當(dāng)于一個(gè)哈希表,你可以往哈希表里存放數(shù)據(jù)(setattribute)c. 你也可以通過 getattribute 來獲取某個(gè)值而這個(gè)名為 jsessionid 的 cookie 在瀏覽器關(guān)閉時(shí)會(huì)自動(dòng)刪除。把 cookie 的 maxage 值設(shè)為 -1 就能達(dá)到瀏覽器關(guān)閉自動(dòng)刪除的效果。6. 關(guān)于 jsp首先我已經(jīng)不用

22、jsp 很多年了,現(xiàn)在一直是使用 velocity 模板引擎。任何一個(gè) jsp 頁面在執(zhí)行的時(shí)候都會(huì)編譯成一個(gè) servlet 類文件,如果是 tomcat 的話,這些生成的 java 文件會(huì)放置在 tomcat/work 目錄下對(duì)應(yīng)項(xiàng)目的子目錄中,例如 tomcat 生成的類文件如下:01package org.apache.jsp;02 03import javax.servlet.*;04import javax.servlet.http.*;05import javax.servlet.jsp.*;06import java.util.*;07 08public final class

23、 test_jsp extends org.apache.jasper.runtime.httpjspbase09 implements org.apache.jasper.runtime.jspsourcedependent 10 11 private static final jspfactory _jspxfactory = jspfactory.getdefaultfactory();12 13 private static java.util.list<string> _jspx_dependants;14 15 private javax.el.expressionfa

24、ctory _el_expressionfactory;16 private org.apache.tomcat.instancemanager _jsp_instancemanager;17 18 public java.util.list<string> getdependants() 19 return _jspx_dependants;20 21 22 public void _jspinit() 23 _el_expressionfactory = _jspxfactory.getjspapplicationcontext(getservletconfig().getse

25、rvletcontext().getexpressionfactory();24 _jsp_instancemanager = org.apache.jasper.runtime.instancemanagerfactory.getinstancemanager(getservletconfig();25 26 27 public void _jspdestroy() 28 29 30 public void _jspservice(final httpservletrequest request, final httpservletresponse response)31 throws ja

26、va.io.ioexception, servletexception 32 33 final pagecontext pagecontext;34 httpsession session = null;35 final servletcontext application;36 final servletconfig config;37 jspwriter out = null;38 final object page = this;39 jspwriter _jspx_out = null;40 pagecontext _jspx_page_context = null;41 42 43

27、try 44 response.setcontenttype("text/html;charset=utf-8");45 pagecontext = _jspxfactory.getpagecontext(this, request, response,46 null, true, 8192, true);47 _jspx_page_context = pagecontext;48 application = pagecontext.getservletcontext();49 config = pagecontext.getservletconfig();50 sessi

28、on = pagecontext.getsession();51 out = pagecontext.getout();52 _jspx_out = out;53 54 out.write("rn");55 out.write("<html>rn");56 out.write(" <title>test</title>rn");57 out.write(" <style>rn");58 out.write(" </style> rn")

29、;59 out.write(" <body>rn");60 out.write("<h1>test demo (oschina)</h1>rn");61 out.write("<table cellspacing="1" cellpadding="5">rn");62 63enumeration names=request.getheadernames();64while(names.hasmoreelements()65string name=(string)names.nextelement();66string value=request.getheader(name);67 68 out.write("rn");69 out.write(" <tr>rn");70 out.write(" <td>");71 out.print(name);72 out.write("</td>rn");73 out.write(" <td>

溫馨提示

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

評(píng)論

0/150

提交評(píng)論