jsp :
生命周期 :
1 先執行當前類的構造方法
2 再執行init()方法
3 執行service()/doGet()方法
4 關閉的時候執行destroy()方法
jsp 是javaServletPage的縮寫
jsp 的本質,是一個Servlet,是個特殊的java文件
Servlet : 平常的.java類,繼承于HttpServlet類,且,必須覆寫它的service()或doGet()方法
jsp 是在html中寫java語句
jsp 在tomcat運行時的解析過程 :
**.jsp ---> tomcat 解析掉**.jsp中的<% %>,<%@ %>,<%= %>,<%! %>,并生成java(servlet)文件 --- > **.java ---> javac編譯,生成**.class ---> **.class --->加載到jvm虛擬機,解析出一個虛擬的html表---->瀏覽器顯示虛擬的html表--->當我們提交的時候,是在瀏覽器去找的,加載到jvm虛擬機里面的**.class(servlet文件)--->再執行操作
四種形式 :
<% %> , <%! %> , <%@ %> , <%= %>
1 <% %> : //里面可以寫任意Java代碼 就是doGet()方法 或Service()方法(一樣這兩個方法) (java代碼要加";"分號,因為是方法體,該怎么寫還怎么寫)
里面的內容就是在寫doGet()方法的方法體
int accessCount=0;//就是局部變量
2 <%! %> : //類構成元素
// 這里聲明的變量是成員變量
// 聲明的方法是成員方法
// 相當于servlet類里面的類構成元素
// 成員變量 , 多個客戶端訪問同一份 每個線程都有一個成員變量的緩存 然后這個緩存 會定期和主線程同步
// 所以說 盡量不要使用成員變量!!!!
int accessCount=0;//成員變量
3 <%@ %> : //用來導包和設置編碼格式
如 :
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
4 <%= %> : //用來直接輸出,就是out.PRintln();
里面的內容就是out.println("內容")要輸出內容的字符串,(所以不用加分號---";")
<%= request.getParameter("name")%>
↓↓↓↓↓↓
<% out.println( request.getParameter("name") ); %>
Servlet :
Servlet 是 在java中寫html語句
include_file : //靜態包含
靜態包含 : jsp編譯器編譯的時候,已經包含好了相應的文件 并且只生成一個java(servlet)文件 -- javac 同一個class文件 在jvm運行的時候 他兩個之間就不能傳參了,他們使用同一個request,reponse(相當于把兩個文件合并為一個文件)
<%@ include file="文件名.jsp"%>;//在哪里靜態包含,就把指定文件合并到哪里(位置)
errorPage : //網頁錯誤/跳轉文件/跳轉網頁
錯誤網頁 : 當當前文件出錯的時候,跳轉到指定文件中,但是指定文件的設置(編碼...),必須和當前文件一致,而且必須指明,那就是指定文件
如 : <%@ page errorPage="文件.jsp"%>//錯誤網頁
被包含文件(被指定文件) : <%@ page isErrorPage="true"%> //指明,我就是指定文件(要跳轉到的文件)IUserService
include_page : //動態加載
注意: 1 jsp標簽需要自己閉合
2 jsp:include 是動態加載! 在jsp編譯的時候 加載頁面和被加載頁面 會被解析成兩個java(servlet)文件!
3 javac 編譯器會編譯兩次 生成兩個class文件
然后在jvm虛擬機中運行的過程中,這個時候包含甲文件才回去調用乙class文件
這就是動態加載
4 他們不是同一個request對象了!!!!!!!
5 肯定需要flush
6 傳值問題
如 :
<jsp:include page="_02_date.jsp" flush="true" />//動態加載
<jsp:param value="<%=value1 %>" name="v1"/>//傳參
sendRedirect :
跳轉
//使用答應(response)調用的,所以就已經出了jvm虛擬機,再過去指定頁面 地址欄會改變
不會阻止下面的運行
就相當于在生成的那個java文件的doget()方法里面寫了
response.sendRedirect("指定文件.jsp");//使用答應(response)調用的,所以就已經出了jvm虛擬機,再過去指定頁面
因為他是在瀏覽器周轉了一下 所以 瀏覽器會顯示第二個頁面的 地址
同樣也說明了 他們肯定不是同一個對象
他們是不同的request對象
forward :
跳轉
//使用請求(request)調用的,所以在jvm虛擬機里面,直接把指定頁面拿過來,使用,地址欄不會改變,是動態加載概念
<jsp:forward/>
會阻止下面的運行
相當于在doget方法里面寫了:
this.getServletConfig().getServletContext()----這里是通過當前servlet
獲得了servlet配置屬性 然后獲得servlet上下文
.getRequestDispatcher(URL)-- 調用 分發器
傳遞到指定的URL路徑去 forward方法才是真正的跳轉
攜帶了當前的request response對象
.forward(request, response);
雖然他們的內存地址不一樣 但是他們的對象里面的屬性是相同的
他們兩個頁面之間的周轉沒有經過瀏覽器 一直在虛擬機里面
所以說他是比較快的
用法<forward>
<jsp:param 鍵值對>
這里相當于在原來的request對象基礎上添加了鍵值對
</jsp:forward> --注意沒有空格
useBean :
<jsp:useBean id="變量" class="文件名"></jsp:useBean>
//這里是獲得Bean的對象的引用 就是new bean.CounterBean
<jsp:useBean id="cd" class="CounterBean"></jsp:useBean>
//實例化bean文件夾里面的CounterBean類文件,把對象引用賦值給 變量 cd
page :
//范圍 page 是當前頁面有效
<jsp:useBean id="變量" scope="page" class"文件名" />
<jsp:useBean id="conuterBean" scope="page" class"bean.CounterBean" />
request :
//范圍 當前request對象有效
<jsp:useBean id="變量" scope="request" class"文件名" />
<jsp:useBean id="counterBean" scope="request" class="bean.CounterBean" />
application :
//范圍 所有的訪問,都能訪問
<jsp:useBean id="變量" scope="application" class"文件名" />
<jsp:useBean id="counterBean" scope="application" class="bean.CounterBean" />
session :
//范圍 當前瀏覽器
<jsp:useBean id="變量" scope="session" class"文件名" />
<jsp:useBean id="counterBean" scope="session" class="bean.CounterBean" />
setProperty :
<jsp:setProperty name="變量(以獲取的對象引用)" property="屬性(成員變量)" value="值(要設置的值)" />
//設置值
<jsp:setProperty name="cd" property="count" value="23" />
//給cd這個引用里面的count變量賦值為23 底層調用的setCount()方法(自己寫的),用于讓外界設置私有的成員屬性的值
getProperty :
//獲得值
<jsp:getProperty name="變量(以獲取的對象引用)" property="屬性(成員變量)" />
<jsp:getProperty name="cd" property="count" />
///獲取cd這個引用里面的count變量的值, 底層調用的是getCount()方法(自己寫的),用于讓外界獲取私有的成員屬性的值
this_getServletConfig_getServletContext_getRequestDispatcher :
this.getServletConfig().getServletContext()
.getRequestDispatcher("/_12_Servlet_Jsp/_01_ServletUseJsp.jsp")
.forward(request, response);
//當前類對象(this),調用getServletConfig()先獲得配置,在調用getServletContext()方法獲得上下文,在調用getRequestDispatcher()分發器,分發到指定文件中,在把當前的request和response傳入
getServletConfig :
this.getServletConfig();//獲得配置屬性
getServletContext :
this.getServletConfig().getServletContext();//獲得上下文
getRequestDispatcher :
this.getServletConfig().getServletContext()
.getRequestDispatcher("/_12_Servlet_Jsp/_01_ServletUseJsp.jsp")
.forward(request, response);//分發器,分發到指定位置;
新聞熱點
疑難解答