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中