32.什么是Servlet
Servlet在Java Web服務(wù)器中就充當(dāng)了信息資源的最小表示單位斜脂,代表了一個用戶可以通過瀏覽器獲取的資源抓艳。Servlet可以進行無限的擴展,它可以使用Java的所有類庫資源帚戳,為用戶返回文本玷或、圖片、音頻片任、視頻等各類信息資源偏友。
從編程角度來看,Servlet是一個Java類对供,這個類需要實現(xiàn)Servlet接口位他,提供一個公開的無參數(shù)的構(gòu)造方法氛濒。由Web容器來控制它的創(chuàng)建、初始化鹅髓、提供服務(wù)舞竿、銷毀等。它的各種行為方式通過在web.xml文件中的配置來決定
33.Servlet的生命周期是怎么樣的
Servlet的生命周期分為4個階段:加載窿冯、初始化骗奖、提供服務(wù)和銷毀,這些過程都是由Web容器來掌控醒串。開發(fā)者關(guān)注最多的是初始化和提供服務(wù)兩個階段执桌,在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()方法以外的所有抽象方法的默認(rèn)實現(xiàn),可用于一般的Servlet開發(fā)禽篱。
- javax.servlet.http.HttpServlet畜伐。該類是開發(fā)者使用最多的一個類,它不但提供了所有抽象方法的默認(rèn)實現(xiàn)躺率,還提供了不同的方法以區(qū)分不同類型的HTTP請求玛界,例如doPost()、doGet()等悼吱。
35.如何在Servlet中獲取請求參數(shù)的值
在Servlet中慎框,任何負(fù)責(zé)做出響應(yīng)的方法(例如,service()后添、doPost()和doGet())都會包含一個ServletRequest對象參數(shù)笨枯,不管是POST還是GET的請求方式节榜,Servlet都可以通過ServletRequest接口的getParameter()或getParameterValues()方法獲取到价说。前者適用于只有一個值的參數(shù),后者多用于有多值的參數(shù)旁涤,例如粱檀,復(fù)選框(checkbox)
//獲取參數(shù)名為username的用戶名洲敢,返回字符串
String username = request.getParameter("username");
//獲取參數(shù)名為password的密碼,返回字符串
String password = request.getParameter("password");
//獲取參數(shù)名為hobby的愛好數(shù)組茄蚯,返回的是字符串?dāng)?shù)組
String[ ] hobbies = request.getParameterValues("hobby");
36.Forward(轉(zhuǎn)發(fā))和Redirect(重定向)的區(qū)別
Forward和Redirect代表了兩種請求轉(zhuǎn)發(fā)方式:直接請求轉(zhuǎn)發(fā)和重定向压彭。對應(yīng)到代碼里睦优,分別是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ā)是服務(wù)器行為哮塞;重定向是客戶端行為
- 轉(zhuǎn)發(fā)行為瀏覽器只做一次訪問請求刨秆;重定向行為瀏覽器做至少兩次的訪問請求。
- 轉(zhuǎn)發(fā)只能將請求轉(zhuǎn)發(fā)給同一個Web應(yīng)用中的組件忆畅;而重定向不僅可以重定向到當(dāng)前應(yīng)用程序中的其他資源衡未,還可以重定向到同一個站點上的其他應(yīng)用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源家凯。
- 轉(zhuǎn)發(fā)方法請求轉(zhuǎn)發(fā)過程結(jié)束后缓醋,瀏覽器地址欄保持初始的URL地址;重定向訪問過程結(jié)束后绊诲,瀏覽器地址欄由初始的URL地址變成重定向的目標(biāo)URL送粱。
- 轉(zhuǎn)發(fā)方法的調(diào)用者與被調(diào)用者之間共享相同的request對象和response對象,它們屬于同一個訪問請求和響應(yīng)過程掂之;而重定向的調(diào)用者與被調(diào)用者使用各自的request對象和response對象抗俄,它們屬于兩個獨立的訪問請求和響應(yīng)過程。
37.過濾器的作用和工作原理是什么
對于Web應(yīng)用程序來說世舰。過濾器是處于Web容器內(nèi)的一個組件动雹,它會過濾特定請求資源請求信息和響應(yīng)信息。一個請求來到的時候跟压,Web容器會判斷是否有過濾器與該信息資源關(guān)聯(lián)胰蝠,如果有,則交給過濾器一一的處理震蒋,然后再交給目標(biāo)資源茸塞,響應(yīng)的時候則以相反的順序交給過濾器處理,最后再返回給用戶瀏覽器查剖。
過濾器對應(yīng)Filter接口钾虐,開發(fā)者一般需要實現(xiàn)doFilter()方法,并在web.xml文件夾中提供相應(yīng)的配置梗搅。
38.監(jiān)聽器的作用和工作原理是什么
對于Web應(yīng)用程序來說禾唁,監(jiān)聽器是處于Web容器內(nèi)的一個組件,它會對Web容器中的3種范圍對象進行監(jiān)聽:request无切、session和application。當(dāng)這些范圍對象在創(chuàng)建或銷毀的時候丐枉,Web容器會主動的調(diào)用它們的初始化或銷毀的回調(diào)方法哆键,從而達(dá)到事件響應(yīng)的效果。根據(jù)范圍的不同瘦锹,JavaEE為開發(fā)者提供了如下一些監(jiān)聽器接口籍嘹。
- Request事件監(jiān)聽器接口ServletRequestListener
- Session事件監(jiān)聽器接口HttpSessionListener
- Application事件監(jiān)聽器接口ServletContextListener
39.JSP的運行機制是什么
當(dāng)客戶端發(fā)出一次對某個JSP的請求闪盔,Web容器處理該請求的過程如下:
- Web容器會檢驗JSP的語法是否正確
- 將JSP文件轉(zhuǎn)換成Servlet的源碼文件
- 編譯該源碼文件成為Class文件
- 創(chuàng)建一個該Servlet類的對象實例,以Servlet的方式為請求提供服務(wù)
40.JSP的內(nèi)置對象及其用途
- application:它代表了整個Web應(yīng)用程序辱士,與Servlet上下文是同一個概念
- session:Http會話對象
- request:請求對象
- response:返回對象
- out:寫出流對象泪掀,用于返回數(shù)據(jù)給客戶端
- page:普通的頁面對象
- pageContext:頁面上下文,代表頁面的一個運行環(huán)境颂碘,通過它可以獲取到其他對象异赫,如會話、請求等
- exception:用于錯誤頁面头岔,通過該對象可獲得異常的詳細(xì)信息
- config:配置對象塔拳,用于獲取初始化參數(shù)等數(shù)據(jù)
41.JSP如何使用JavaBean
JSP使用JavaBean有兩種方式:夾雜在HTML中的JSP腳本和JSP動作標(biāo)簽<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動作標(biāo)簽訪問JavaBean
為了簡化JavaBean的使用,JSP還提供了一組動作標(biāo)簽來幫助開發(fā)者使用JavaBean适掰,它們是:
- <jsp:useBean>颂碧,聲明和創(chuàng)建JavaBean
- <jsp:setProperty>,為JavaBean的屬性設(shè)置值
- 用<jsp:getProperty>类浪,獲得JavaBean的屬性值
42.如何使用迭代標(biāo)簽<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ù)范圍迭代