?Servlet處理請求過程
B/S請求響應模型
?Servlet介紹
JSP是Servlet的一個成功應用,其子集。
JSP頁面負責前臺用戶界面,JavaBean負責后臺數據處理,一般的Web應用采用JSP+JavaBean就可以設計得很好了。
JSP+Servlet+JavaBean是MVC
Servlet的核心思想:在服務器端創建能響應用戶請求的對象,即Servlet對象。
Servlet類:屬于javax.servlet.http包中的HttpServlet類的子類。
Servlet 與 JSP 內置對象
獲得內置對象的方法
獲得 out 對象
JSP 中的 out 對象,一般可以使用 doXXX 方法中的 response 參數獲得
默認情況下,out 對象是無法打印中文
解決方法:response.setContentType("text/html;charset=gb2312");
獲得 request 和 response 對象
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//將 request 參數當成 request 對象使用
//將 response 參數當成 response 對象使用
}?
獲得 application 對象
?? ServletContext application = this.get ServletContext();
//將 application 當成 application 對象來使用
配置環境
使用servlet的步驟:
1.配置 servlet-api.jar
2.編碼 *.java
3.編譯生成字節碼文件 *.class
4.部署
5.調用
JDK 內置包中不包含編譯servlet源文件需要HttpServlet、HttpServletRequest等類,因此,需要在環境變量中包含 servlet.jar,這個 jar 文件在 TOMCAT 安裝目錄的 common\lib 文件下,如果沒有可以網上下載。
編輯 classpath,加入%CATALINA_HOME%\lib\servlet-api.jar
或將servlet.jar文件拷貝到jdk安裝目錄的jdk\jre\lib\ext中
部署Servlet
Hello.java
package china.dalian;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Hello extends HttpServlet
{? public void init(ServletConfig config) throws ServletException
???? {? super.init(config);?
???? }
?? public void service (HttpServletRequest request, HttpServletResponse response)? throws IOException
??? {? response.setContentType(“text/html;charset=gb2312”);
?????? PrintWriter out = reponse.getWriter();
?????? out.println(“<html><body>”);
?????? out.println(“<h2>歡迎學習servlet。</h2>”);
?????? out.println(“</body></html>”);
??? }
將生成的字節碼文件如 Hello.class 保存在Tomcat服務器 WEB-INF\classes 目錄下對應包名文件中,包名為? pakage china.dalian 在具體的目錄為
WEB-INF\classes\china\dalian
在Web根目錄下編輯 web.xml 文件,對 Servlet 文件進行配置
servlet 節:如何生成該servlet
servlet-mapping節:如何調用該servlet
Servlet與JSP的區別
?????? Servlet是使用Java Servlet接口(API)運行在Web應用服務器上Java程序,其功能十分強大,它不但可以處理Http請求中的業務邏輯,而且還可以輸出HTML代碼來顯示指定頁面。
?????? JSP是一種在Servlet規范之上的動態網頁技術,在JSP頁面之中,同樣可以編寫業務邏輯處理Http請求,也可以通過HTML代碼來編輯頁面,在實現功能上,Servlet與JSP貌似相同,實質存在一定的區別,表現在以下方面:
1、角色不同
2、編程方法不同
3、Servlet需要編譯后運行
4、速度不同
Servlet技術特點
?????? Servlet使用Java語言編寫,它不僅繼承了Java語言中的優點,而且Servlet還對Web的相關應用進行了封裝,同時Servlet容器還提供了對應用的相關擴展,無論是在功能、性能、安全等方面都十分優秀,其技術特點表現在以下方面。
1、功能強大
2、可移植
3、性能高效
4、安全性高
5、可擴展
Servlet代碼結構
?????? 在Java中,通常所說的Servlet是指HttpServlet對象,在聲明一個對象為Servlet時,需要繼承HttpServlet類。
??????? HttpServlet類是Servlet接口的一個實現類,繼承此類后,可以重寫HttpServlet類中的方法對HTTP請求進行處理。?Servlet 工作原理-生命周期
?
Servlet 工作原理-對象模型? Servlet 工作原理
public void init ( ServletConfig config ) throws ServletException
public void service ( HttpServletRequest request HttpServletResponse response ) throw ServletException, IOException
public destroy ( )n
init方法
<web-app>
? …
? <servlet>?
??? ? <servlet-name>InitExample</servlet-name>
??? ? <servlet-class>ServletInit</servlet-class>
? <init-param>
????? ? <param-name>login</param-name>
????? ? <param-value>snoopy</param-value>
??? ? </init-param>
? ? </servlet>
??????????? …
</web-app>
????? 對于web.xml中定義的param變量,可以通getInitParameter()? 方法來獲得。具體格式為:
String str = getInitParameter(“xxx”);

???? Servlet類可以直接繼承這個方法,一般不需要重寫。
?????????
??????????? public destroy()
?共享變量
??????? 在Servlet中聲明的某些成員變量,會被所有請求該servlet的用戶共享。
例 ??servlet共享變量來計算pi的值。
???? PI/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 ……
? doGet和doPost方法
??????? 服務器接收到用戶請求后,調用service方法檢查http的請求類型(如get、post),并在service方法中根據用戶的請求方式,對應地調用doGet和doPost方法。
???????? 因此,不必重寫service方法,可直接繼承service方法,在servlet類中重寫doPost或doGet方法達到同樣的效果。
?重定向與轉發
?重定向
??????? HttpServletResponse類中通過方法
void sendRedirect(java.lang.String location) 可實現頁面的跳轉。
???? ?response.sendRedirect (“xxx.jsp”);
注意:該方法跳轉后的頁面,不能獲得之前頁面用戶提交的數據。
?轉發
??????? RequestDispatcher對象可以把用戶對當前的JSP頁面或servlet的請求轉發給另一個JSP頁面或servlet,并且將請求對象和相應對象傳遞給目標頁面。
第一步:得到RequestDispatcher對象:
RequestDispatcher? rd = request.getRequestDispatcher(“xxx.jsp”);
第二步:轉發:
?? ?rd.forward( request, response);
轉發 vs 重定向
??????? HttpServletRequest對象可以調用getSession方法獲取用戶的session對象。該session對象即第四章中的session對象。
格式:
HttpSession session = request.getSession(true);
?????? 可以在servlet中使用session對象及其方法,實現對同一用戶的確認。
Servlet API編程常用接口和類
Servlet接口
方????法?? ?說????明
public void init(ServletConfig config)?? ?Servlet實例化后,Servlet容器調用此方法來完成初始化工作
public void service(ServletRequest request,ServletResponse response)?? ?此方法用于處理客戶端的請求
public void destroy()?? ?當Servlet對象應該從Servlet容器中移除時,容器調用此方法,以便釋放資源
public ServletConfig getServletConfig()?? ?此方法用于獲取Servlet對象的配置信息,返回ServletConfig對象
public String getServletInfo()?? ?此方法返回有關Servlet的信息,它是純文本格式的字符串,如作者、版本等
ServletConfig接口
方????法?? ?說????明
public String getInitParameter(String name)?? ?此方法返回String類型名稱為name的初始化參數值
public Enumeration getInitParameterNames()?? ?獲取所有初始化參數名的枚舉集合
public ServletContext getServletContext()?? ?用于獲取Servlet上下文對象
public String getServletName()?? ?返回Servlet對象的實例名
HttpServletRequest接口
方????法?? ?說????明
public String getContextPath()?? ?返回請求的上下文路徑,此路徑以“/”開關
public Cookie[] getCookies()?? ?返回請求中發送的所有cookie對象,返回值為cookie數組
public String getMethod()?? ?返回請求所使用的HTTP類型,如get、post等
public String getQueryString()?? ?返回請求中參數的字符串形式,如請求MyServlet?username=mr,則返回username=mr
public String getRequestURI()?? ?返回主機名到請求參數之間部分的字符串形式
public StringBuffer getRequestURL()?? ?返回請求的URL,此URL中不包含請求的參數。注意此方法返回的數據類型為StringBuffer
public String getServletPath()?? ?返回請求URI中的Servlet路徑的字符串,不包含請求中的參數信息
public HttpSession getSession()?? ?返回與請求關聯的HttpSession對象
HttpServletResponse接口
方????法?? ?說????明
public void addCookie(Cookie cookie)?? ?向客戶端寫入cookie信息
public void sendError(int sc)?? ?發送一個錯誤狀態碼為sc的錯誤響應到客戶端
public void sendError(int sc, String msg)?? ?發送一個包含錯誤狀態碼及錯誤信息的響應到客戶端,參數sc為錯誤狀態碼,參數msg為錯誤信息
public void sendRedirect(String location)?? ?使用客戶端重定向到新的URL,參數location為新的地址
HttpServlet類
????? GenericServlet類實現了javax.servlet.Servlet接口,為程序的開發提供了方便;但在實際開發過程中,大多數的應用都是使用Servlet處理HTTP協議的請求,并對請求作出響應,所以通過繼承GenericServlet類仍然不是很方便。javax.servlet.http.HttpServlet類對GenericServlet類進行了擴展,為HTTP請求的處理提供了靈活的方法。
???? public abstract class HttpServlet
? extends GenericServlet implements Serializable
GenericServlet類
?????? Servlet創建
????? 在編寫一個Servlet對象時,必須實現javax.servlet.Servlet接口,但在Servlet接口中包含5個方法,也就是說創建一個Servlet對象要實現這5個方法,這樣操作非常不方便。javax.servlet.GenericServlet類簡化了此操作,實現了Servlet接口。
???? ??public abstract class GenericServlet
? extends Object
? implements Servlet, ServletConfig,?? Serializable?? ?????
????? Servlet的創建十分簡單,主要有兩種創建方法。第一種方法為創建一個普通的Java類,使這個類繼承HttpServlet類,再通過手動配置web.xml文件注冊Servlet對象。此方法操作比較繁瑣,在快速開發中通常不被采納,而是使用第二種方法——直接通過IDE集成開發工具進行創建。
???? 使用集成開發工具創建Servlet非常方便,下面以Eclipse為例介紹Servlet的創建過程,其他開發工具大同小異。
Servlet配置
?????? 要使Servlet對象正常地運行,需要進行適當的配置,以告知Web容器哪一個請求調用哪一個Servlet對象處理,對Servlet起到一個注冊的作用。Servlet的配置包含在web.xml文件中,主要通過以下兩步進行設置。
??????????? (1)聲明Servlet對象
??????????? (2)映射Servlet

