Java Web系列之使用Eclipse開發web項目(jsp項目) ...
目錄
基本概念
- 在eclipse中創建的web項目:
- 瀏覽器可以直接訪問WebContent中的文件
- 但是WEB-INF中的文件無法通過客戶端(瀏覽器)直接訪問,只能通過請求轉發來訪問
註意:並不是任何內部的跳轉都都能訪問WEB-INF,跳轉有請求轉發和重定向兩種方式
- 配置Tomcat運行時環境
jsp<->servlet
- 將Tomcat/lib中的servlet-api.jar加入項目的構建路徑
- 右鍵項目->build path ->add library ->server runtime
- 部署Tomcat
- 在servers面板,新建一個Tomcat實例,再在該實例中部署
- 註意:一般建議將eclipse中的tomcat與本地Tomcat中的信息保持一致;第一次創建完設置托管模式;否則以後就變灰了,不能改
- 統一字元集編碼
設置jsp文件的編碼(jsp中的pageEncoding屬性):jsp->java
設置瀏覽器讀取jsp文件的編碼(jsp文件中content屬性)
一般講上述設置成統一碼,推薦使用國際碼utf-8
文本編碼:
- 將整個eclipse中的以後文件統一設置
- 設置一個項目
- 設置單獨文件
- jsp的頁面元素:HTML,Java代碼(腳本scriptlet),指令
- 腳本scriptlet
//1
<%
局部變數、Java語句
%>
//2
<%!
全局變數、定義方法
%>
//3
<%= 輸出表達式 %>
一般而言,修改web.xml需要重啟tomcat,修改jsp不需要
註意:out.println()不會回車,需要添加HTML的換行符,out.println()中可以識別html代碼
- 指令
- page指令
<%@page .....%>
- page指令的屬性:
- language:jsp頁面使用的腳本語言
- import:導入類
- pageEncoding:jsp文件自身編碼 jsp->java
- contentType:瀏覽器解析jsp的編碼
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
- 註釋
- html註釋 網頁源代碼裡邊可以顯示
- java註釋// /.../
- jsp註釋<%-- jsp註釋 --%>
JSP九大內置對象(重點)
- jsp九大內置對象(重點)(自帶的,不需要new也能使用的對象)
- out:輸出對象,向客戶端輸出內容
- request:(封裝請求信息)請求對象;存儲"客戶端向服務端發送的請求信息"(數據只在同一次請求有效)
- 常見方法:
- String getParameter(String name):根據請求的欄位名key,返回欄位值value;
- String[] getParameterValues(String name):根據請求的欄位名key,返回多個欄位值value(checkbox);
- void setCharacterEncoding("編碼格式utf-8"):具體設置post請求編碼(tomcat預設編碼iso-8859-1);
- getRequestDispatcher("b.jsp").forward(request,response): 請求轉發的方式跳轉頁面 A->B
- ServletContext getServerContext():獲取項目的ServletContext對象
- 示例:
- 註冊
- 註冊頁register.jsp 展示頁show.jsp
- 訪問url含義
- localhost:8080/MyJspProject/show.jsp?uname=aa&upwd=wer&uage=12
- 連接/文件?參數名1=參數值1&參數名2=參數值2&參數名3=參數值3
- 統一請求的編碼request
- get方式 如果出現亂碼解決方式:
- 統一每一個變數的編碼(不推薦)
- 變數名=new String(變數名.getBytes("iso-8859-1"),"utf-8");
- 每個變數改一次
- 修改server.xml一勞永逸
- 建議使用Tomcat時,首先在server.xml中統一編碼方式 URIEncoding="UTF-8"
- post方式
- request.setCharacterEncoding("utf-8");
- get提交方式:method="get"和地址欄、超鏈接請求方式預設都屬於get提交方式
- get與post請求方式的區別:
- get方式在地址欄顯示請求信息(但是地址欄容納信息有限,4-5kb,如果請求數據存在大文件,圖片,存儲不下會報錯),post不會顯示
- 文件上傳操作,必須是post
- 推薦使用:post
- response:(響應信息)響應對象
- 提供的方法:
- void addCookie(Cookie cookie):服務端向客戶端增加cookie對象
- void sendRedirect(String location)throws IOException:頁面跳轉的一種方式
- void setContentType(String type):設置服務端響應的編碼(設置服務端的contentType類型)
- 示例:登錄
- login.jsp登錄->check.jsp判斷->success.jsp
- 請求轉發和重定向的區別:
- 地址欄改變:不變,變
- 是否保留第一次請求時的數據:保留,不保留(跳到success.jsp拿不到數據) --4種範圍對象
- 請求的次數:1次(請求轉發的跳轉是在伺服器內部跳轉),2次
- 跳轉發生的位置:伺服器端,客戶端
- 轉發、重定向:
- 轉發: 張三(客戶端)->【服務視窗A->服務視窗B】
- 重定向: 張三(客戶端)->【服務視窗A】->張三(客戶端)->【服務視窗B】
- session(存在於服務端)
- Cookie
- Cookie(存在於客戶端,不是內置對象,得new):
- Cookie是有服務端生成的,再發送給客戶端保存;
- Cookie相當於本地緩存的作用:客戶端->服務端
- 作用:提高訪問服務端的效率,但是安全性較差
- Cookie:name-value
- javax.servlet.http.Cookie類產生的 public Cookie(String name,String value)
- String getName():獲取name
- String getValue():獲取value
- void setMaxAge(int expiry):設置最大有效期(秒)
- 服務端準備Cookie:
- response.addCookie(Cookie cookie)
- 頁面跳轉(轉發,重定向)
- 客戶端獲取Cookie:
- request.getCookies(); //獲取Cookie必須每次都是獲取全部
- 註意:
- 服務端增加cookie:response對象
客戶端獲取對象:request對象- 不能直接獲取單獨對象,只能一次性將全部cookie得到
除了自己設置的Cookie對象外,還有一個name叫JSESSIONIDDE的cookie- 使用Cookie實現自動記住用戶名 //建議cookie只保存英文數字,否則要編解碼
- session:會話
- 瀏覽網站:開始-關閉
- 購物:瀏覽-付款-退出
- 電子郵件:瀏覽-寫郵件-退出 一次開始到關閉
- session機制
- 客戶端第一次請求服務端
- 客戶端第一次請求服務端時,(jsessionid-sessionid)服務端會產生一個session對象(用於保存該客戶的信息),並且每個session對象都會有唯一的sessionId(用於區分其他session);
- 服務端會產生一個cookie,並且該cookie的name=JSESSIONID,value=服務端sessionId的值;
- 然後,服務端會在響應客戶端的同時,將該cookie發送給客戶端,至此 客戶端就有一個cookie(JSESSIONID)
- 因此,客戶端的cookie就可以和服務端的session一一對應(JSESSIONID-SESSIONID)
- 客戶端第二次/n次訪問服務端
- 客戶端第二次/n次訪問服務端時:服務端會先用客戶端cooki中的JSESSIONID去服務端session中匹配sessionId,若匹配到,則說明不是第一次訪問
- 例子:
- 客戶端:顧客
- 服務端:存包處
顧客第一次存包:商場判斷此人是不是之前已經存過包(是否有鑰匙),如果新顧客(沒鑰匙),分配一個鑰匙;
第二次/n次,如果手裡有鑰匙,直接一一對應,不分配
- session:
- session存儲在服務端
- session是在同一個用戶請求時共用
- session實現機制:第一次客戶請求時產生一個sessionid並複製給jsessionid然後發給客戶端.最終實現sessionid與jsessionid一一對應
- session方法
- String getId():獲取sessionId
- boolean isNew():判斷是否是新用戶(第一次訪問)
- void invalidate():使session失效(退出登錄、註銷)
- void setAttribute():
- Object getAttribute():
- void setMaxInactiveInterval(秒):設置最大有效非活動時間
- int getMaxInactiveInterval(秒):獲取最大有效非活動時間
- 示例:
- 登錄
- JSESSIONID5B3D4AA49AB91B1311F514BCF727DD29
- sessionId5B3D4AA49AB91B1311F514BCF727DD29
- 客戶端在第一次請求服務端時,如果服務端發現此請求沒有JSESSIONID,則會創建一個name=JSESSIONID的cookie並返回給客戶端
- Cookie
- 不是內置對象,要使用必須new
- 但是,服務端會自動new一個Jsessionid的cookie
- cookie和session的區別:
- 位置分為:客戶端和服務端
- 安全為:不安全和較安全
- 保存的內容:Object和字元串String
- application:全局對象
- String getContextPath():虛擬路徑
- String getRealPath(String name):絕對路徑(虛擬路徑,相對的的絕對路徑)
- pageContext:JSP頁面容器
- config:配置對象
- page:當前JSP頁面對象(相當於JAVA中的this)
- exception:異常對象
九大內置對象中四種範圍對象(小到大)
- pageContext(也可稱為page對象):當前頁面有效,頁面跳轉後無效
- request:同一次請求有效,其他請求無效(請求轉發後有效,重定向後無效)
- session:同一次會話有效(無論怎麼跳轉都有效,只要不關/切換瀏覽器)
- application:全局有效(整個項目有效):整個項目運行期間都有效,切換瀏覽器也有效,關閉服務或者切換項目無效
- 以上四種對象的共有的方法:
- Object getAttribute(String name):根據屬性名,獲取屬性值
- void setAttribute(String name,Object obj):設置屬性值(新增,修改)
- setAttribute("a","b");//如果a對象之前不存在,則新建一個a對象; 如果a之前已經存在,則將a的值改為b
- void removeAttribute(String name):根據屬性名,刪除對象 //set賦值,get取值,儘量使用小範圍,性能損耗小