如果大家要開發一個動態的網站,那么就必須要學習一種動態的網頁開發技術。那么在SUN提供的JavaEE中主要包含兩種開發動態網頁的技術:Servlet和jsp技術。
Servlet技術簡介Servlet技術是SUN提供的一種開發動態網頁的核心組件之一。可以方便的開發動態網頁。主要用得語言是java,開發者只需要實現相應的接口或者繼承相應的類,那么你的java文件就是一個動態的網頁。當然好需要一些額外的配置即可。
一個Servlet其實就是一個運行在web server上得一個java程序。
Servlet結構體系為了方便開發者進行基本的動態網頁開發,那么SUN提供了一整套接口和類幫助開發者進行高效的開發。
1 Servlet接口
2 GenericServlet類GenericServlet實現了Servlet接口的抽象類。
3 HttpServlet類
HttpServlet繼承了GenericServlet的抽象類。
Servlet體驗1. 建立動態網站的目錄結構2. 編寫一個動態網頁如下HelloServlet.javapackage cn.itcast.servlets;import javax.servlet.*;import java.io.*;public class HelloServlet extends GenericServlet{ public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException{ // 創建一個需要輸出的數據 String data = "hello servlet!"; // 將以上的數據發送給瀏覽器進行顯示 res.getOutputStream().write(data.getBytes()); }}3. 編譯以上的HelloServlet.java將JavaEE需要的jar包引入到classpath環境變量set classpath=%tomcat_home%/lib/servlet-api.jar編譯D:/test>javac -d . HelloServlet.java
4. 將編譯好的包連同class文件剪切到網站的WEB-INF/classes目錄5. 將class文件映射為瀏覽器需要的URL路徑
修改web.xml文件如下<?xml version="1.0" encoding="ISO-8859-1"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>helloservlet</servlet-name> <servlet-class>cn.itcast.servlets.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloservlet</servlet-name> <url-pattern>/helloservlet</url-pattern> </servlet-mapping></web-app>
6. 將編寫好的網站部署到tomcat的webapps目錄http://localhost:8080/test/helloservlet
運行結果:hello servlet
總結:
2 IDE體驗
1 Servlet接口
Servlet接口主要用于定義初始化servlet、處理用戶請求、從web server中移除servlet等生命周期方法。如果開發者需要實現servlet接口,那么推薦繼承GenericServlet或HttpServlet。
1. The servlet is constructed, then initialized with the init method. ? 構造函數、init()2. Any calls from clients to the service method are handled. ? service()3. The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized.
舉例1:體驗生命周期方法。
public class Demo2 extends GenericServlet { // 創建對象 public Demo2(){ System.out.總結:
1. servlet 執行的流程是:創建對象?初始化?處理用戶請求?銷毀2. 創建對象?初始化只是執行一次3. 銷毀在服務器關閉的時候進行執行4. 只有用戶第一次訪問servlet時候如果web server中沒有該servlet的對象那么才創建。(懶裝載)5. servlet定義的生命周期方法全部由web server自己調用(回調)6. servlet全部是單例7. 一般在實際開發中主要使用的service方法。
2 GenericServlet抽象類
該類是一個通用的servlet類,實現Servlet和ServletConfig接口。如果要實現HTTTP協議,那么請繼承HttpServlet類。
該類使得定義servlet變得簡單,提供了一些日志、ServletConfig、以及版本的方法。內部聲明了一個ServletContext接口類。
該類默認的對Servlet接口的方法進行空實現。但是對于init方法它獲取了傳遞進來的ServletConfig類賦值給了自己定義的ServletConfig成員變量。隨后調用了自己的inti()方法。
定義了唯一的一個抽象方法service().
3 HttpServlet抽象類
如果一個網站需要實現HTTP協議的Servlet,那么必須是HttpServlet的子類。那是作為HttpServlet的子類必須重寫以下方法中的至少一個:
doGet, if the servlet supports HTTP GET requests ? 處理用戶的GET請求doPost, for HTTP POST requests ? 處理用戶的POST請求doPut, for HTTP PUT requests ? 處理用戶的PUT請求doDelete, for HTTP DELETE requests ? 處理用戶的DELETE請求init and destroy, to manage resources that are held for the life of the servlet ? 生命周期方法getServletInfo, which the servlet uses to provide information about itself ? 獲取servlet信息
我們應該主要的重寫doGet和doPost方法。
舉例:使用HttpServlet實現處理用戶的請求。
public class Demo3 extends HttpServlet { public Demo3(){ System.out.println("創建對象"); } public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub super.init(config); System.out.println("初始化"); } // 處理用戶的get請求,地址欄直接回車、a、form默認 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("處理用戶的get請求"); } // form表單中的method修改為post public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("處理用戶的POST請求"); }}思考:HttpServlet繼承自GenericServlet實現了Servlet接口,但是自己使用doGet和doPost方法處理用戶的請求,那么還需要原來定義的service()?
Tomcat處理用戶請求的時候一定執行的Servlet接口中定義的service()
但是用請求的Servlet如果直接繼承了HttpServlet那么還是執行Servlet接口的service()方法
該方法中默認調用HttpServlet中自定義的實現了Http協議的service(),該方法中又將請求轉發給了相應的doGet或doPost()導致最終處理用戶請求的方法是doGet或doPost()。
但是如果開發者手工的重寫了Servlet接口的service方法,那么默認不能進行轉發。
舉例1: 閱讀以下程序的運行結果。
public class Demo3 extends HttpServlet { public Demo3(){ System.out.println("創建對象"); } public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub super.init(config); System.out.println("初始化"); } // 處理用戶的get請求,地址欄直接回車、a、form默認 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("處理用戶的get請求"); } // form表單中的method修改為post public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("處理用戶的POST請求"); } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { super.service(req, res); System.out.println("service方法"); } @Override public void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException { super.service(req, resp); System.out.println("httpservlet service"); }}運行結果如下:
創建對象
初始化
處理用戶的POST請求
httpservlet service
service方法
新聞熱點
疑難解答