Web常用對象(2)
一、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)