復(fù)習(xí)提綱
一 Servlet及web服務(wù)器相關(guān)概念(了解)
tomcat配置(能熟練操作)
二 Servlet基礎(chǔ)(重點,必須熟記于心)
a.Servlet的調(diào)用過程
b.Servlet接口
c.servlet的生命周期
d.MVC框架
e.Servlet的控制流轉(zhuǎn)
f.Servlet的url-pattern
三 Session(會話)和Cookie(熟記于心)
四 Servlet過濾器和監(jiān)聽器(熟練使用)
五數(shù)據(jù)庫連接池(了解)
一、Servlet及web服務(wù)器相關(guān)概念
Servlet,服務(wù)器端的小程序,它是相對于Applet而言的,Applet是客戶端小程序。
Servlet,能接受來自網(wǎng)絡(luò)的請求(form表單,以及其他的請求),并對不同請求作出不同的響應(yīng)
servlet是運行在web容器中, web容器可以控制Servlet對象的生命周期,控制請求由Servlet對象處理。
web服務(wù)器,這里的服務(wù)器不是硬件概念,而是軟件,常用的web服務(wù)器有 Tomcat,Jboss等,我們所用到的Tomcat是一個開源的服務(wù)器,Tomcat是一個用java語言編寫的web服務(wù)器,所以需要有相應(yīng)的java運行環(huán)境,也就是JVM,還要配置tomcat的具體路徑。
Tomcat的配置
JAVA_HOME=/XXX/XXX/(JDK路徑,bin的上一層目錄)
CATALINA_HOME=/XXXX/XXX
(tomcat的絕對路徑 windows中 X:\xxx\xxx linux /home/tarena/tomcat5)
Tomcat啟動:$ CATALINA_HOME/bin/startup.sh 或 startup.bat
Tomcat關(guān)閉:$ CATALINA_HOME/bin/shutdown.sh 或 shutdown.bat
Tomcat測試啟動是否成功:http://localhost:8080/或http://127.0.0.1:8080/可以訪問到tomcat的主頁就是啟動成功了。(這里建議使用127.0.0.1)
tomcat可以識別的資源只有在webapps文件夾下,webapps也就是web應(yīng)用文件夾,webapps下的文件夾這些文件夾中存放的就是web應(yīng)用,web應(yīng)用是有格式規(guī)范的:
XXX應(yīng)用
|- *.jsp *.html *.js *.css *.jpg
|- WEB-INF (受保護(hù)資源)
|- classes *.class
|- lib *.jar
|- web.xml
在tomcat服務(wù)器中,訪問應(yīng)用下的資源可以在端口號后加上web應(yīng)用文件夾的名字就可以看到資源
http://localhost:8080/xxx應(yīng)用/xxxx.html,靜態(tài)頁面只能放在web應(yīng)用的文件夾下,不能夠放在WEB-INF文件夾下,WEB-INF文件夾中的資源是受保護(hù)的,不能夠通過網(wǎng)絡(luò)訪問到。
Servlet基礎(chǔ)
Servlet,可以實現(xiàn)動態(tài)的輸出頁面,可以針對不同的請求作出不同的響應(yīng),可以實現(xiàn)頁面的跳轉(zhuǎn),Servlet可以充當(dāng)MVC模式中的控制層,而且servlet的優(yōu)點也在于此。
web服務(wù)器會在web應(yīng)用/WEB-INF/classes文件夾搜索要加載的class文件,所以我們寫的class文件要放在web應(yīng)用/WEB-IN/classes文件夾下。
設(shè)置servlet的類和訪問的方式
web.xml文件的配置,一個web.xml中可以配置多個Servlet
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>servlet的名字</servlet-name>
<servlet-class>servlet包名類名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet的名字(要和servlet標(biāo)簽中的相同)</servlet-name>
<url-pattern>指定servlet相對于應(yīng)用目錄的路徑</url-pattern>
</servlet-mapping>
</web-app>
catalina.sh run 帶控制臺啟動tomcat服務(wù)器。
a.Servlet的調(diào)用過程
1,用戶通過瀏覽器向web服務(wù)器發(fā)送請求
http://serverip:port/apppath
2,服務(wù)器為用戶定位資源
靜態(tài)資源:/a.html /a/b.html (這里的路徑是針對web應(yīng)用文件夾目錄)讀文件并把內(nèi)容發(fā)送到客戶端
動態(tài)資源:解析web.xml定位Servlet類的名字
裝載類(WEB-INF/classes|WEB-INF/lib/*.jar)
創(chuàng)建該對象的實例
Servlet ser=(Servlet)(Class.forName("servle的類名")).newInstance();
//我們寫的Servlet一定要實現(xiàn)Servlet接口或者繼承實現(xiàn)了Servlet接口的類
ser.service(request,response);
<servlet-mapping>
<servlet-name>servlet的名字(要和servlet標(biāo)簽中的相同)</servlet-name>
<url-pattern>指定servlet相對于應(yīng)用目錄的路徑</url-pattern>
</servlet-mapping>
url-parttern的配置,這個url就是Servlet的虛擬路徑,可以使用相對路徑或者是絕對路徑。
/xxx/xxx(絕對路徑) ,xxx(相對路徑),盡量使用絕對路徑。
訪問servlet的方法
http://serverip:port/應(yīng)用文件夾名/url-pattern
http的請求
get請求,post請求。
get請求在發(fā)出請求時會把參數(shù)寫在地址欄上,而post請求不會把要發(fā)送的參數(shù)顯示在地址欄上。
<form method="get" action="/應(yīng)用名/url-pattern">
......
</form>
b.Servlet接口
servlet接口的實現(xiàn)類中的service()方法,在繼承HttpServlet類時,如果沒有覆蓋父類的service()方法,那么父類的service()方法會根據(jù)請求類型不同的會分別調(diào)用覆蓋的doGet(),doPost()方法,如果響應(yīng)兩種請求的動作相同,那么可以直接覆蓋service()方法。如果覆蓋了
doGet(),doPost()方法之一,那么就會只對一種請求作出響應(yīng)。在瀏覽器的地址欄操作按回車鍵,或者是熱連接,都是get請求,form的method屬性如果不指定,默認(rèn)為get請求。
我們可以通過ServletRequest對象或HttpServletRequest對象的方法來獲取請求中傳送的參數(shù)。
getParameter(String name)方法,可以獲得form表單中指定名字的參數(shù),多參數(shù)同名時,只取一個。
getParameterNames(),可以獲得一個迭代器Enumeration,通過這個迭代器,來獲得form表單中參數(shù)的名字。
getParameterValues(String name)獲得指定的所有同名參數(shù)的值。
get請求,會將參數(shù)顯示在瀏覽器的地址欄上,其顯示格式,在地址之后會以問號開始,以'&'分隔參數(shù),可以通過HttpServletRequest對象的getQueryString()方法來獲得get請求的參數(shù)值。
ServletRequest對象的getInputStream()方法可以獲得一個由Socket得來的輸入流,可以使用這個流來實現(xiàn)文件的上傳。getReader()方法可以直接獲取post請求的參數(shù)。
ServletContext對象是Servlet的上下文對象,這個對象是在服務(wù)器啟動時創(chuàng)建的,他可以看作是
一個應(yīng)用的對象,他可以看作是包含Servlet,管理Servlet的對象。
c.servlet的生命周期
遵守servlet規(guī)范的類,就可以通過服務(wù)器產(chǎn)生對象(反射機(jī)制),并處理請求。
servlet接口中的方法
實現(xiàn)Servlet接口
public class TestServlet implements Servlet {
ServletConfig config;
public void init(ServletConfig config) throws ServletException {
this.config=config;
//這個ServletConfig對象是由服務(wù)器生成,也就是由系統(tǒng)提供的,
通過他可以獲得啟動信息。ServletConfig對象和Servlet是一一對應(yīng)的。
//這個方法是在Servlet創(chuàng)建后調(diào)用的。如果要是用到ServletConfig對象是一 定要為對象賦值。
}
public ServletConfig getServletConfig() {
return this.config;
}
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
...;//這個方法是用來處理請求的核心方法
}
public String getServletInfo() {
return "....";//這個是用來寫Servlet信息的,用來寫作者,以及版本信息
}
public void destroy() {
...;//這個方法是用來銷毀Servlet對象的
}
}
HttpServlet和GenericServlet都實現(xiàn)了Servlet接口。
HttpServlet中的service(HttpServletRequest request,HttpServletResponse response)方法是通過service(ServletRequest request,ServletResponse response)方法的調(diào)用來實現(xiàn)對請求的處理。
HttpServletRequest對象中的方法setAttribute(String name,Object o),可以使用HttpServletRequest對象來攜帶信息,并且可以通過getAttribute(String name)方法來獲得攜帶的信息,這兩個方法類似于map中的存取方法,setAttribute方法給數(shù)據(jù)加上標(biāo)識,getAttribute方法則是通過這個標(biāo)識來獲取數(shù)據(jù),可以使用這一對方法的前提就是要保證是同一個請求對象(HttpServletRequest)
HttpServletResponse類
HttpServletResponse是用來回應(yīng)用戶的操作的,它可以實現(xiàn)頁面的重定向。
sendRedirect(String location),是用這個方法指定要訪問的servlet,其參數(shù)是Servlet的url-pattern
如果使用了重定向,就不會保留原有的request對象。
Servlet的生命周期分為四個階段
1,創(chuàng)建Servlet對象,通過服務(wù)器反射機(jī)制創(chuàng)建Servlet對象,第一次請求時才會創(chuàng)建。(默認(rèn))
2,調(diào)用Servlet對象的init()方法,初始化Servlet的信息,init()方法只會在創(chuàng)建后被調(diào)用一次
3,響應(yīng)請求,調(diào)用service()或者是doGet(),doPost()方法來處理請求,這些方法是運行的在多線程狀態(tài)下的。
4,在長時間沒有被調(diào)用或者是服務(wù)器關(guān)閉時,會調(diào)用destroy()方法來銷毀Servlet對象。
可以通過web.xml文件可以配置Servlet對象的創(chuàng)建時間,
<load-on-startup>數(shù)字</load-on-startup>,表示服務(wù)器啟動時創(chuàng)建,并依照數(shù)字大小按順序創(chuàng)建,只有重要的Servlet才會是用這個設(shè)置。
可以通過<init-param>標(biāo)簽來配置初始化參數(shù),可以用ServletConfig對象的
getInitParameter(String name)方法來得到參數(shù)。
<init-param>
<param-name>...</param-name>
<param-value>...</param-value>
</init-param>
多線程下所操作的變量,如果操作的是一個變量,且兼有讀寫操作,就要考慮加上同步,但同步不能亂加,否則會造成死鎖問題。
init()和destroy()方法都是運行在單線程下的。
GenericServlet類中的有參和無參的init方法。
public void init(ServletConfig config)throws ServletException
{
this.config = config;
init();
}
public void init()throws ServletException
{
.....;//覆蓋了的無參的init()方法,會在Servlet創(chuàng)建時調(diào)用有參的init方法時
也會被調(diào)用。
}
HttpServlet類中參數(shù)不同的service方法的調(diào)用關(guān)系。
public void service(HttpServletRequest req,HttpServletResponse res){
.......;
.......;
}
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
HttpServletRequest request;
HttpServletResponse response;
try
{
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
}
catch(ClassCastException e)
{
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
Servlet的資源訪問
如果在Servlet中要使用到其他的資源,例如連接數(shù)據(jù)庫的驅(qū)動,可以放在tomcat服務(wù)器的文件夾下的common/lib下,這個目錄中存放的是一些在服務(wù)器啟動時就會加載的公共資源,一般在需要在應(yīng)用中使用特定的資源,也就是jar文件,那么不要放在common/lib下,如果common/lib下的jar文件過多會導(dǎo)致服務(wù)器啟動緩慢,應(yīng)用中使用到的jar文件要放在WEB-INF/lib下,就可以被服務(wù)器找到了。
如果要在Servlet中是用Hibernate的訪問數(shù)據(jù)庫的方法,那么就需要把hibernate需要的jar文件,放到WEB-INF/lib下就可以了,Xxxxxx.hbm.xml還是和實體類放在一起。hibernate.cgf.xml文件,要放在WEB-INF/classes下就可以了。
d.MVC框架
Model,模型層,這一層一般是進(jìn)行數(shù)據(jù)庫訪問,并且封裝對象,這一層中也存放對業(yè)務(wù)處理的代碼(業(yè)務(wù)層)、 與數(shù)據(jù)庫交互的代碼(DAO層)和實體類的信息,可以使用JavaBean來完成業(yè)務(wù)層,使用JDBC、 Hibernate或jpa完成DAO層的功能。
Ctrl,控制層,用來處理請求和調(diào)用模型層中相應(yīng)的方法,這一層是用來控制請求的響應(yīng)的,現(xiàn)在我們是使用Servlet來實現(xiàn)這一層,不過一般是會用開源的MVC框架來實現(xiàn)這層,例如struts、webwork或者是Spring的MVC框架。
View,表現(xiàn)層,他只用來顯示數(shù)據(jù)和收集必要數(shù)據(jù),收集數(shù)據(jù)的一般是form表單,不過要保證數(shù)據(jù)的正確性要是用JavaScript做前臺驗證,而且后臺驗證也是必不可少的,html、 JSP就是用來表現(xiàn)、顯示數(shù)據(jù)的。
e.Servlet的控制流轉(zhuǎn)
ServletContext,Servlet上下文對象,在每個Servlet中都會有一個ServletContext的引用,這個ServletContext是一個全局的對象,每個應(yīng)用中只有一個ServletContext對象。
HttpServlet中的getServletContext()方法,獲得ServletContext對象。
ServletContext類的getRequestDispatcher(String path)方法獲得一個RequestDispatcher對象,并且跳轉(zhuǎn)到指定的Servlet,getRequestDispatcher(String path)方法中的參數(shù)就是path,就是指定跳轉(zhuǎn)的Servlet的url-pattern。
RequestDispatcher類的forward(ServletRequest request, ServletResponse response) 方法,可以把請求對象轉(zhuǎn)發(fā)給其他的Servlet。
f.Servlet的url-pattern
url-pattern可以使用以下三種方式
1,確切路徑匹配,也就是給出確定的路徑 xxx/xxxx
2,模糊路徑匹配,也就是指給出一部分路徑,xxxx/*,他會匹配確定路徑,也就是xxxx/a 或者是xxxx/b都是可以匹配的
3,擴(kuò)展名匹配,也就是會匹配擴(kuò)展名,只要是擴(kuò)展名相同就匹配,xxx.xxx *.xx
注意:擴(kuò)展名匹配和確切路徑匹配不能放在一起使用,也就是不能寫成 xxxx/xxxx/xxx.xx,但是可以用
*.xxx。
ServletRequest對象的三個返回路徑的方法
getContextPath()獲得應(yīng)用的路徑,用動態(tài)獲取應(yīng)用路徑
getServletPath()獲得Servlet路徑,也就是form中的action,如果使用確切路徑那么就會是這個Servlet配置的url-pattern。
getPathInfo()使用模糊路徑匹配時會返回匹配模糊部分。
注意:在html的form表單的action中,如果使用了擴(kuò)展名匹配,一定要寫明/xxxxx/xxx.xx,不要寫成/xxxx/*.xx,在form的action中要盡量使用絕對路徑,也就是要用 應(yīng)用名/xxx.xx或者應(yīng)用名/xxx。
三、Session(會話)和Cookie
Session對象用來解決客戶端發(fā)送多個請求時用戶請求信息的存儲問題,但是他和ServletRequest對象是不同的,他會在有需要時創(chuàng)建,但是他的生命周期會比請求對象要長。Session對象的生命周期也是有限制的,如果長時間的沒有訪問,就會銷毀掉Session對象,可以通過Session對象的
setAttribute(String name, Object o) 和getAttribute(String name)來存取數(shù)據(jù)信息。Session是用戶級的對象。
public void service(ServletRequest request,ServletResponse response){
String user = request.getParameter("user");
String pass = request.getParameter("pass");
HttpSession session = request.getSession(true);//使用請求對象來創(chuàng)建Session
session.setAttribute("username", user);
session.setAttribute("passwd", pass);
}
getSession(true)就表示如果Session不存在就創(chuàng)建一個新的Session,并把Session的標(biāo)識SessionID寫到Cookie中,如果存在就是用這個Session。getSession(false)就是在Session不存在時不會創(chuàng)建新Session而是返回null。如果使用getSession()方法,就等同于getSession(true)。
注意:ServletRequest對象適用于傳輸大量的數(shù)據(jù),因為其生命周期比較短,可以有效的節(jié)省內(nèi)存資源。
大數(shù)據(jù)量的傳輸或保存不適合使用Session空間。
Cookie,是記錄用戶的Session信息,也可以記錄用戶的請求信息,也就是SessionID,來分辨哪一個用戶是否登陸過。在每次登陸時,還會將Cookie發(fā)送回服務(wù)器端,Cookie是用來跟蹤Session的。
public void service(ServletRequest request,ServletResponse response){
String user = request.getParameter("user");
String pass = request.getParameter("pass");
Cookie userCookie = new Cookie("user", user);
userCookie.setMaxAge(60 * 60 * 24 * 365);//設(shè)置Cookie的最大有效期,秒為單位
Cookie passCookie = new Cookie("pass", pass);
passCookie.setMaxAge(60 * 60 * 24 * 365);
response.addCookie(userCookie);
response.addCookie(passCookie);
}
面試題:描述Cookie和Session的作用,區(qū)別和各自的應(yīng)用范圍,Session工作原理。
cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案
session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案。
失效不同:
session
A.程序調(diào)用HttpSession.invalidate()
B.距離上一次收到客戶端發(fā)送的sessionid時間間隔超過了session的最大有效時間
C.服務(wù)器進(jìn)程被停止
Cookie 會一直存放在客戶端機(jī)器上,除非超出Cookie 的生命期限。
Session是由應(yīng)用服務(wù)器維持的一個服務(wù)器端的存儲空間,用戶在連接服務(wù)器時,會由服務(wù)器生成一個唯一的SessionID,用該SessionID 為標(biāo)識符來存取服務(wù)器端的Session存儲空間。而SessionID這一數(shù)據(jù)則是保存到客戶端,用Cookie保存的,用戶提交頁面時,會將這一 SessionID提交到服務(wù)器端,來存取Session數(shù)據(jù)。這一過程,是不用開發(fā)人員干預(yù)的。所以一旦客戶端禁用Cookie,那么Session也會失效。
四、Servlet過濾器和監(jiān)聽器
Servlet過濾器(Filter)
過濾器是用于過濾Servlet的請求和響應(yīng),過濾器是存在于請求和被請求資源之間的。
過濾器就像當(dāng)于一個中間件,請求要經(jīng)過過濾器,然后過濾器才去掉用Servlet,Servlet的響應(yīng)也會被過濾器截獲并作相應(yīng)的處理。
Filter是一個接口,要寫一個自己的Filter就只能實現(xiàn)Filter接口。
Filter也有自己的生命周期,他的生命周期和Servlet比較相似,也是會先調(diào)用init()方法,然后再調(diào)用核心的處理過濾的方法doFilter(),這個方法中可定義了過濾規(guī)則,然后是destory()方法銷毀Filter對象。
dofilter(ServletRequest request,ServletResponse response,FilterChain chain)
這個是過濾的核心方法,FilterChain的方法doFilter(ServletRequest request, ServletResponse response)也就是用過濾后的請求調(diào)用資源的方法,如果不寫這個方法,也就算不會去調(diào)用相應(yīng)的資源。
Filter的配置
Filter的配置和Servlet相似。
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>alan.filter.SessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/protected/*</url-pattern>
<!--這里的url-pattern就是要過濾的Servlet的url-pattern-->
<dispatcher>request</dispatcher>
<dispatcher>forward</dispatcher>
<dispatcher>include</dispatcher>
<!--上面的三個是過濾的范圍-->
</filter-mapping>
Servlet監(jiān)聽器
以下是3個Listener接口。
ServletRequestListener
HttpSessionListener
ServletContextListener
這三個監(jiān)聽器接口,分別監(jiān)聽Servlet中3種比較重要的對象的創(chuàng)建和銷毀。這三個接口中分別有監(jiān)聽該對象創(chuàng)建和銷毀事件的方法,服務(wù)器本身就是事件源。
listener的配置
<listener>
<listener-class>alan.servlet.listener.AlanContextListener</listener-class>
<!--listener-class也就是實現(xiàn)Listener接口的類-->
</listener>
Servlet中的重要對象(只針對應(yīng)用)
數(shù)量 生命周期 是否線程安全
ServletContext 1 全局的 不安全
只有在應(yīng)用關(guān)閉時才銷毀 需要加同步訪問
HttpSession 和用戶的 局部的 不安全
數(shù)量相同 只在有效時間內(nèi)存在 需要加同步訪問
ServletRequest 多個 局部的 線程安全
(HttpServletRequest) 只在service()和doGet()
doPost()中存在
五、數(shù)據(jù)庫連接池(了解)
數(shù)據(jù)庫連接池,也就是在沒有程序取連接時,可以事先創(chuàng)建好連接,連接池是一個運行在多線程環(huán)境下,提供數(shù)據(jù)庫連接的程序,在程序使用完數(shù)據(jù)庫連接后關(guān)閉數(shù)據(jù)庫連接的動作不再是關(guān)閉連接的操作,而是把數(shù)據(jù)庫連接放回連接池,也就是這個數(shù)據(jù)庫連接已經(jīng)是空閑狀態(tài),就可以供其他的程序取用了。
配置Tomcat服務(wù)器的數(shù)據(jù)源
在tomcat下的conf目錄中的tomcat-users.xml文件中配置的是tomcat的用戶
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager" description=""/>
<role rolename="admin"/><!--配置管理員-->
<user username="manager" password="123" fullName="" roles="manager"/>
<user username="admin" password="123" roles="admin"/>
<!--配置管理員的用戶名和密碼,并且標(biāo)明是管理員roles="admin"-->
</tomcat-users>
<Resource
name="jdbc/oracle" 配置JDNI的名字
type="javax.sql.DataSource" 綁定資源的類型
password="sd0605"
driverClassName="oracle.jdbc.driver.OracleDriver" 驅(qū)動名
maxIdle="1"最大連接數(shù)
maxWait="-1"等待時間,配置為-1就是無限等待,只到有空閑連接為止
username="sd0605"
url="jdbc:oracle:thin:@192.168.0.39:1521:TARENADB"
maxActive="3" 最大活動連接數(shù)/>
以下的就是從連接池去取數(shù)據(jù)庫連接的代碼
public static Connection getConnection(String JNDIName)
{
Connection conn = null;
try
{
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
//這個是在tomcat下默認(rèn)綁定Context的JNDIname
DataSource ds = (DataSource) envCtx.lookup(JNDIName);
conn = ds.getConnection();
} catch (NamingException ne)
{
ne.printStackTrace();
} catch (SQLException se)
{
se.printStackTrace();
}
return conn;
}
posted on 2009-03-31 19:42
faye 閱讀(572)
評論(0) 編輯 收藏