Jsp (Java Server Pages)相关知识九大内置对象和四大作用域
?
一.初識JSP
Jsp頁面的組成:靜態內容、指令、表達式、小腳本、聲明、標準動作、注釋等元素構成
Url:統一資源定位符
Url組成:協議、主機名(包括端口號)、路徑
?
1.注釋的方式:
1.HTML注釋:在瀏覽器頁面可以看見,不安全
<!----html注釋----->
2.Jsp注釋:在瀏覽器頁面看不見
<%--jsp注釋--%>
3.在jsp腳本中注釋:在瀏覽器頁面看不見
<%//單行注釋%>
<%/*多行注釋*/%>
二.腳本元素:
Jsp聲明-->java文件的成員方法<%!%>
Jsp小腳本-->java文件中的jspService方法的一段代碼<%%>
Jsp表達式-->java文件中的jspService方法中的一段代碼,<%=變量或者表達式%>;
?
?
三.指令
1.Page指令
?
Page指令是針對當前頁面進行設置的知名,通常位于jsp頁面的頂端,一個頁面可以包含多個page指令,page指令只對當前jsp頁面有效。
1.Page指令中如果使用import要導入多個包時,使用“,”分隔
2.Page指令中contentType=“text/html;charset=utf-8”
3.isErrorPage 取值為true時,表示這是一個處理異常的頁面
4.Jsp腳本<%%>中間的java代碼必須符合我們java代碼的書寫格式
?
用戶首次訪問頁面時 Web容器處理jsp文件請求需要經過的3個階段
?
?
Jsp執行過程
(1)翻譯階段:用戶第一次通過瀏覽器來訪問jsp的時候。Tomcat負責把jsp轉化成為java文件
(2)編譯階段:服務器把java文件編譯成為class文件
(3)執行階段:首先對生成的java類進行實例化
調用實例化后對象的_jspService()方法輸出html給瀏覽器
(4)瀏覽器渲染html數據
如果jsp文件沒有修改,用戶再次請求頁面,不用再次翻譯和編譯,如果文件有改動,則會重新翻譯和編譯
2.?include指令
Include指令表示,,在JSP編譯時插入一個包含文本或代碼的文件包含的文件可以是jsp頁面.html網頁.文本文件等,include指令只有一個file屬性,表示被包含文件的路徑,一個jsp頁面可以有多個include指令
?
01靜態包含:
靜態包含
靜態包含就是講內容進行了直接替換,就好比程序中定義的變量一樣.
語法:
<%@ include file=”應用文件路徑 %”>
02動態包含:
?(1)不傳參數:
<jsp:include page=”{要包含的文件路徑|<%=表達式%>}”?flush=”true|flase”/>
(2)傳遞參數:
<jsp:include page=”{要包含的文件路徑|<%=表達式%>}”?flush=”true|flase”>
<jsp:param name=”參數名稱” value=”參數內容”(常量)/>(可以向被包含頁面中傳遞多個參數)
<jsp:param name=”參數名稱” value=”<%=參數內容%>”(變量)/>
?
</jsp:include>
?
靜態包含,遇到同名變量時,先包含后處理,會出現異常
動態包含,遇到同名變量時,先處理后包含,不會出現異常
?
二.Jsp內置對象
內置對象:內置對象就是由web容器加載的一組ServletAPI的實例,這些實例由JSP規范進行了默認的初始化操作,可以直接在JSP中使用(注意:jsp的內置對象名稱均是jsp的保留字,不得當做自定義變量名使用)
不經常使用的內置對象
pageContext ?內置對象的集大成者,可以通過pageContext獲取到其他的內置對象
Config 指定jsp頁面初始配置的對象 Servlet會使用
Page 當前jsp實例化的對象,使用的方法非常有限,一般很少使用
Exception 用來處理頁面異常,以后的異常基本都是在java代碼中處理,所以很少使用
?
經常使用的內置對象
Session
Application
Out
Request
response
?
是由web容器創建的一組對象
1.Jsp內置對象Out
是jspWriter類的實例,作用是用于向瀏覽器輸出數據
01.Out對象經常使用的方法:
(1).void Print(object ?c)向客戶端打印數據(將各種類型的數據轉換成字符串);
(2)、 void write(charset) 向客戶端打印字符相關的數據(字符、字符數組、字符串);
(3)、void println(Object c) 向客戶端打印數據(將各種類型的數據轉換成字符串)并換行。
2.request對象主要用于處理客戶端的請求
?
客戶請求訪問服務器,會攜帶一些數據,比如客戶端的信息,用戶填寫的信息,提交給服務器,服務器拿到數據后,會分析整理,整理成request對象,然后提交給jsp頁面。
?
?
?
?
?
?
01.Request對象的常用方法:
| 方法名稱 | 說明 |
| String getParemeter(String name) | 根據表單組件名稱獲取提交數據 ?參數中的name必須和input中name屬性相對應; ? |
| String[] getParemeterValues(String name) | 獲取表單組件對應多個值時的請求數據。 |
| Void setCharacterEncoding(String charset) | 指定每個請求的編碼,不包括URL編碼,可解決使用post方式提交的亂碼問題 ? |
| RequestDispatcher gerRequestDispatcher(String path) | 返回一個RequestDispatcher對象,該對象的forward()方法用于轉發請求 |
?
?
?
02.頁面亂碼分析:
?
(1)jsp頁面本身的編碼;
即page指令里面
注意:一旦指定了一種編碼格式 另外一種編碼格式不指定的話 默認都采用已經指定的編碼格式。
pageEncoding:頁面本身的編碼;
? contentType:指定的是瀏覽器渲染頁面的時候采用的編碼格式;
(2)瀏覽器渲染頁面采用的編碼;和頁面本身的編碼格式一致
?
(3)服務器保存數據采用的編碼(request)
服務器默認編碼是使用ISO-8859-1來保存數據
解決方法:
對于post方式:
設置讀取請求信息的字符編碼為UTF-8
在獲取請求信息前設置request.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8")設置的是request內部保存數據的格式,不包括url
對于get方式:
Get方式提交的數據在URL里面
1.改變request獲取出來的數據的編碼
?
這種方式開發中不推薦使用,使用這種方式,每個數據都必須要進行轉碼,在實際編碼中使用這種方式處理,比較麻煩
2.改變url編碼(推薦使用)
?
3.response 用于響應客戶請求并向客戶端輸出信息
?
?
01.常用方法
| 方法名稱 | 說明 |
| Void addCookie(Cookie cookie) | 向客戶端添加Cookie |
| Void setContentType(String type) | 設置HTTP響應的contentType類型 |
| Void setCharacterEncoding(String charset) | 設置響應所采用的字符編碼類型 |
| Void sendRedirect(String location) | 將請求重新定位到一個新的URL上(重定向) |
?
02.頁面重定向
Void sendRedirect(String location)
客戶端將重新發送請求到指定的URL,客戶端瀏覽器顯示的地址是重定向的地址,客戶端可以查看到發起了兩次請求
<%
String name=request.getParameter("userName");
String pass=request.getParameter("pass");
if("admin".equals(name)&&"admin".equals(pass)){
response.sendRedirect("welcome.jsp");
}else{
out.print("用戶名或密碼不正確");
}
%>
狀態碼
302代表告訴瀏覽器該重定向一個url了
404代表找不到頁面
200,代表0K
重定向頁面使用request.getParameter獲取不到數據的原因:
客戶端帶著數據來請求頁面時,請求頁面告訴瀏覽器該去請求另一個頁面,這時候第一 次請求中的數據就失效了,第二次請求時便只攜帶了客戶端的信息,不帶客戶信息
解決方法:
1.當第一次請求失效的時候,把數據進行保存,使用數據作為參數發起第二次請求
Get請求的參數是放在url里面的,所以可以使用這種方式來解決,這和表單的提交方式沒有關系,"welcome.jsp?userName="+name
???第一個請求的頁面
<%
String name=request.getParameter("userName");
String pass=request.getParameter("pass");
if("admin".equals(name)&&"admin".equals(pass)){
response.sendRedirect("welcome.jsp?userName="+name);
}else{
out.print("用戶名或密碼不正確");
}
?
%>
第二次請求的頁面再使用request.getParameter(“參數”)來獲取
<% String name=request.getParameter("userName"); %>
<h1>歡迎<%=name %>訪問!</h1>
?
03.轉發
2.能不能只發一次請求,來完成頁面的跳轉
使用轉發,客戶端瀏覽器顯示的是用戶直接請求的頁面的url,并且客戶端瀏覽器顯示只發送一次請求,整個過程是都是在服務器內部完成的
使用轉發來取代重定向實現頁面跳轉
轉發的實現使用Request.getRequestDispatcher(ul);方法來實現
客戶端用戶直接請求的頁面
<%
String name=request.getParameter("userName");
String pass=request.getParameter("pass");
if("admin".equals(name)&&"admin".equals(pass)){
?
RequestDispatcher rd=request.getRequestDispatcher("welcome.jsp");
rd.forward(request, response);
}else{
out.print("用戶名或密碼不正確");
}
?
%>
目標頁面:
?
<% String name=request.getParameter("userName"); %>
<h1>歡迎<%=name %>訪問!</h1>
?
?
?
轉發和重定向的區別:
相同點:
轉發和重定向都是能夠實現頁面的跳轉
不同點:
轉發過程:web服務器內部將一個request請求的處理權交給另一個資源,屬于同一個訪問請求和響應過程,所以request對象的信息不會丟失
轉發是在服務器端發揮作用,通過RequestDispatcher對象的forward()方法將提交的信息在多個頁面間進行傳遞;
轉發是在服務器內部控制權的轉移,客戶端瀏覽器的地址欄不回顯示出轉向后的地址。
重定向過程:web服務器向瀏覽器返回一個響應,瀏覽器接受此響應后再發送一個新的http請求到服務器,這屬于兩次不同的請求,則上一次請求的request數據將丟失。
重定向是在客戶端發揮作用,通過新的請求實現頁面轉向,其通過瀏覽器重新請求地址,在地址欄中可以顯示轉向后的地址。
?
?
?
?
在URL中參數的拼接 get傳參方式
<a href="result.jsp?color=red">red</a>
?
?
4.Session會話機制 用于區分客戶端
每個session會話都會有一個sessionID ,同一個session對象sessionID相同
Session和瀏覽器窗口
通過超鏈接打開的新窗口,新窗口的session與其父窗口的session相同
Sessionid是通過鍵值對的形式保存在本地的Cookie中
?
?
?
?
01、Session對象的常用方法:
?
| 方法名稱 | 說名 |
| String getId() | 獲取sessionid |
| Void setMaxInactiveInterval(int interval) | 設定session的非活動時間(即最大失效時間) |
| Int getMaxInactiveInterval() | 獲取session的非活動時間(以秒為單位) |
| Void invalidate() | 設置session對象失效(用戶退出時使用) |
| Void setAttribute(String key,Object value) | 以key/value的形式保存對象值 |
| Object getAttribute(String key) | 通過key獲取對象值 |
| Void removeAttribute(String key) | 從session中刪除指定名稱(key)所對應的對象 |
02session對象的實例:
控制頁面代碼:
<%
request.setCharacterEncoding("UTF-8");
String userName=request.getParameter("userName");
String passwrod=request.getParameter("passwrod");
boolean?flag=false;
//這個if是判斷賬號和密碼是否正確
if("admin".equals(userName)&&"admin".equals(passwrod)){
flag=true;
//用戶名和密碼正確時,將用戶信息保存到session
session.setAttribute("test", userName);
?
}else{
out.print("你輸入的賬號或密碼不正確");
?
}
//這是判斷用戶是否是直接在瀏覽器輸入control.jsp進入的
if(flag){
request.getRequestDispatcher("welcome.jsp").forward(request,response);
}else{
response.sendRedirect("login.jsp");
}
?
%>
?
?
?
主頁面的代碼:
<%
//從session中獲取用戶信息
Object obj=session.getAttribute("test");
if(obj==null){
//使用轉發,目的是讓用戶瀏覽器窗口的url也變成login.jsp
response.sendRedirect("login.jsp");
return;
}
%>
歡迎<%=obj %>登陸
2session失效
會話超時:會話超時是指兩次請求的時間間隔超過了服務器允許的最大時間間隔.
01.手動設置失效: invalidate()
02.超時失效: 通過setMaxInactiveInterval()方法,單位是秒
03.修改配置文件: 通過項目下的web.xml或Tomcat目錄下的/conf/web.xml
文件,單位是分鐘
<session-config>
<session-timeout>10</session-timeout>
</session-config>
?
5 application內置對象
作用:用于同一個應用中的所有用戶之間的數據共享
01 常用方法:
| 方法名稱 | 說明 |
| Void setAttribute(String key,Object value) | 以key/value的形式將對象儲存到application中 |
| Object getAttribute(String key) | 通過key獲取application中存儲的對象 |
| String getRealPath(String path) | 返回相對路徑的真實路徑 |
?
?
三.四大作用域
四大作用域:page作用域,request作用域,session作用域,application作用域.
?
?
四.Cookie
Cookie是web服務器保存在客戶端的一系列文本信息
Cookie的作用 對特定對象的追蹤,實現各種個性化服務.實現登錄
創建cookie
Cookie newCookie= new Cookie(String key,String value);
寫入cookie
Response.addCookie(newCookie);
讀取cookie
Cookie cookies[]=request.getCookies();
?
轉載于:https://www.cnblogs.com/zqr99/p/7526467.html
總結
以上是生活随笔為你收集整理的Jsp (Java Server Pages)相关知识九大内置对象和四大作用域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js邮箱正则表达式的使用
- 下一篇: CCF-201509-3-模板生成系统