Servlet

Servlet

1、什麼是Servletcss

Servlet 是由SUN公司提供的一門動態Web資源開發技術(規範,接口)

靜態Web資源: 不一樣的人去訪問看到的效果都是相同的
    HTML/css/js等
動態Web資源: 在不一樣的條件下看到的是不一樣的效果
    Servlet/JSP/.NET/PHP等

Servlet是本質上是一個Java程序,但和咱們以前接觸的Java程序不一樣的是,
Servlet沒法獨立運行(Servlet中沒有main函數)
須要將Servlet程序放在服務器中,由服務器調用才能夠執行!

運行在服務器中的Servlet程序做用是: 對服務器接收的請求進行處理(處理請求)

2、開發Servlet程序
一、開發Servlet程序的步驟html

1)寫一個類,須要實現一個Servlet接口或者繼承Servlet接口的子類
    Servlet
      |-- GenericServlet 實現了Servlet接口,並實現了其中的方法
                  |-- HttpServlet 繼承了GenericServlet,也實現了其中的方法
    在開發時,咱們只須要繼承HttpServlet,並繼承其中的方法便可!

2)在web.xml文件中配置Servlet對外訪問的路徑,再將Web應用發佈到服務器便可!

二、經過Eclipse建立一個Web應用java

注意事項:
1)Dynamic Web Version:選擇2.5版本,由於2.5版本以後是經過註解配置Servlet,
    註解配置Servlet是變簡單了,可是很差理解,所以咱們選擇2.5版本,
    使用xml配置Servlet(xml配置Servlet的信息不用咱們手寫,會自動生成!)    

2)Web項目推薦使用 Package Explorer 打開, 不要使用 Project Explorer!!

3)Web項目在Eclipse中的目錄結構
    CGB-Servlet-01(We項目)
        |-- src: 其中用於存放java源文件(xx.java),也能夠放配置文件(xml/properties)
        |-- build/classes: src源碼目錄中的東西通過編譯後,會放到classes目錄下
        |-- WebContent: 是Web應用的根目錄,其中能夠存放靜態Web資源文件、
                    編譯後的class文件、Web應用所依賴的jar包、web.xml文件等
                |-- WEB-INF
                      |-- lib: Web應用所依賴的jar包
                      |-- web.xml: web應用的核心配置文件(配置Servlet等)

二、運行Servlet程序web

第一種運行方式: 
    直接在要運行的文件(html/jsp/servlet等)上-->右鍵-->Run as-->Run On Server,
eclipse會幫咱們作以下幾件事兒:
1)將Servlet所在的Web項目(CGB-Servlet-01)發佈到服務器中
2)再啓動tomcat服務器
3)最後打開瀏覽器,在地址欄輸入路徑去訪問這個Servlet
Eclipse默認用內置瀏覽器去訪問Servlet,可是這個內置瀏覽器有bug,最好是使用本地的瀏覽器去測試!

第二種運行方式: 能夠本身手動將項目發佈到服務器、啓動服務器、打開瀏覽器輸入地址進行訪問!

三、Servlet在web.xml文件中的配置chrome

全限定類名(全類名): 包名.類名 或者 包名.接口名 
<servlet>    
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>com.tedu.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
1)每建立一個Servlet,eclipse會幫咱們生成至少8行配置信息
    這8行配置信息由一個Servlet標籤和一個servlet-mapping標籤組成
    這兩個標籤中的<servlet-name>標籤中的內容一致,決定了它倆是一組配置
2)<servlet-class>標籤中配置的當前Servlet類的全類名(包名.類名)
    未來服務器根據訪問路徑找到這個全類名,再利用反射+全類名能夠獲取當前Servlet類的實例    
3)<url-pattern>標籤中配置了外界該經過什麼路徑來訪問當前Servlet。
    也就是說,這裏配置什麼路徑,外界就得經過什麼路徑來訪問這個Servlet!

注意事項1: Servlet在Web.xml文件中的配置信息是在建立Servlet時,Eclipse幫咱們生成的
    若是Servlet不是經過Eclipse建立(好比是複製過來的),Eclipse不會生成Servlet
    配置信息, Servlet沒有配置信息是沒法訪問的(使用註解開發除外)!

注意事項2: 若是不知道什麼緣由,tomcat服務器啓動失敗了,能夠將Eclipse建立的Server刪除,
    再從新建立一份(刪除Server同時,也將左側的Servers項目從工做空間中刪除!)

注意事項3: 在將tomcat和Eclipse整合以後,tomcat默認開啓了熱部署功能:
    在修改了代碼後,不用從新發布,也不須要重啓服務器,就能夠運行最新的效果!
    (若是是建立了新的Servlet類,或者修改了web.xml文件,則須要重啓服務器,纔會生效!)

四、建立Servlet3.0或以上版本的項目數組

在Servlet3.0的項目中,沒有web.xml文件,沒法經過xml文件配置Servlet信息
而是經過註解方式配置Servlet相關信息

@WebServlet("/SecondServlet")
public class SecondServlet extends HttpServlet{}

在@WebServlet這個註解內容所配置的內容就是(xml方式)url-pattern中配置的訪問路徑
另外服務器經過掃描註解定位到當前這個Servlet,獲取該類的全路徑,
經過全路徑從硬盤上加載這個類到內存中,獲取該類的字節碼對象,再利用反射+字節碼對象建立該類的實例!

五、如何配置eclipse在右鍵-->run as運行一個Web資源以後,用本地的瀏覽器訪問測試瀏覽器

點擊Window --> Web Browser --> 若是右側有 Chrome 或者 Firefox 選擇其中的一個
若是沒有 chrome 或者 firefox, 能夠選擇 Default System...,即系統默認瀏覽器

Request

1、Request和Response介紹tomcat

當瀏覽器向服務器發請求,服務器在調用Servlet的service方法處理請求以前,會建立表明請求的Request對象,和表明響應的Response對象。
將這兩個對象傳遞給service方法,在service方法處理請求的過程當中,若是要獲取請求信息,能夠經過request提供的方法進行獲取;若是要向瀏覽器響應數據,能夠將數據先寫入到response緩衝區,等service方法執行結束,服務器會自動到response對象中獲取到要發送給瀏覽器的數據,按照Http協議的格式將數據發送給瀏覽器。

2、Request經常使用功能
一、獲取請求參數
1.1.什麼是請求參數?服務器

所謂的請求參數就是瀏覽器在發送請求時,帶給服務器的數據。
例如:在地址欄URL地址的後面能夠經過問號拼接參數,將數據帶給服務器
    http://www.baidu.com?user=zhangsan&psw=123&like=lanqiu
也能夠經過表單,將數據寫入表單項中,經過提交表單將數據帶給服務器
不管經過哪一種方式帶參數給服務器,參數均可以有多個,多個參數之間用&分隔,每個參數都包含參數名和參數值

1.2.如何獲取請求參數?app

http://www.baidu.com?user=zhangsan&psw=123&like=lanqiu&like=zuqiu
1)request.getParameter(String paramName) -- 返回String字符串
-- 經過請求參數的名字,獲取對應的參數值。好比傳入"user",返回"zhangsan"
-- 若是獲取的參數有多個值,該方法只會返回第一個值,好比傳入"like",只返回一個"lanqiu"
-- 若是獲取的參數是不存在的,該方法會返回null,好比傳入"uesr",此時會返回null值

2)request.getParameterValues(String paramName) -- 返回String[]數組
-- 經過請求參數的名字,獲取對應的全部參數值組成的數組。好比傳入"like",返回
    {"lanqiu", "zuqiu"}
-- 若是獲取的參數值只有一個,該方法仍然返回一個數組,好比傳入"user",返回 {"zhangsan"}
--  若是獲取的參數是不存在的,該方法會返回null,好比傳入"uesr",此時會返回null值

1.3.如何處理在獲取請求參數時出現的中文亂碼問題?

GET提交參數是經過URL地址後面拼接參數,將參數提交給服務器
POST提交參數是經過請求實體將參數提交給服務器
服務器在接收GET提交的參數時,默認使用UTF-8來進行接收(瀏覽器提交參數用的也是utf-8),所以獲取GET提交的參數沒有問題。
但服務器在接收POST提交的參數時,默認使用iso8859-1來進行接收,而這個編碼中沒有中文字符,所以在接收中文數據時,會出現亂碼問題。
解決方法是:通知服務器接收POST提交的參數時,也經過utf-8來進行接收
    request.setCharacterEncoding("utf-8");
注意:這行代碼要放在獲取參數的代碼以前執行!
    這行代碼只對POST提交生效,GET比較不受任何影響!

二、實現請求轉發

所謂的請求轉發是服務器內部資源之間的跳轉方式(從一個資源跳轉到另一個資源)
請求轉發(forward)的特色:
1)轉發是一次請求一次響應
2)轉發先後地址欄地址不會發生變化
3)轉發只能在同一個Web應用內部兩個資源之間進行跳轉
4)在轉發的兩個資源之間能夠利用request域(map)傳遞數據

請求轉發的實現代碼:
    /* 將請求轉發到 TestForward2 
     * TestForward2: http://localhost:8080/CGB-Servlet-03/TestForward2
     * 因爲服務器會在轉發的路徑前面自動的拼上項目路徑, 所以咱們在傳路徑時, 
     * 只須要傳項目路徑後面的路徑, 項目路徑及以前的路徑不傳
     */
    request.getRequestDispatcher( "/TestForward2" )
                .forward( request, response );

三、做爲域對象使用(須要配合轉發)

在請求轉發時,會將request對象傳遞給所轉發的資源(A--轉發-->B,會將A中的request傳遞給B)
能夠在轉發以前,往request的map中存入數據,再轉發,因爲轉發時會將request帶到所轉發的資源
在轉發的資源中,能夠經過request將map中攜帶的數據再取出來!

在ServletA中,往request的map中存入數據:
    request.setAttribute(String name, Object value);
    //將請求轉發到ServletB
    request.getRequestDispatcher("ServletB的路徑").forward(req,res);
在ServletB中,能夠經過request將map中的數據取出來:
    request.getAttribute(String name);

Response

一、實現請求重定向

請求重定向(Redirect)的特色:
1)重定向是兩次請求兩次響應
2)重定向先後地址欄地址會發生變化
3)進行重定向的兩個資源沒有限制,能夠是同一個Web應用,也能夠是不一樣的Web應用甚至能夠是不一樣的服務器
4)在重定向的過程當中不能夠經過request的map集合帶數據到目的地
實習請求重定向:
    response.sendRedirect("所重定向到資源的地址");

實現定時刷新:
    response.getWriter().write("<h1>恭喜您註冊成功,5秒後將會跳轉到登陸頁面...</h1>");
    response.setHeader( "Refresh", "5;url=http://localhost:8080/CGB-Servlet-03/login.html" );

    定時刷新和重定向的特色幾乎一致,惟一區別就是,重定向(轉發)都是當即跳轉,中間沒有任什麼時候間間隔,定時刷新能夠指定多少秒以後再進行跳轉, 在跳轉以前, 能夠輸出信息提示用戶(例如註冊成功後的提示:恭喜您註冊成功,5秒後將會跳轉到登陸頁面...)

相關文章
相關標籤/搜索