這裡是修真院前端小課堂,每篇分享文從 【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】 八個方面深度解析前端知識/技能,本篇分享的是: 【什麼是jsp?jsp的內置對象有哪些?】 1、背景介紹 百度百科是這麼介紹jsp的:“jsp是一種動態網頁技術標準 ...
這裡是修真院前端小課堂,每篇分享文從
【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】
八個方面深度解析前端知識/技能,本篇分享的是:
【什麼是jsp?jsp的內置對象有哪些?】
1、背景介紹
百度百科是這麼介紹jsp的:“jsp是一種動態網頁技術標準。它出現的根本原因是為了簡化servlet的設計,是由Sun Microsystems公司倡導、許多公司參與一起建立的一種動態網頁技術標準。”
從以上的介紹可以得出,servlet是先出的,jsp是後出的。
所以,想要瞭解jsp,先學習一下servlet。
在地址欄輸入"test3"訪問該servlet,瀏覽器返回結果如下。
如果你右鍵查看網頁源代碼,可以看到是非常普通的HTML代碼。
也就是,在servlet中,各種拼接HTML代碼,最終返回給客戶端一個HTML頁面。
我們想要做的動態的網站,如果所有的HTML頁面都通過這樣的方式來形成,那豈不太繁瑣了。
於是,誕生了jsp。
那麼jsp是啥樣的呢?
去瀏覽器訪問的結果:
可以看到,jsp頁面中的
<% for(int i=0; i<4;i++) {
等嵌入的長得像java代碼都消失了。而helloworld這句話出現了4次。於是猜測,jsp是否就是HTML頁面嵌入java代碼,然後通過某種機制去執行這些java代碼,最終返回給我們想要生成的HTML頁面?
在系統的某個路徑下,你可以找到被tomcat解析成java類的jsp頁面。而且一個是.class文件,另一個是java文件。
這不正是我們所熟悉的java類和它被編譯成.class位元組碼文件嗎?
打開test_jsp文件看一下,發現關鍵的部分:
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>測試</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\r\n");
out.write(" ");
for(int i=0; i<4;i++) {
out.write("\r\n");
out.write(" helloWorld! <br>\r\n");
out.write("\r\n");
out.write(" ");
}
out.write("\r\n");
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
2、知識剖析:
來看一下jsp的執行流程:
註意,只有jsp是新創建或是修改後第一次訪問時,jsp parser才會將其編譯成servlet程式。之後調用JSDK將對應的servlet程式編譯成servlet位元組碼。
而且,它並非是將頁面本身發送給客戶端,而是把頁面執行的結果發送給客戶端。
客戶端收到這個文件後,就可以正常顯示在客戶端了。
比如我要要訪問test.jsp,然後利用Tomcat的解析器,他會將jsp文件轉化為java文件,這個java文件就是servlet,
所以jsp本質上就是servlet。
jsp能實現的,servlet也能實現。不管你最終寫的是一個多麼複雜的jsp文件,它最後總能轉化為一個html文件。
jsp的9個內置對象和4個作用域:
request 請求對象 類型 javax.servlet.ServletRequest 作用域 Request
response 響應對象 類型 javax.servlet.SrvletResponse 作用域 Page
pageContext 頁面上下文對象 類型 javax.servlet.jsp.PageContext 作用域 Page
session 會話對象 類型 javax.servlet.http.HttpSession 作用域 Session
application 應用程式對象 類型 javax.servlet.ServletContext 作用域 Application
out 輸出對象 類型 javax.servlet.jsp.JspWriter 作用域 Page
config 配置對象 類型 javax.servlet.ServletConfig 作用域 Page
page 頁面對象 類型 javax.lang.Object 作用域 Page
exception 例外對象 類型 javax.lang.Throwable 作用域 page
同樣 來看一個例子:
這裡有兩個jsp頁面,page01和page02。
jsp useBean 標簽表示 創建一個由class屬性指定的類的實例,然後把它綁定到其名字由id屬性給出的變數上。
那這裡我創建了4個字元串緩衝類的實例,他們的作用域分別是page, request, session,application。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="pageVar" scope="page" class="java.lang.StringBuffer"/>
<jsp:useBean id="requestVar" scope="request" class="java.lang.StringBuffer"/>
<jsp:useBean id="sessionVar" scope="session" class="java.lang.StringBuffer"/>
<jsp:useBean id="applicationVar" scope="application" class="java.lang.StringBuffer"/>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP內置對象作用域</title>
</head>
<body>
<%
pageVar.append("page01");
requestVar.append("page01");
sessionVar.append("page01");
applicationVar.append("page01");
%>
<jsp:forward page="page02.jsp"/>
</body>
</html>
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="pageVar" scope="page" class="java.lang.StringBuffer"/>
<jsp:useBean id="requestVar" scope="request" class="java.lang.StringBuffer"/>
<jsp:useBean id="sessionVar" scope="session" class="java.lang.StringBuffer"/>
<jsp:useBean id="applicationVar" scope="application" class="java.lang.StringBuffer"/>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP內置對象作用域</title>
</head>
<body>
這裡是page02,是從page1轉來的<br/>
name
<%
pageVar.append("page02");
requestVar.append("page02");
sessionVar.append("page02");
applicationVar.append("page02");
%>
<h2>page</h2> = <%=pageVar.toString()%><br/>
<h2>request</h2> = <%=requestVar.toString()%><br/>
<h2>session</h2> = <%=sessionVar.toString()%><br/>
<h2>application</h2> = <%=applicationVar.toString()%><br/>
</body>
</html>
jsp forward 標簽表示 當走到這裡的時候,頁面會跳轉到page02.jsp。 這剛好就是一個會話的場景,
現在我們刷新一下頁面,可以看到,page作用域變數的輸出的值為page02,原本它的page01已經不見了。
request作用域的變數只在當前請求的中有效,當前的請求就是從page01到page02的一次跳轉。
所以它的值把page01和page02都顯示出來了。
session作用域的變數為當前會話,也就是只要瀏覽器不關閉,page02能一直疊加到上去。
application 對所有應用有效,也就是只要這個應用啟動著,都要疊加。
“我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,學習的路上不再迷茫。
這裡是技能樹.IT修真院:http://www.jnshu.com,初學者轉行到互聯網行業的聚集地。"
歡迎加IT交流群565734203與大家一起討論交流