Servlet服務器,轉發,重定向

1、Servlet服務器php

    一、Servlet的生命週期:html

        (1) Servlet的建立時間:java

                a. 瀏覽器第1次請求服務器的時候建立。web

                b. 在服務器運行的會後建立。(即在web.xml 文件中用 load-on-startup 配置建立)數據庫

// b. 配置
 <servlet>
    <servlet-name>ActionServlet</servlet-name>
    <servlet-class>com.wx.etc.ctrol.ActionServlet</servlet-class>
    <!-- 配置應用啓動時,建立Servlet實例 -->
    <load-on-startup>0</load-on-startup>   
  </servlet>
  
  //解釋說明:配置<load-on-startup>0</load-on-startup>:標記Tomcat容器是否在啓動的時候就加載這個servlet.
  (1) 當值爲0或者大於0時,表示容器在應用啓動時就加載這個servlet;
  (2) 當是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才加載。
    (3)  正數的值越小,啓動該servlet的優先級越高。

(2) Servlet會執行 初始化 init( ) 方法(只執行一次),而後執行 Service 方法 或者 doGet()/doPost()。下一次請求過來,會直接執行Service方法。服務器關閉時,會調用destroy( )方法進行銷燬。瀏覽器

HttpServlet在實現Servlet接口時,覆寫了service方法,該方法體內的代碼會自動判斷用戶的請求方式,如爲GET請求,則調用HttpServlet的doGet方法,如爲Post請求,則調用doPost方法。所以,開發人員在編寫Servlet時,一般只須要覆寫doGet或doPost方法,而不要去覆寫service方法緩存

//1. 實現 Servlet 接口
public class XxServlet implements Servlet{
 @Override
 public void destroy() {  
 }
 @Override
 public ServletConfig getServletConfig() {
  return null;
 }
 @Override
 public String getServletInfo() {
  return null;
 }
 @Override
 public void init(ServletConfig arg0) throws ServletException { 
 }
 @Override
 public void service(ServletRequest arg0, ServletResponse arg1)
   throws ServletException, IOException {  
 }
}
// 2. 繼承 HttpServlet 類。
public class XxServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
              throws ServletException, IOException {
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
              throws ServletException, IOException {
    }
}
// 注意:
    若出現405狀態碼: get請求進入了doPost()方法中處理了。 能夠在doGet()方法中加上 
    doPost(request,respopnse);  在 doPost()方法中加上 doGet(request,response);

(3) Servlet中獲取 url 請求路徑:安全

String uri=request.getRequestURI();
String path=uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));

if("/DeptListAllServlet".equals(path)){
   List<Dept>list=dao.findAllDept();
   HttpSession session=request.getSession();
   session.setAttribute("list", list);
   response.sendRedirect("./dept/DeptList.jsp");
   return;
  }
 if("/updatedept".equals(path)){
   int id=Integer.parseInt(request.getParameter("id"));
   Dept dept=dao.findDeptById(id);   //根據id獲取到該Id所對應的部門信息
   request.setAttribute("dept", dept);
   request.getRequestDispatcher("./DeptMod.jsp").forward(request, response);
   return;  
  }
  ...
// 在 web.xml 中配置 Servlet的訪問路徑
<servlet>
    <servlet-name>ActionServlet</servlet-name>
    <servlet-class>com.wx.etc.ctrol.ActionServlet</servlet-class>
  </servlet>
                 
  <servlet-mapping>
    <servlet-name>ActionServlet</servlet-name>                           
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

 

 

二、Get 和 Post 請求的區別:服務器

(1) get請求 進行數據提交,Form表單的數據會顯示在地址欄中 ,get 請求攜帶的數據量 較小,get請求的安全性比較低。session

 // GET請求實例
GET http://weibo.com/signup/signup.php?inviteCode=2388493434  
 Host: weibo.com  
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

    GET請求,請求的數據會附加在URL以後,以?分割URL和傳輸數據,多個參數用&鏈接。URL的編碼格式採用的是ASCII編碼,而不是uniclde,便是說全部的非ASCII字符都要編碼以後再傳輸。

(2) post請求 進行數據提交時,Form表單的數據不會顯示在地址欄上,post請求攜帶的數據量較大,post請求安全性高。

 //POST請求實例:
 POST /inventory-check.cgi HTTP/1.1  
 Host: www.joes-hardware.com  
 Content-Type: text/plain  
 Content-length: 18  
  
 item=bandsaw 2647

    POST請求:POST請求會把請求的數據放置在HTTP請求包的包體中。上面的item=bandsaw就是實際的傳輸數據。

所以,GET請求的數據會暴露在地址欄中,而POST請求則不會。

    一默認狀況下,表單提交的是GET請求,若是改爲POST請求,在Form表單中加上,method=「post」。

 

 3. HTTP 請求與響應

    HTTP的請求格式:

<method> <request-URL> <version>  
<headers>  
  
<entity-body>

    HTTP的響應報文格式:

<version> <status> <reason-phrase>  
<headers>  
  
<entity-body>
// status,狀態碼描述了請求過程當中發生的狀況
// reson-phrase 是數字狀態碼的可讀版本
// 常見的狀態碼以及含義以下:
// 200 OK 服務器成功處理請求
// 301/302 Moved Permanently(重定向)請求的URL已移走。響應報文中應該包含一個Location URL,說明資源如今所處的位置
// 304 Not Modified(未修改) 客戶的緩存資源是最新的,要客戶端使用緩存內容
// 404 Not Found 未找到資源
// 501 Internal Server Error 服務器遇到錯誤,使其沒法對請求提供服務

http數據包 包括如下 幾部分:

        請求頭:

                請求方式(get/post)

                請求的URL

                若干的消息頭

                實體內容:

                            當爲 POST 請求,提交的數據會放在實體內容裏面

                            若是是 GET 請求 ,提交的數據在URL中

 

 

二. 轉發 和 重定向

    1. 服務器向瀏覽器發送請求,默認是 轉發。

    2. 轉發 與 重定向 的區別。

        (1) 轉發 : 地址欄不變。只能轉發 到當前web 應用的路徑(Servlet路徑,JSP)。只發生一次請求:A---->C

 request.getRequestDispatcher("/xx.jsp").forward(request,response);
// 解釋:
// .forward(request,response) 用來向下一個 JSP頁面/Servlet 傳遞參數。

            應該儘可能避免使用轉發,要適時而用。由於是從 地址欄中 獲取到參數,因此一刷新頁面 地址欄,即進行相應的數據庫。

     

    (2) 重定向:地址欄 發生改變。產生一個新的請求,能夠從新定位到一個新的應用路徑(能夠是外部應用,也能夠是不一樣的web工程)。發生兩次請求:A---->B , B---->C

response.sendDirect("/*.do");
// response.sendDirect("/xx.jsp");

  A---->B 將 地址欄中 http://localhost:8080/web項目名/addUser.do?key=value 值 的url路徑 改變 產生一個302狀態碼,B---->C :是經過302狀態碼,從新發送一個新的請求。

相關文章
相關標籤/搜索