第十四天:聽課筆記

1.sendRedirect 和 forward
sendRedirect 是 通知瀏覽器訪問JSP
forward 是服務器自己訪問JSP

Servlet訪問JSP

通過 域 傳遞數據 JavaBean
通過forward可以 sendRedirect不行

域 本質上是容器

2.要是傳入給JSP的是集合,那得要<% %>裝Java代碼
美工是不幹滴,看着就噁心

EL JSTL 來取代腳本表達式

3.EL時代開始了
EL 用來獲取數據
${}
PageContext.findAttribute()
JSP最終會翻譯成Servlet

pageContext JSP上下文
findAttribute 依次從page , request, session, application  setAttribute getAttribute

要是在四個域中都沒有,返回"" 而不是null --> NullPointerException

4.EL訪問JavaBean

JavaBean cn.itcast.domain
Servlet JSP cn.itcast.web
數據訪問層 cn.itcast.dao
業務邏輯處理 cn.itcast.services

<jsp:useBean id class scope>
class一定要包名。類名 不能import 直接類名
<jsp:setProperty name property value>
<jsp:getProperty name property>

EL: ${XXX.YYY}
結合JSTL 從集合中取數據

5.EL進行簡單的邏輯判斷
和JSTL一起更強大

6.JSTL標籤庫
一堆標籤的倉庫
Sun公司開發的高級標籤,給俺們用的
用來替代腳本代碼
jstl.jar standerd.jar     --> lib  BuildPath   重新發布
<%@ taglib prefix="" uri=""%> 
META-INF jar包的配置文件 c.tld 在uri中導入核心庫的uri

<c:forEach items="從哪個集合(結合EL)" var="臨時名"  >
 臨時名具體輸出
</c:forEach>

擴展:集合中傳入的是對象

擴展:Map集合
items var  items指定哪個集合 var臨時
entrySet 返回key value的集合 
${XXX.key} ${XXX.value} 我敢說他用了entrySet

想底層原理

<c:if test="">
....
</c:if>
test中放判斷條件
將數據封裝成對象 user對象:用戶名和密碼

7.文件的上傳和下載
<input type="file"/>
form action=/代表web應用的上一層 method="post" enctype="multipart/form-data"

fileupload
commons-io.jar commons-fileupload.jar

8.上傳
1.創建工廠 :緩衝區大小,臨時目錄,
臨時目錄(用this.getServletContext().getRealPath("/")+"upload/")
思想:判斷是否存在,不存在就創建
      
2.創建ServletFileUpload,得到FileItem的集合  是否爲multipart/form-data 設置大小 設置編碼 設置監聽器
封裝成FileItem
List<FileItem> parseRequest(request)

ServletFileUpload upload = new ServletFileUpload(factory);

3.遍歷集合,得到每個FileItem

4.判斷:是文件 還是 FormField
 FormField :
 getFieldName getString
 文件:得到流
 getFieldName getInputStream
  將Stream變爲File
 讀出與寫入  目錄名+文件名

5.關流

步驟:
1.創建DiskFileItemFactory對象,並設置緩衝大小和臨時文件保存目錄
2.根據factory創建ServletFileUpload對象,並調用這個對象的parseRequest把上傳表單解析成一個個FileItem
3.對每一個FileItem進行判斷,如果isFormField爲true,代表上傳的是普通表單項
否則爲文件

4.得到FileItem的輸入流對象,並讀取數據,寫入到服務器的文件中

5.關流
關流後刪除臨時文件
XXX.close();
delete

9.亂碼 setHeaderEncoding 或者 request.setCharacterEncoidng

10.uploadtemp 和 upload

11.多個文件上傳 結合JS
添加 刪除
添加的時候 把兩個放入<div> 刪除的時候就刪div
this.parentNode 搞清楚,什麼刪什麼  removeChild

12.安全問題 上傳JSP,別人執行它
shutdown -a
將上傳的文件放到WEB-INF web應用程序訪問不到
WEB-INF 禁止外界訪問  Servlet可以訪問

或者不受WEB服務器管理的目錄

13.爲防止多個用戶上傳相同的文件名的文件
唯一的文件名
UUID radomUUID toString  XXX(唯一標示)+"_"+文件名 方便下載時知道它的文件名
生成算法,分散存放 ---> hash算法生成目錄樹
public String hashpath(String fileName){
 int hashcode = fileName.hashCode();
 int dir1 = hashcode&0xf;
 int dir2 = (hashcode&0xf0) >> 4;
 return dir1+"/"+dir2+"/";
}

mkdirs mkdir 多級目錄是s

14.將它封裝成工具類,方便後期使用

15.顯示上傳進度
ProgressListener  字節 KB 百分數
結合AJAX

16.文件下載
兩者方式:
(1)超鏈接指向資源
要是放到WEB-INF 就訪問不到了 (下載別人上傳的)
盜鏈 別人下載的指向你的了,喫虧

(2)通過程序
1.設置頭
response setContentType("application/x-msdownload")
response setHeader("Content-Disposition", "")

2.得到該文件的流
路徑通過getServletContext().getRealPath

3.寫給客戶端,每讀多少字節就寫多少
ServletOutputStream response.getOutputStream -->字節

4.關流

17.案例:
遍歷上傳目錄下的所有文件顯示給用戶,用戶可以下載

中文亂碼 超鏈接是get方式 先編碼後解碼(String getBytes)

18.寫博客,總結知識點

19.QQ羣 : 27139555

20./
要是給瀏覽器用的 是webapps
要是給web服務器用的 是web應用

21.WEB-INF 建文件夾
放.jsp 別人就訪問不到 只能通過轉發訪問
以後工作了 都是將jsp放入WEB-INF , 都是通過Servlet轉發訪問的
例外:將index.jsp開放,不放到WEB-INF中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章