jsp入門講解筆記

JSP
1.什麼是JSP
Java Server Page(Java服務器端頁面技術),是sun公司制定的一種服務器端動態頁面
技術規範。
因爲Servlet生成頁面,如果頁面比較複雜,則Servlet代碼比較繁瑣,並且不容易維護。
所以相對比較複雜的頁面用JSP,相對比較容易維護和編寫。
2.如何寫一個JSP文件
創建一個以.jsp爲後綴的文件。然後在該文件中添加HTML和java代碼段,編寫完成以後
不需要再編譯,當訪問該jsp文件時,服務器會將該jsp文件轉換成一個.java文件(
其實就是一個Servlet)
3.JSP的組成
(1)HTML(CSS javascript)
直接寫在jsp文件中
(2)java代碼
第一種形式;java代碼段
<% java代碼%>
第二種形式:jsp表達式
<%= %>
第三種形式:聲明表達式
<%! %>
(3)JSP 指令
所謂jsp指令就是告訴jsp引擎(在容器中,將把jsp轉換成jsp文件時,並在運行時,
爲jsp提供的一些輔助模塊)
在將.jsp文件轉換成.java文件時做一些額外額處理。
語法:<%@ 指令 屬性名=屬性值%>

page指令
import屬性 用於導包
比如<%@ page import="java.util.*"%>
contentType屬性
相當於response.setContentType("");
pageEncoding屬性
告訴jsp引擎jsp文件保存時的編碼
session屬性 值是true(缺省)/false,當設置爲false時,生成對應的servlet代碼中將不會
聲明和創建session對象,即jsp頁面中不能使用session內置對象

errorPage屬性 指定該頁面出錯時,跳轉的錯誤處理頁面。

isErrorPage屬性值是true(缺省)/false,當前jsp是否作爲一個錯誤處理頁面
當設置爲true時,就作爲錯誤處理頁面

isELIgnored屬性值是true(缺省)/false,是否忽略EL表達式,爲true時則忽略。
 

include指令
<%@ include file="jsp01.jsp" %>

taglib指令
uri是標籤的命名空間
prefix是標籤的命名前綴
<%@ taglib prefix="" uri="" %>

(4)隱含對象
所謂隱含對象,就是在jsp文件中不用聲明和創建就可以使用的對象,因爲.jsp文件
相當於.java文件,自動生成了隱含對象的代碼。
out
request
response
session
application
pagecontext
exception
config
page
訪問範圍從小到大
pageContext(只有對應的jsp實例自己纔可以訪問,生命週期是該jsp對象創建到該jsp對象
銷燬)
-》 request(一次請求能訪問,生命週期在訪問和響應之間)
-》 session(一次回話之間能訪問,生命週期是多次請求和響應之間)
-》ServletContext 整個應用內部的組件都能訪問,除非服務器關閉,否則一直存在。

config是ServletConfig的一個實例,可以獲取初始化參數。
pageContext
是PageContext的實例,服務器會爲每一個jsp實例(即對應的那個servlet實例)
創建一個唯一的PageContext實例。
主要對象有兩個
1)可以getAttribute(),setAttribute(),removeAttribute()
2)可以獲得其他八個內置對象
exception
當頁面中設置<%@ page isErrorPage=“true”%>,可以通過該內置對象獲取
錯誤信息。


e.活動元素
1)<jsp:forward page="jsp08.jsp"></jsp:forward>
轉發,page屬性指定轉發的地址
2)
 <jsp:include page="jsp10.jsp">
    <jsp:param value="zhangsan" name="add"/>
    </jsp:include>
在一個jsp頁面中調用另一個jsp頁面
並且可以向另外一個jsp頁面通過<%=request.getParameter("add") %>傳遞參數
3) <jsp:useBean id="user" scope="request" class="bean.User"></jsp:useBean>
在指定的範圍內綁定一個對象。
範圍是:pageContext、request、session、ServletContext
其對應的值是page,request,session,application
4)
<jsp:setProperty name="user" property="name"  value="zhangsan"/>
 <jsp:setProperty property="age" name="user" param="aa"/>
根據請求參數給屬性賦值
<jsp:setProperty property="*" name="user"/>
根據自省機制給屬性賦值
f.jsp中的註釋
<!-- -->
這種註釋中有java代碼段會執行,但是不會顯示。
第二種註釋
<%-- --%>
這種註釋不會執行,也不會顯示
g.jsp如何轉換成.java文件
html-》放在service方法中,用out.write()輸出
<%%>-》照搬到service方法中
<%= %>->會在service方法中用out.println()輸出
指令-》會影響源代碼的生成,不如導包
<%! %> 如果在jsp中聲明的變量會變成servlet中的屬性,
定義的方法會生成的servlet中創建一個方法。


轉發:(地址欄不變)
一個web組件(jsp或者Servlet)將未完成的處理交給另一個web組件處理。
這幾個web組件可以共享同一個request和response對象。

request.getRequestDispatcher("emplist.jsp").forward(request, response);
如何轉發:
(1)先綁定數據
request.setAttribute(String name, Object obj);
與綁定數據相關的方法
Object data=request.getAttribute(String name);
request.removeAttribute(String name)
(2)轉發
獲得轉發器
RequestDispatcher rd=request.getRequestDispather("list.jsp");
轉發rd.forward(request,response);
編程注意的問題
轉發之前不能做out.colse()和out.flush()操作
轉發之前會把response緩存中的數據清空
轉發的特點:
轉發只能是同一個應用之間的組件轉發。
轉發以後地址不變
轉發的組件共享request和response對象。
3.JSP表單中的中文問題處理
在JSP添加如下指令:
<%@ page pageEncoding="utf-8" contentType="text/html;charset=utf-8"%>
設置表單提交方式爲post
在Servlet中
request.setCharacterEncoding("utf-8");
如果要訪問數據庫
對於mysql數據庫
create database db default character set utf-8;
在訪問數據庫時,設置其可以保存中文
jdbc:mysql://localhost:3306/test?useUnicode=true&CharacterEncoding=utf-8;

4.路徑問題:
jsp中路徑應該如何寫
路徑問題:
1.<form action="">表單提交
2.<a href="">鏈接
3.response.sendRedirect("")重定向
4.request.getRequestDispatcher("")轉發(從工程名字後面開始)
相對路徑和絕對路徑
相對路徑:不以/開頭的路徑成爲相對路徑,比如
<a href="del.do"></a>
絕對路徑:以/開頭的路徑成爲相對路徑,比如
<a href="/appname/del.do"></a>

建議:一般在開發中儘量使用絕對路徑。
如果要用絕對路徑
鏈接 表單提交 重定向 要從應用名開始寫
轉發從應用名後開始寫

----------------------------------------------------------------------------------------------

路徑問題:
1.<form action="">表單提交
2.<a href="">鏈接
3.response.sendRedirect("")重定向
4.request.getRequestDispatcher("")轉發(從工程名字後面開始)
____________________________________________________________________
寫相對路徑要看相對誰來說的
寫絕對路徑要從工程名字開始
href="/servle/day01/test1.jsp"
____________________________________________________________________

動態獲取工程名字
String request.getContextPath

href="<%request.getContextPath%>/test"

不用javascript
登陸成功跳轉list,不成功繼續留在登陸頁面
user表
username    用戶名
name    真實姓名
pwd    密碼
sex    性別
number    驗證碼
create table user(
id int primary key auto_increment,
name varchar(50),
pwd varchar(50));
---------------------------------------------------------------------------------------------------
Http狀態管理
(1)什麼是狀態管理
一般是客戶端(瀏覽器)和服務器之間的多次交互當做一個整體看待
,即把多次交互過程中所涉及的數據記錄下來。
(2)怎樣進行狀態管理
第一種:通過客戶端Cookie技術
第二種服務器端Session技術
(3)Cookie技術
1)什麼是cookie
瀏覽器訪問服務器時,服務器會將一些數據以set_cookie的消息頭髮送給瀏覽器,
瀏覽器會將這些數據保存起來,當瀏覽器再次訪問服務器時,瀏覽器會將這些
數據以Cookie消息頭髮送給服務器,通過這種方式可以管理用戶的狀態。
2)如何創建Cookie
Cookie c=new Cookie(String name,String)
response.addCookie(c);
3)查詢Cookie
如果沒有Cookie,返回null
Cookie cs=request.getCookies();
String name=cs.getName();
String value=cs.getValue();
4)Cookie保存的編碼問題
Cookie的只能保存ascii字符,如果Cookie的值是中文,需要轉換成ascii字符形式
可以使用URLEncoder.encode(),URLDncoder.dncode()這個方法轉換成該形式
5)Cookie保存時間
cookie.setMaxAge(int second);
當second>0瀏覽器會將Cookie以文件形式保存在電腦中,當時間結束以後,
會刪除該文件。
當second=0 會立即刪除該Cookie
當second<0會將Cookie 保存在內存中,當瀏覽器關閉以後纔會刪除該Cookie
6)刪除Cookie
第一種:Cookie cookie=new Cookie("name","");
第二種:Cookie.setMaxAge(0);
7)Cookie的路徑問題、當瀏覽器向服務器的某個地址發送請求時,回去檢查Cookie
的路徑是否匹配,只有匹配纔會發送Cookie。
可以通過Cookie.setPath("/url")設置cookie的保存路徑
如果不設置cookie的保存路徑,則是缺省的地址,是與保存cookie的web組件的地址
是一致。
比如:
通過/appname/addcookie保存的cookie,其地址是/appname/addcookie
規則:只有cookie的路徑是訪問服務器地址的上層目錄或者和訪問的地址一樣,
纔會發送cookie。
一般保存的cookie通過cookie.setPath("/appname/addcookie");
就可以發送所有的cookie
8)cookie的限制
cookie可以禁止
cookie的大小有限制(4k左右)
cookie的數量也有限制(瀏覽器一般只保存300個左右的cookie)
cookie只能保存ascii編碼
cookie不安全
————————————————————————
寫一個
cookieUtil類
兩個方法
保存,查看cookie的方法,不需要繼承

————————————————————————

Cookie可以查看同一目錄或父目錄的信息。
(4)Session
1)什麼是session
當瀏覽器訪問服務器時,服務器會創建一個session對象,該對象有唯一的
id,即sessionId,服務器會通過cookie機制將該sessionId發送給瀏覽器。當瀏
覽器再次向服務器發送請求時,會攜帶該sessionId,服務器通過該sessionId
找到session對象,實現一種狀態管理技術。
(session保存在內存中)
-----------------------------------------------------------------

設置返回數據類型
創建圖片對象
獲得畫筆對象
設置畫筆顏色
填充圖片的背景顏色
再次設置畫筆顏色
生成圖片上演示的字符串
將字符串畫到圖片上
獲得圖片輸出的流 因爲保存圖片的數據是字節數組,
所以不能用PrintWriter
將圖片壓縮輸出

傳參數是時纔會轉發

通過cookie保存

過濾器配置一定要寫在servlet之前
—————————————————————————-------------          
2)如何獲取session對象
獲取session可以通過兩種方式
第一種方式:
HttpSession session=request.getSession(boolean flag)
當flag爲true時,當瀏覽器將sessionId傳送給服務器時,會先找該sessionId,
如果不存在,則創建一個session對象,如果存在則根據sessionId去找該
session對象,如果找到,則返回session對象,如果找不到則創建一個session對象。

當flag爲false時,當瀏覽器將sessionId傳送給服務器時,會先找該sessionId,
如果找到,則返回session對象,找不到則返回null。
第二種方式
HttpSession session=request.getSession()
相當於flag爲true。
3)HttpSession接口提供的一些方法
(1)session.getId();獲取sessionId
(2)綁定數據
session.setAttributte(String name,Object obj)
服務器在對session進行持久化操作時,會執行激活等操作,所以建議obj一般
實現序列化接口。
Object data=session.getAttribbute(String name);
如果找不到則返回null
session.removeAttribute(String name);

服務器在對session進行持久化操作時,obj爲什麼要實現序列化接口?
因爲服務器中一般會保存很多的session對象,裏面保存了用戶的狀態
數據(比如購物信息),但是內存有限,對於海量的信息,這些session對象是
不夠用的。

一般情況下 , 我們配置好數據庫(或者以文件的形式保存在磁盤上),
這樣就可以讓某個用戶將數據保存在數據庫或者磁盤上,使該session
處於空閒。

session應用案例:
1.驗證碼
2.購物車
完善購物車,當用戶關閉瀏覽器,打開瀏覽器,購物車的商品條目
還在(通過Cookie完成)

重寫

當用戶禁止Cookie, 如何使用session機制?
1)解決方式
通過URL重寫
2)什麼是重寫
如果要訪問web組件(jsp或servlet),不能直接在地址欄輸入要訪問的地址,
而是應該使用服務器生成包含有sessionId的地址。
3)如何生成包含有sessionId的地址?
方式一(適用於鏈接和表單提交)
response.encodeURL("session");
方式二(適用於重定向)
resp.encodeRedirectURL("url");

轉發不用

過濾器
1)什麼是過濾器
在servlet規範中定義的一種特殊的類,用於對servlet調用過程中的一些攔截。
2)如何寫一個過濾器
定義java類實現Filter接口
在doFilter方法中實現過濾業務。
在web.xml中配置過濾器
3)配置初始化參數
可以在web.xml中使用<init-para>配置一些參數,在filter中可以使用FilterConfig.getInitParameter(String name)
的方法獲取獲取該參數值

4)當多個過濾器滿足過濾條件時會根據在web.xml中配置的<filter-mapping>先後順序執行。

5)過濾器的優點
可以使過個servlet的過濾業務寫在一個過濾器中,方便代碼的維護
可以實現代碼的可插拔性
給一個軟件增加或者刪除一個功能,不會影響已經存在的功能。

監聽器
1)什麼是監聽器
servlet規範中定義的一種特殊的類,作用是對servlet容器中產生的一些事件進行監聽,
並處理。
2)容器中的時間主要分爲兩大類?
第一類:
生命週期事件,即容器在創建 request session  ServletContext對象時,或者銷燬時產生的
事件。

第二類
綁定數據事件,當request session  ServletContext數據執行setAttribute(),removeAttribute()
產生的事件
2)如何寫一個監聽器
創建一個java類實現相應的接口(根據事件類型)
在接口方法中實現監聽邏輯


監聽器配置在過濾器之前

JSTL和EL表達式


































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