servlet學習之路

第一個serverlet程序

創建一個dynamic web project 在創建一個包com.h 創建工程Hellohtml

package com.h;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class World extends HttpServlet{

	@Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
        // 首先將訪問修飾符覆寫爲public

        // 設置內容類型
         resp.setContentType("text/html");

        PrintWriter out = resp.getWriter();

        out.println("<html><head><title>Hello World Sample</title></head>");
        out.println("<body><h1>Hello World Title<h1><h2>" +new Date().toLocaleString() + "</h2></body></html>");
        out.flush();

    }
}

web.xmljava

<web-app
servlet>
    <servlet-name>He</servlet-name>
    <servlet-class>com.h.World</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>He</servlet-name><!--  servlet-name 要和上面的保持一致-->
    <url-pattern>/HelloWorld</url-pattern><!--  注意前面要有斜線-->
</servlet-mapping>
</web-app>

工程右鍵 runweb

localhost:8080/Hello/HelloWorld  上面/HelloWorld對應He對應上面的He對應com.h.World 在Hello目錄下在tomat的默認目錄下瀏覽器

生命週期緩存

  1. Servlet 生命週期:Servlet 加載--->實例化--->服務--->銷燬。服務器

  2. init():在Servlet的生命週期中,僅執行一次init()方法。它是在服務器裝入Servlet時執行的,負責初始化Servlet對象。能夠配置服務器,以在啓動服務器或客戶機首次訪問Servlet時裝入Servlet。不管有多少客戶機訪問Servlet,都不會重複執行init()。app

  3. service():它是Servlet的核心,負責響應客戶的請求。每當一個客戶請求一個HttpServlet對象,該對象的Service()方法就要調用,並且傳遞給這個方法一個「請求」(ServletRequest)對象和一個「響應」(ServletResponse)對象做爲參數。在HttpServlet中已存在Service()方法。默認的服務功能是調用與HTTP請求的方法相應的do功能。jsp

  4. destroy(): 僅執行一次,在服務器端中止且卸載Servlet時執行該方法。當Servlet對象退出生命週期時,負責釋放佔用的資源。一個Servlet在運行service()方法時可能會產生其餘的線程,所以須要確認在調用destroy()方法時,這些線程已經終止或完成。ide

url-pattern三種方式

 一、精確匹配: /directory/file1.jsp
 二、目錄匹配: /directory/*
 三、擴展匹配: *.jsp
 <filter>  
    <filter-name>authority</filter-name>  
    <filter-class>com.util.AuthorityFilter</filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>authority</filter-name>  
       <url-pattern>/pages/genbill/*</url-pattern>  
</filter-mapping>  
<filter-mapping>  
    <filter-name>authority</filter-name>  
    <url-pattern>/pages/cmm/*</url-pattern>  
</filter-mapping>


ServletConfig和ServletContext對象的做用和使用 初始化數據

<servlet>  
        <servlet-name>Servlet_03</servlet-name>  
        <servlet-class>com.enterise.always.servlet.Servlet_03</servlet-class>  
        <init-param>  
            <param-name>name_01</param-name>  
            <param-value>value_01</param-value>  
        </init-param>  
        <init-param>  
            <param-name>name_02</param-name>  
            <param-value>value_02</param-value>  
        </init-param>  
</servlet>  
<servlet-mapping>  
        <servlet-name>Servlet_03</servlet-name>  
        <url-pattern>/servlet/Servlet_03</url-pattern>  
</servlet-mapping>  
<context-param>  
     <param-name>context_param</param-name>  
     <param-value>value3</param-value>  
</context-param>

<init-param>就是初始化的數據  經過getInitParameter獲取數據post

String s1 = this.getInitParameter("name_02"); 

<context-param>就是初始化的數據  通getServletContext().getInitParameter("congtext_param")獲取數據

ServletContext servletContext=this.getServletContext();    //對SevletContext中參數進行操做

servletContext.getAttribute("count");    //獲取

servletContext.setAttribute("count",count); //修改

servlet轉發技術

//跳轉至下一個servlet  
RequestDispatcher dispatcher = context.getRequestDispatcher("/ResulstServlet");         
dispatcher.forward(request, response);

使用forward跳轉則後面的response輸出則不會執行,而用include來跳轉,則include的servlet執行完後,再返回到原來的servlet執行response的輸出

servlet 響應Response

setStatus 設置響應行 當中 狀態碼

setHeader 設置響應頭信息

getOutputStream 得到字節流 ---- 輸出響應體內容

getWriter 得到字符流 ---- 輸出響應體內容

文件拷貝 ---- 字節流 

分析文件內容 --- 字符流 (中文操做 字符流)

經常使用狀態碼 

200 請求處理成功

302 客戶端重定向

304 客戶端訪問資源沒有被修改,客戶端訪問本地緩存

404 訪問資源不存在

500 服務器內部出錯

登錄成功,5秒後自動跳轉XX頁面 

refresh:3;url=http://www.itcast.cn -------- 3秒後自動跳轉http://www.itcast.cn 網站 

<meta content="3;url=/day06/response/demo3/result.html" http-equiv="refresh"> ---- 完成3秒自動跳轉 

輸出中文信息

response.setCharacterEncoding("utf-8");    這個post,對get不起做用

response.setContentType("text/html;charset=utf-8");  通常使用這個

注意:

一、getOutputStream和getWriter 不能同時使用

二、必須在getOutputStream和getWriter 以前 設置響應 編碼 

三、getOutputStream和getWriter 輸出內容 是 HTTP響應體 

四、getOutputStream和getWriter 存在緩衝區的 ,在service方法結束時,自動關閉流,flush緩衝區內容


案例六 文件下載

第一種:經過超連接 完成文件下載 

* 若是瀏覽器能夠識別該文件格式,直接打開,只有連接文件瀏覽器不識別文件格式,纔會實現下載 

<a href = "/data/aa.zip">zip 下載</a>  文件zip下載相對目錄
<a href = "/data/b.jpg>jpg圖片</a>   圖片相對目錄但不下載直接打開和超連接同樣

第二種:經過Servlet程序實現下載 

原理:經過Servlet讀取目標程序,將資源返回客戶端

經過程序下載文件 設置兩個頭信息 Content-Type Content-Disposition 

<a href = "/工程目錄?filename=aa.zip">zip 下載</a>  文件zip下載相對目錄
<a href = "/工程目錄?filename=b.jpg>jpg圖片</a>   圖片相對目錄但不下載直接打開和超連接同樣

response.setContentType(getServletContext().getMimeType(filename));  ---- 設置文件類型 

response.setHeader("Content-Disposition", "attachment;filename="+ filename); ---- 設置文件以附件形式下載(對於瀏覽器識別格式文件)

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 得到文件名
        String filename = request.getParameter("filename");
        System.out.println(filename);
 
        response.setContentType(getServletContext().getMimeType(filename));
        response.setHeader("Content-Disposition", "attachment;filename="+ filename); 
 
        // 下載 讀取目標文件,經過response 將目標文件內容寫到客戶端
        // 絕對磁盤路徑 讀取文件
        String fullFilename = getServletContext().getRealPath(
                "/工程目錄/" + filename);
        InputStream in = new FileInputStream(fullFilename);
        OutputStream out = response.getOutputStream();
        int b;
        while ((b = in.read()) != - 1) {
            out.write(b);
        }
        in.close();
        out.close();
}
相關文章
相關標籤/搜索