Web服務器
Weblogic(Oracle)
WebSphere(IBM)
JBoss(Redhat)
以上產品均收費珊泳,支持J2ee規(guī)范
Tomcat(Apache)
免費產品凳兵,僅支持部分J2ee規(guī)范
Tomcat
Tomcat是Apache的Jakarta項目中的一個核心項目胯舷,Tomcat服務器是一個免費的開放源代碼的Web應用服務器欧漱,屬于輕量級應用服務器论巍,實際上Tomcat部分是Apache服務器的擴展笨农,但它是獨立運行的荠医,所以當你運行tomcat時褂乍,它實際上作為一個與Apache獨立的進程單獨運行的持隧。
常見問題:
(1)閃退:tomcat軟件啟動時會默認在環(huán)境變量中尋找一個JAVA_HOME的變量,若沒有逃片,則啟動失敗屡拨,閃退。
(2)端口占用:tomcat啟動時所需要的端口被其它程序占用褥实。修復辦法是修改conf/server.xml,修改相關選項的port呀狼。
(3)項目主目錄錯誤:tomcat在啟動的時候會在環(huán)境變量中尋找CATALINA_HOME,并按照其值加載相關文件损离。
Http協(xié)議(超文本傳輸協(xié)議)
HTTP是一個基于請求與響應模式的哥艇、無狀態(tài)的、應用層的協(xié)議僻澎。
HTTP是建立在tcp/ip協(xié)議的基礎上的貌踏,它多了一層數據傳輸格式是否規(guī)范的處理。也就是說它是對瀏覽器客戶端和服務器之間數據傳輸格式的規(guī)范窟勃。
HTTP1.1版本中給出一種持續(xù)連接的機制祖乳,絕大多數的Web開發(fā),都是構建在HTTP協(xié)議之上的Web應用秉氧。
名詞:
URL:統(tǒng)一資源定位符,只能用于定位互聯(lián)網信息眷昆。是URI的子集。
URI:統(tǒng)一資源標記符,可用于定位本地、局域亚斋、互聯(lián)網資源作媚。
提交方式:
POST:這是一種安全的提交方式,提交內容會跟在請求實體內容后面帅刊,對于提交數據的大小沒有要求纸泡,使用隊列方式處理提交是的數據。
GET: 這是一種不太安全的提交方式(瀏覽器默認資源請求方式)厚掷,提交內容跟在地址欄請求后面弟灼,要求提交數據大小<2k。
HTTP請求
Accept: text/html,image/*? ? ? ? ? ? ? ? ? -瀏覽器接受的數據類型
Accept-Charset: ISO-8859-1? ? ? ? ? ? ? ? -瀏覽器接受的編碼格式
Accept-Encoding: gzip,compress? ? ? ? ? ? -瀏覽器接受的數據壓縮格式
Accept-Language: en-us,zh-? ? ? ? ? ? ? ? -瀏覽器接受的語言
Host: www.it315.org:80? ? ? ? ? ? ? ? ? ? -當前請求訪問的目標地址(主機:端口)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT? -瀏覽器最后的緩存時間
Referer: http://www.it315.org/index.jsp? ? ? ? ? ? -當前請求來自于哪里
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)? --瀏覽器類型
Cookie:name=eric? ? ? ? ? ? ? ? ? ? ? ? ? -瀏覽器保存的cookie信息
Connection: close/Keep-Alive? ? ? ? ? ? ? -瀏覽器跟服務器連接狀態(tài)冒黑。close: 連接關閉? keep-alive:保存連接田绑。
Date: Tue, 11 Jul 2000 18:23:51 GMT? ? ? ? -請求發(fā)出的時間
HTTP響應
Location: http://www.it315.org/index.jsp? -表示重定向的地址,該頭和302的狀態(tài)碼一起使用抡爹。
Server:apache tomcat? ? ? ? ? ? ? ? ? ? ? -表示服務器的類型
Content-Encoding: gzip? ? ? ? ? ? ? ? ? ? -表示服務器發(fā)送給瀏覽器的數據壓縮類型
Content-Length: 80? ? ? ? ? ? ? ? ? ? ? ? -表示服務器發(fā)送給瀏覽器的數據長度
Content-Language: zh-cn? ? ? ? ? ? ? ? ? ? -表示服務器支持的語言
Content-Type: text/html; charset=GB2312? ? -表示服務器發(fā)送給瀏覽器的數據類型及內容編碼
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT? -表示服務器資源的最后修改時間
Refresh: 1;url=http://www.it315.org? ? ? ? -表示定時刷新
Content-Disposition: attachment; filename=aaa.zip? -表示告訴瀏覽器以下載方式打開資源(下載文件時用到)
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search? ? ? -表示服務器發(fā)送給瀏覽器的cookie信息(會話管理用到)
Expires: -1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -表示通知瀏覽器不進行緩存
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive? ? ? ? ? ? ? -表示服務器和瀏覽器的連接狀態(tài)掩驱。close:關閉連接 keep-alive:保存連接
狀態(tài)響應碼
狀態(tài)代碼有三位數字組成,第一個數字定義了響應的類別冬竟,且有五種可能取值:
1xx:指示信息--表示請求已接收欧穴,繼續(xù)處理
2xx:成功--表示請求已被成功接收、理解泵殴、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:服務器端錯誤--服務器未能實現合法的請求
常見狀態(tài)代碼涮帘、狀態(tài)描述、說明:
200 OK? ? ? //客戶端請求成功
400 Bad Request? //客戶端請求有語法錯誤笑诅,不能被服務器所理解
401 Unauthorized //請求未經授權调缨,這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden? //服務器收到請求,但是拒絕提供服務
404 Not Found? //請求資源不存在吆你,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發(fā)生不可預期的錯誤
503 Server Unavailable? //服務器當前不能處理客戶端的請求弦叶,一段時間后可能恢復正常
Servlet
Servlet是工作在服務器端的java程序。
開發(fā)方式:
實現Servlet接口:可明顯看出servlet聲明周期妇多,要重寫5個方法
繼承GenericServlet類伤哺,重寫service()方法
繼承HttpServlet類,重寫doGet()和doPost()方法,可以講用戶請求按照提交方式做不同處理者祖。
映射路徑:
url-pattern 要么以/開頭立莉,要么以*開頭。
url-pattern 不能同時使用兩種匹配模式七问。
url-pattern 中的URL在多個servlet同時被匹配的情況下:精確匹配優(yōu)先級最高桃序,以后綴名匹配的方式優(yōu)先級最低。
聲明周期:
構造方法():servlet對象創(chuàng)建時調用
init():第一次訪問時調用
service():每次訪問時調用
destory():servlet對象銷毀是調用
自動加載:
servlet默認在第一次訪問時創(chuàng)建對象烂瘫,這樣會導致第一次訪問緩慢,為解決這個問題,
可以修改web.xml的<servlet>元素坟比,將servlet對象的創(chuàng)建時間提前至web.xml加載時芦鳍。
<load-on-startup>$num</load-on-startup>
這里的$num越大,創(chuàng)建優(yōu)先級越低
線程安全問題:
問題描述:servlet是單實例多線程的葛账,這種機制在多個線程訪問共享數據時就存在線程安全問題柠衅。
解決方案:將使用共享數據的部分代碼加鎖。
Request:通過HttpServletRequest對象獲取http請求信息
請求行:
getRequestURL():URL
getRequestURI():URI
getMethod():請求方式
getProtocol():版本協(xié)議
請求頭:
getHeader(String key):根據頭名稱獲取頭內容
getHeaderNames():得到所有的請求頭名稱籍琳,返回一個Enumeration迭代器
實體:
getInputStream():以輸入流的方式讀取實體內容(針對POST提交)
getQueryString():接受地址欄的數據(針對GET方式)
getPapameter(String key):獲取指定key的value菲宴,但是只可以用于一個返回值的情況
getParameterValues(Sting key):獲取指定key的value,可以用于多個返回值的情況
getParameterNames():得到所有的請求參數名稱趋急,返回一個Enumeration喝峦。
設置字符集,解決編碼問題:
方式一:
setCharacterEncoding("utf-8");
方式二:手動解碼
new String(req.getParameter($key).getBytes("iso-8859-1"),"utf-8");
方式三:更改整個tomcat的編碼集
<connector? ...? >最后加上URLEncoding="utf-8"
Response:通過HttpServletResponse對象設置http請求信息
響應行:
setStatus(int num):響應碼
響應頭:
setHeader(String key,String value)根據鍵值對設置響應頭
setContentType("text/html;charset=utf-8")? 設置瀏覽器解析格式及編碼
實體:
getoutputStream().write() 可以發(fā)送字符或者字節(jié)內容內容
getWriter().write() 只可發(fā)送字節(jié)內容呜达,但是效率比較高
注意:getWriter和getOutputStream二者只能選其一谣蠢,調用了其中一個就不能調用另一個了
sendRedirect(String url):請求重定向
ServletConfig:用于加載servlet中的初始化參數,在GenricServlet中已經創(chuàng)建,通過getServletConfig()即可獲取到
ServletContext getServletContext():獲取servlet上下文
String getInitParameter(String name):根據初始化參數名字得到對應的值
Enumeration<String> getInitParameterNames():獲取所有參數的名字
初始化參數的配置:配置在web.xml中
<servlet>
<init-param>
? <param-name>name</param-name>
? <param-value>value</param-value>
</init-param>
</servlet>
ServletContext:servlet上下文對象查近,代表當前web應用程序眉踱,一個應用只有一個servletContext,加載web應用是創(chuàng)建,關閉主機時銷毀霜威。
本對象可以通過getServletConfig()方法得到谈喳,本質上使用getServletConfig().getServletConetxt()得到。
常用API:
getContextPath():獲取web應用路徑
String getInitParameter(String name):根據初始化參數名字得到對應的值
Enumeration<String> getInitParameterNames():獲取所有參數的名字
初始化參數的配置:
<context-param>
? <param-name></param-name>
? <param-value></param-value>
</context-param>
ServletContext是一個作用于整個web應用的域對象戈泼,可以用于在多個servlet之間傳遞參數婿禽。
setAttribute(String key,Object value):添加
getAttribute(String key):查找
removeAttrtibute(String key):移除
RequestDispatcher getRequestDispatcher(String uri):url轉發(fā)
一般與forward(request,response)連用用于轉發(fā)
資源獲取路徑:
在java項目中,相對路徑中的.代表當前路徑
在javaweb項目中矮冬,相對路徑中的.代表當前應用的jvm啟動路徑谈宛。
web項目中加載資源的方式是
String getRealPath(String uri):獲取資源的絕對路徑字符串形式
InputStream getResourceAsStream():獲取資源的輸入流
關于轉發(fā)(sendRedirect)與轉向(forward)的異同:
(1)轉發(fā)和轉向都可以實現頁面的跳轉。
(2)轉發(fā)是地址欄會發(fā)生變化胎署,轉向時地址欄不會發(fā)生變化吆录。
(3)sendRedirect由response對象調用,forward有RequestDispatcher對象調用琼牧。
(4)轉發(fā)的原理是瀏覽器重新發(fā)起url請求恢筝,轉向是在服務器端直接跳轉。
(5)轉發(fā)對請求資源范圍沒有要求巨坊,轉向的請求資源范圍只能是本應用下的撬槽。
(6)轉向發(fā)生在一次url請求中,轉發(fā)是重新開啟一次url請求趾撵。
Cookie會話技術
Cookie會話是客戶端技術侄柔,是服務器保存在客戶端的信息文件共啃,同一臺客戶端默認是用共同的cookie區(qū)。
常用API:
創(chuàng)建:
Cookie cookie = new Cookie(String name,String value);
設置cookie相關參數:
setMaxAge(int seconds):存活時間暂题,默認是隨著瀏覽器關閉而滅亡
正整數:將cookie信息保存在瀏覽器的緩存目錄中移剪,數值表示存留時間,單位是s
負整數:將cookie信息保存在瀏覽器的內存中薪者,隨瀏覽器關閉而消失纵苛。
0:刪除同名cookie
setpath(String uri):有效訪問路徑(默認為當前應用),保證不同資源之間的cookie共享
寫到瀏覽器:
response.addCookie(cookie):底層是通過http響應的Set-Cookie實現
讀妊越颉:
Cookie[] request.getCookies():底層是讀取http請求的Cookie實現的
獲取cookie信息
getName():獲取cookie名稱
getValue():獲取cookie值
注意細節(jié):
(1)cookie是創(chuàng)建攻人、讀取在服務器,保存在客戶端的文件悬槽。
(2)cookie內部是一個類似于表格怀吻,以鍵值對形式存儲數據的。
(3)cookie只能保存簡單的字符串數據信息陷谱。
(4)cookie如果發(fā)生重名烙博,后面的cookie會替換前面的。
(5)瀏覽器默認保存不超過300個cookie烟逊,每個站點不超過20個渣窜,每個大小不超過4KB
(6)cookie無法存放中文字符,
Session會話技術
Session會話技術是服務器端技術宪躯,服務器會為每一個瀏覽器創(chuàng)建一個獨享的session對象乔宿,并將一個JSessionID發(fā)送給瀏覽器作為瀏覽器以后每次訪問的憑證。
常用API:
getSession(boolean):獲取
boolean:true或者不寫表示session存在返回访雪,不存在就創(chuàng)建再返回详瑞;false表示存在就返回,不存在就返回null
invalidate():注銷
setAttribute(String name.Object value):添加屬性
getAttribute(String name):獲取值
removeAttribute(String name):移除屬性
setMaxInactiveInterval(int minutes):設置session生命周期
session的默認生命周期為30min臣缀,也可以通過配置文件來調整:<session-timeout>$minutes</session-timeout>
注意細節(jié):
(1)session的實現是基于cookie的坝橡,所以其生命周期會受到cookie的影響。
(2)如果客戶禁用了cookie精置,就會導致session失效计寇,這是要用到URL重寫(就JSESSION寫到URLdizhilan來傳輸)
response.encodeRedirectURL(String url)
response.encodeURL(String url)
JSP
這是Sun公司推出的一款包裝版的Servlet技術,主要用于網頁的開發(fā)脂倦。
頁面訪問流程:
(1)如果是第一次訪問或者服務器文件發(fā)生了改動,走第(2)步;否則,走第(5)步;
(2)將jsp翻譯成.java文件(Servlet文件);
(3)將.java文件編譯成.class文件;
(4)將class文件加載到內存番宁,創(chuàng)建對象;
(5)執(zhí)行service()方法,將頁面回顯給瀏覽器.
語法:
注釋:
<%-- --%>:jsp注釋,推薦使用
<!-- -->:html注釋
腳本:
<% %>:用于在jsp中嵌入java代碼
聲明:
<%! %>:用于聲明變量或者函數赖阻,聲明的函數或者變量是成員屬性蝶押。
表達式:
<%= %>:相當于out.write()
指令:<%@ %>
>include:在當前頁面引入其它頁面內容,這里是靜態(tài)引入火欧,它會將其它文件的內容原封不動的全部引入到本文件棋电,然后合并翻譯成一個文件返回給瀏覽器茎截。
file:指定引入源文件
>targlib:
prefix:指定標簽前綴
uri:路徑
>page:
language="java"? ? ? ? --告訴服務器使用什么動態(tài)語言來翻譯jsp文件
import="java.util.*"? ? --告訴服務器java文件使用什么包,導入包离陶,多個包之間用逗號分割
pageEncoding="utf-8"? ? --告訴服務器使用什么編碼翻譯jsp文件(成java文件)
contentType="text/html; charset=utf-8" 服務器發(fā)送瀏覽器的數據類型和內容編碼
errorPage="error.jsp"? --指定當前jsp錯誤處理頁面
我們一般習慣是在web.xml里面使用全局配置稼虎,而不是直接在jsp里面指定錯誤頁面
<error-page>
<error-code>$num</error-code>
<location>$pathToErrorPage</location>
</error-page>
isErrorPage="false"? ? --指定當前頁面是否為錯誤處理頁面,在處理頁面可以拿到execption對象
buffer="8kb"? ? ? ? ? ? --out對象的緩存區(qū)大小
session="true"? ? ? ? ? --是否對當前頁面開啟session
isELIgnored="false"? ? --是否忽略EL表達式
9大內置對象:
由jsp進行過初始化的servlet API實例,可以在jsp中直接使用:
request--->HttpServletRequest
response-->HttpServletResponse
config---->SevletConfig
application-->ServletContext
session--->HttpSession
exception-->throwable
page---->Object(this)
out---->jspWriter:
這是一個帶緩沖的PrintWriter招刨,使用它作為輸出對象時,會先將數據寫入緩存區(qū)哀军,等滿足一定條件后再輸出到瀏覽器:
條件1:緩存區(qū)滿了時
2:關閉緩存區(qū)時
3:調用了flush()方法手動刷出時
4:jsp加載完成時
pageContext-->PageContext
pageContext的對象是PageContext沉眶,稱作jsp上下文,一般有兩個作用:
(1)從這個內置里面獲取其它8個內置對象
(2)本身也是一個域對象杉适,用來共享數據
保存數據:
setAttribute(String name,Object value,Scope scope):可以向四個域對象保存數據谎倔,如不指定,默認保存在page域
獲取數據:
getAttribute(String name,Scope scope):可以從指定域對象獲取數據猿推,如不指定片习,默認使用在page域
清除數據:
removeAttribute(String name,Scope scope):可以從指定域對象清除數據,如不指定蹬叭,默認使用在page域
域范圍常量:
PageContext.PAGE_SCOPE? ? ? ? page(當前頁)
PageContext.REQUEST_SCOPE? ? ? reques(當前請求)
PageContext.SESSION_SCOPE? ? session(當前session)
PageContext.APPLICATION_SCOPE? application(當前web應用)
自動在四個域中搜索數據:pageContext.findAttribute(String name);
順序:page域 -> request域 -> session域- > context域(application域)
EL表達式:
向瀏覽器輸出域對象中的變量值或表達式計算的結果(用于替換jsp中的<%= %>)
語法:
輸出簡單數據:${變量或表達式}
${name}================>pageContext.findAttribute(name)
${scope.name}==========>pageContext.getAttribute(name,scope)
輸出對象:${對象.屬性}
${class.name}==========>pageContext.getAttribute(class).getName()
輸出集合:${list[i]}
${list[i]}=============>pageContext.findAttribute(class).get(i)
表達式計算
標簽:
(1)內置標簽:
無需向jsp頁面導入標簽庫
<jsp:forward>轉發(fā)標簽
page:轉發(fā)的目標地址
<jsp:param>參數
name:參數名
value:參數值
<jsp:include>動態(tài)包含藕咏,包含和被包含文件分開編譯,生成兩個文件
file:被包含文件位置
(2)JSTL標簽:
核心標簽庫的重點標簽:
保存數據:
<c:set></c:set>
var:名字
value:值
scope:指定保存的域秽五,默認是pageContext
獲取數據:
<c:out></c:out>
value:輸出值
default:默認值
eacapeXml:是否對value值進行轉義
單條件判斷
<c:if></c:if>
test:判斷條件
多條件判斷
<c:choose>
<c:when test=""></c:when>可存在多個孽查,但是判斷條件不要出現交集
<c:otherwise></c:otherwise>
</c:choose>
循環(huán)數據
<c:forEach items="數據源" var="目標" begin="開始點"? end="結束點" step="步長">
index:迭代索引值()
conut:迭代次數()
varStatus:當前正在迭代的狀態(tài)對象
first:是否是第一個
last:是否是最后一個
</c:forEach>
<c:forTokens items="數據源" delims="分隔符" var="目標">
</c:forTokens>
重定向
<c:redirect></c:redirect>
(3)自定義標簽:
過濾器
Filter使得開發(fā)人員可以對web服務器管理的所有web資源進行攔截,然后對公共資源進行一些統(tǒng)一處理坦喘。
開發(fā)Filter:
1)開發(fā)一個過濾器需要將一個類實現Filter接口盲再,并實現其方法。
2)FilterAPI:
void init(FilterConfig f); 初始化方法瓣铣,在服務器啟動時候執(zhí)行
void doFilter(Request req,Response resp,FilterChain chain);過濾器攔截的業(yè)務處理方法
void destroy()銷毀過濾器實例時候調用
Filter生命周期:
和Servlet一樣Filter的創(chuàng)建和銷毀也是由WEB服務器負責答朋。
1)在應用啟動的時候就進行裝載Filter類(與Servlet的load-on-startup配置效果相同)。
2)容器創(chuàng)建好Filter對象實例后棠笑,調用init()方法,然后被Web容器保存進應用級的集合容器中去等待著調用梦碗。
3)當用戶訪問的資源正好被Filter的url-pattern攔截時,容器會創(chuàng)建Filter類對象腐晾,調用doFilter方法叉弦,后面訪問被攔截的資源時,Web容器會直接使用第一次創(chuàng)建Filter對象實例調用doFilter方法(Filter對象常駐留Web容器了)藻糖。
4)當應用服務被停止或重新裝載了淹冰,則會執(zhí)行Filter的destroy方法,Filter對象銷毀巨柒。
配置Filter:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>cn.asop.demo.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
攔截配置:
(1)根據請求的url攔截:
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
<url-pattern>/*.jsp</url-pattern>
<url-pattern>/Myservlet</url-pattern>
</filter-mapping>
(2)根據請求類型攔截:
<filter-mapping>
<dispatcher>REQUEST</dispatcher>//如果目標是直接訪問時樱拴,該過濾器將被調用
<dispatcher>FORWARD</dispatcher>//如果目標資源是通過RequestDispatcher的forward()方法訪問時柠衍,該過濾器將被調用
<dispatcher>INCLUDE</dispatcher>//如果目標資源是通過RequestDispatcher的include()方法訪問時,該過濾器將被調用
<dispatcher>ERROR</dispatcher>//如果在jsp頁面page指令中指定了error屬性,那么jsp中若出現了異常,在跳轉時晶乔,該瀏覽器將被調用珍坊。
</filter-mapping>
(3) 根據servlet-name攔截:
<filter-mapping>
<servlet-name>/index</servlet-name>
</filter-mapping>
注意細節(jié):
Filter執(zhí)行準則:先以此執(zhí)行每一個Filter的chain.doFilter()之前的部分,再去執(zhí)行后面的Servlet正罢,然后再一次倒序執(zhí)行每一個Filter的chain.doFilter()之后的部分;
Filter在執(zhí)行init()時可以通過FilterCionfig獲取web.xml中的初始參數:filterConfig.getInitParameter(String key)
監(jiān)聽器
Servlet監(jiān)聽器用于監(jiān)聽一些重要事件的發(fā)生阵漏,監(jiān)聽器對象可以在事情發(fā)生前、發(fā)生后可以做一些必要的處理翻具。
監(jiān)聽器類型:
監(jiān)聽request:
監(jiān)聽request對象的創(chuàng)建或銷毀:ServletRequestListener
監(jiān)聽request屬性的增刪改:ServletRequestAttributeListener
監(jiān)聽session:
監(jiān)聽session對象的創(chuàng)建或銷毀:HttpSessionListener
監(jiān)聽session屬性的增刪改:HttpSessionAttributeListener
監(jiān)聽servletContext:
監(jiān)聽servletContext對象的創(chuàng)建或銷毀:ServletContextListener
監(jiān)聽servletContext屬性的增刪改:ServletContextAttibuteListener
session相關監(jiān)聽器
HttpSessionBindingListener? 監(jiān)聽對象綁定(接觸)session上的事件
這個監(jiān)聽器用于監(jiān)聽session中存取對象履怯,跟其他監(jiān)聽器不同之處是:
(1)它不用在web.xml中生明監(jiān)聽器;
(2)它需要被監(jiān)聽的對象來實現這個接口,并實現其方法裆泳;
HttpSessionActivationListener(了解) 監(jiān)聽session序列化及反序列化的事件