1. 程式人生 > >Web常用對象(2)

Web常用對象(2)

pat msd png cookie 過多 max 是否 writer aps

一、Session

  1、介紹

    HttpSession是一個純粹的接口,session本身就屬於HTTP協議的範疇。

    session的作用就是為了標識一次會話,或者說確認一個用戶;並且在一次會話(一個用戶多次請求)期間共享數據。

  2、創建對象和屬性操作

    技術分享圖片

  3、表示會話JSESSIONID

    每當一次請求到達服務器,如果訪問了session,服務器會第一步查看是否從客戶端回傳一個名為JSESSION的Cookie,如果沒有則認為這是一次新的會話,會創建一個新的session對象,並用唯一的JSESSIONID為此次會話做一個標誌,如果有則認為這是之前標誌過的一次會話,返回該對象,達到數據共享

  4、session作用域

    和request域一樣可以通過setAttribute(name,value);方法向域對象中添加數據,通過getAttribute(name)從域對象中獲取數據,通過removeAttribute(name)從域對象中移除數據。

    技術分享圖片

  

  5、session的銷毀

    因為session底層依賴Cookie實現,並且該Cookie的有效時間為關閉瀏覽器,所以關閉瀏覽器session失效

    當非正常關閉服務器時,session銷毀;當正常關閉服務器時,session將被序列化到磁盤上,下次啟動服務自動加載到內存。

      序列化:把對象和其狀態存到本地磁盤

    1)默認時間到期

      Tomcat中session默認存活時間為30min,一旦有操作session會重新計時。

    2)自己設定到期時間

      ·可以在Tomcat中的web.xml文件中進行修改

      ·session.setMaxInactiveInterval(int); 以秒為單位

    3)立刻失效

      session.invalidate();

    session的銷毀或失效意味著本次會話技術,數據共享結束。

二、ServletContext對象

  1、介紹

    每一個web應用有且僅有一個ServletContext對象,又稱Application對象,該對象是與應用程序相關的,當WEB容器啟動時,會為每一個WEB應用程序創建一個對應的ServletContext對象。

  2、ServletContext對象的作用

    1)作為域對象用來共享數據,此時數據在整個應用程序中共享

    2)該對象中保存了當前應用程序的相關信息,可以通過方法獲取。

      技術分享圖片

  3、ServletContext對象的四種獲取方法

    技術分享圖片

  4、作為域對象

    通過向ServletContext中存取數據,可以使得整個應用程序共享某些數據,不建議存放過多數據,因為ServletContext中的數據一旦存儲進去沒有手動移除會一直保存

    技術分享圖片

三、文件上傳下載

  1、文件上傳

    前臺頁面:

      請求方式為POST,form表單的enctype必須設為“multipart/form-data”.

    後臺:需要commos-io和commons-fileupload兩個jar包(2.5版本的動態web項目)    

技術分享圖片
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 設定編碼,可以獲取中文文件名
        request.setCharacterEncoding("UTF-8");
        // 獲取tomcat下的upload目錄的路徑
        String path = getServletContext().getRealPath("/upload");
        // 臨時文件目錄
        String tempPath = getServletContext().getRealPath("/temp");
        // 檢查我們是否有文件上傳請求
        // boolean isMultipart = ServletFileUpload.isMultipartContent( req);
        // 1、聲明DiskFileItemFactory工廠類,用於在指定磁盤上設置一個臨時目錄
        DiskFileItemFactory disk = new DiskFileItemFactory(1024 * 10, new File(tempPath));
        // 2、聲明ServletFileUpload,接收上面的臨時文件。也可以默認值
        ServletFileUpload up = new ServletFileUpload(disk);
        // 3、解析request
        try {
            List<FileItem> list = up.parseRequest(request);
            if (list.size() > 0) {
                for (FileItem file : list)
                    // 判斷是否是普通的表單項
                    if (file.isFormField()) {
                        String fieldName = file.getFieldName();
                        // 中文亂碼,此時還需要指定獲取數據的編碼方式
                        // String value = file.getString();
                        String value = file.getString("UTF-8");
                        System.out.println(fieldName + "=" + value);
                    } else { // 說明是一個文件
                        // 獲取文件本身的名稱
                        String fileName = file.getName();
                        System.out.println(file.getFieldName());
                        // 處理文件名稱
                        fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
                        System.out.println("old Name : " + fileName);
                        // 修改名稱
                        String extName = fileName.substring(fileName.lastIndexOf("."));
                        String newName = UUID.randomUUID().toString().replace("-", "") + extName;
                        // 保存新的名稱,並寫出到新文件中
                        file.write(new File(path + "/" + newName));
                        System.out.println("文件名是: " + fileName);
                        System.out.println("文件大小是: " + file.getSize());
                        file.delete();
                    }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Upload

  2、文件下載

    前臺:

      設置download屬性

    後臺實現下載:

      

public class DownloadServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 設置請求 響應編碼
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");

        // 獲取文件名
        String fileName = req.getParameter("fileName");
        // 判斷文件名是否為空
        if (fileName == null || fileName.length() < 1) {
            PrintWriter out = resp.getWriter();
            out.write("<h1>請輸入文件名</h1><a href=‘download.html‘>返回</a>");
            out.close();
            return;
        }
        // 獲取存放文件的目錄
        String path = getServletContext().getRealPath("/upload/");
        // 獲取文件的路徑
        String filePath = path + fileName;
        // 通過路徑獲得file對象
        File file = new File(filePath);
        // 判斷file對象是不是存在而且是文件
        if (file.exists() && file.isFile()) {
            // 下載
            // 1、設置響應類型
            resp.setContentType("application/x-msdownload");
            // 2、設置下載的彈出框信息
            resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            // 3、獲取字節輸入流
            InputStream is=new FileInputStream(filePath);
            // 3、獲取字節輸出流
            ServletOutputStream out=resp.getOutputStream();
            byte[] bs=new byte[1024];
            int len=0;
            while ((len=is.read(bs))!=-1) {
                out.write(bs,0,len);
            }
            out.close();
            is.close();
        } else {
            PrintWriter out = resp.getWriter();
            out.write("<h1>文件不存在</h1><a href=‘download.html‘>返回</a>");
            out.close();
        }
    }
}

Web常用對象(2)