32.什么是Servlet
Servlet在Java Web服務器中就充當了信息資源的最小表示單位,代表了一個用戶可以通過瀏覽器獲取的資源。Servlet可以進行無限的擴展,它可以使用Java的所有類庫資源,為用戶返回文本、圖片、音頻、視頻等各類信息資源。
從編程角度來看,Servlet是一個Java類,這個類需要實現(xiàn)Servlet接口,提供一個公開的無參數(shù)的構(gòu)造方法。由Web容器來控制它的創(chuàng)建、初始化、提供服務、銷毀等。它的各種行為方式通過在web.xml文件中的配置來決定
33.Servlet的生命周期是怎么樣的
Servlet的生命周期分為4個階段:加載、初始化、提供服務和銷毀,這些過程都是由Web容器來掌控。開發(fā)者關注最多的是初始化和提供服務兩個階段,在init()方法中,開發(fā)者可以獲取配置在web.xml中的初始化參數(shù)service()方法中的代碼,會在Servlet的請求來到時被調(diào)用。
34.Servlet接口有哪些實現(xiàn)類
在Java EE的SDK中,一共提供了以下3個Servlet接口的實現(xiàn)類
- javax.faces.webapp.FacesServlet。用于JSF的Servlet,一般很少使用
- javax/servlet.GenericServlet。它是一個抽象類,不能直接使用,它提供了除server()方法以外的所有抽象方法的默認實現(xiàn),可用于一般的Servlet開發(fā)。
- javax.servlet.http.HttpServlet。該類是開發(fā)者使用最多的一個類,它不但提供了所有抽象方法的默認實現(xiàn),還提供了不同的方法以區(qū)分不同類型的HTTP請求,例如doPost()、doGet()等。
35.如何在Servlet中獲取請求參數(shù)的值
在Servlet中,任何負責做出響應的方法(例如,service()、doPost()和doGet())都會包含一個ServletRequest對象參數(shù),不管是POST還是GET的請求方式,Servlet都可以通過ServletRequest接口的getParameter()或getParameterValues()方法獲取到。前者適用于只有一個值的參數(shù),后者多用于有多值的參數(shù),例如,復選框(checkbox)
//獲取參數(shù)名為username的用戶名,返回字符串
String username = request.getParameter("username");
//獲取參數(shù)名為password的密碼,返回字符串
String password = request.getParameter("password");
//獲取參數(shù)名為hobby的愛好數(shù)組,返回的是字符串數(shù)組
String[ ] hobbies = request.getParameterValues("hobby");
36.Forward(轉(zhuǎn)發(fā))和Redirect(重定向)的區(qū)別
Forward和Redirect代表了兩種請求轉(zhuǎn)發(fā)方式:直接請求轉(zhuǎn)發(fā)和重定向。對應到代碼里,分別是RequestDispatcher類的forward()方法和HttpServletResponse類的sendRedirect()方法。在Servlet中調(diào)用轉(zhuǎn)發(fā)和重定向的語句如下:
request.getRequestDispatcher("new.jsp").forward(request,response);//轉(zhuǎn)發(fā)
response.sendRedirect("new.jsp"); //重定向
- 轉(zhuǎn)發(fā)是服務器行為;重定向是客戶端行為
- 轉(zhuǎn)發(fā)行為瀏覽器只做一次訪問請求;重定向行為瀏覽器做至少兩次的訪問請求。
- 轉(zhuǎn)發(fā)只能將請求轉(zhuǎn)發(fā)給同一個Web應用中的組件;而重定向不僅可以重定向到當前應用程序中的其他資源,還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源。
- 轉(zhuǎn)發(fā)方法請求轉(zhuǎn)發(fā)過程結(jié)束后,瀏覽器地址欄保持初始的URL地址;重定向訪問過程結(jié)束后,瀏覽器地址欄由初始的URL地址變成重定向的目標URL。
- 轉(zhuǎn)發(fā)方法的調(diào)用者與被調(diào)用者之間共享相同的request對象和response對象,它們屬于同一個訪問請求和響應過程;而重定向的調(diào)用者與被調(diào)用者使用各自的request對象和response對象,它們屬于兩個獨立的訪問請求和響應過程。
37.過濾器的作用和工作原理是什么
對于Web應用程序來說。過濾器是處于Web容器內(nèi)的一個組件,它會過濾特定請求資源請求信息和響應信息。一個請求來到的時候,Web容器會判斷是否有過濾器與該信息資源關聯(lián),如果有,則交給過濾器一一的處理,然后再交給目標資源,響應的時候則以相反的順序交給過濾器處理,最后再返回給用戶瀏覽器。
過濾器對應Filter接口,開發(fā)者一般需要實現(xiàn)doFilter()方法,并在web.xml文件夾中提供相應的配置。
38.監(jiān)聽器的作用和工作原理是什么
對于Web應用程序來說,監(jiān)聽器是處于Web容器內(nèi)的一個組件,它會對Web容器中的3種范圍對象進行監(jiān)聽:request、session和application。當這些范圍對象在創(chuàng)建或銷毀的時候,Web容器會主動的調(diào)用它們的初始化或銷毀的回調(diào)方法,從而達到事件響應的效果。根據(jù)范圍的不同,JavaEE為開發(fā)者提供了如下一些監(jiān)聽器接口。
- Request事件監(jiān)聽器接口ServletRequestListener
- Session事件監(jiān)聽器接口HttpSessionListener
- Application事件監(jiān)聽器接口ServletContextListener
39.JSP的運行機制是什么
當客戶端發(fā)出一次對某個JSP的請求,Web容器處理該請求的過程如下:
- Web容器會檢驗JSP的語法是否正確
- 將JSP文件轉(zhuǎn)換成Servlet的源碼文件
- 編譯該源碼文件成為Class文件
- 創(chuàng)建一個該Servlet類的對象實例,以Servlet的方式為請求提供服務
40.JSP的內(nèi)置對象及其用途
- application:它代表了整個Web應用程序,與Servlet上下文是同一個概念
- session:Http會話對象
- request:請求對象
- response:返回對象
- out:寫出流對象,用于返回數(shù)據(jù)給客戶端
- page:普通的頁面對象
- pageContext:頁面上下文,代表頁面的一個運行環(huán)境,通過它可以獲取到其他對象,如會話、請求等
- exception:用于錯誤頁面,通過該對象可獲得異常的詳細信息
- config:配置對象,用于獲取初始化參數(shù)等數(shù)據(jù)
41.JSP如何使用JavaBean
JSP使用JavaBean有兩種方式:夾雜在HTML中的JSP腳本和JSP動作標簽<jsp:useBean>
- 純JSP實現(xiàn)
這種方式采用的是純粹的Java代碼來創(chuàng)建JavaBean對象和使用JavaBean,此時的JavaBean跟一個普通類沒什么區(qū)別,示例代碼如下:
<%
HelloBean bean = new HelloBean(); //創(chuàng)建HelloBean對象
pageContext.setAttribute("helloBean", bean); //把bean放在page范圍中
%>
<%
HelloBean bean2 = pageContext.setAttribute(); //獲得HelloBean對象
response.write(bean2.getName()); //使用bean
%> - 用JSP動作標簽訪問JavaBean
為了簡化JavaBean的使用,JSP還提供了一組動作標簽來幫助開發(fā)者使用JavaBean,它們是:
- <jsp:useBean>,聲明和創(chuàng)建JavaBean
- <jsp:setProperty>,為JavaBean的屬性設置值
- 用<jsp:getProperty>,獲得JavaBean的屬性值
42.如何使用迭代標簽<c:forEach>循環(huán)顯示數(shù)據(jù)
- 語法:
- 使用begin和end屬性進行整數(shù)范圍迭代
<c:forEach begin="20" end="50" var="i" step="2">
偶數(shù):<c:out value="${i}"/>
</c:forEach> - 使用items和var屬性進行集合迭代
<table>
<tr>
<th>編號</th>
<th>用戶名</th>
<th>年齡</th>
<th>性別</th>
</tr>
<c:forEach items="${users}" var="user" varStatus="status">
<tr>
<th>編號</th>
<th>用戶名</th>
<th>年齡</th>
<th>性別</th>
</tr>
</c:forEach>
</table>
- 使用begin和end屬性進行整數(shù)范圍迭代