【北京-22期】什么是jsp?jsp的內(nèi)置對象有哪些?

PPT 鏈接:https://ptteng.github.io/PPT/PPT/jsp_built-in_object.html#
視頻鏈接:https://v.qq.com/x/page/v05138bfb2a.html
大家好,我是IT修真院北京分院第22期的學員童志榮,一枚正直純潔善良的java程序員。

今天給大家分享一下,修真院官網(wǎng)Java任務4,深度思考中的知識點————JSP是什么?

1、背景介紹

百度百科是這么介紹jsp的:“jsp是一種動態(tài)網(wǎng)頁技術標準。它出現(xiàn)的根本原因是為了簡化servlet的設計,是由Sun Microsystems公司倡導、許多公司參與一起建立的一種動態(tài)網(wǎng)頁技術標準。”

從以上的介紹可以得出,servlet是先出的,jsp是后出的。

所以,想要了解jsp,先學習一下servlet。

QQ截圖20170607233205.png

在地址欄輸入"test3"訪問該servlet,瀏覽器返回結果如下。

QQ截圖20170607234254.png

如果你右鍵查看網(wǎng)頁源代碼,可以看到是非常普通的HTML代碼。

也就是,在servlet中,各種拼接HTML代碼,最終返回給客戶端一個HTML頁面。
我們想要做的動態(tài)的網(wǎng)站,如果所有的HTML頁面都通過這樣的方式來形成,那豈不太繁瑣了。
于是,誕生了jsp。

那么jsp是啥樣的呢?

QQ截圖20170608001029.png

去瀏覽器訪問的結果:


QQ截圖20170608001221.png

可以看到,jsp頁面中的

 <% for(int i=0; i<4;i++) {

等嵌入的長得像java代碼都消失了。而helloworld這句話出現(xiàn)了4次。于是猜測,jsp是否就是HTML頁面嵌入java代碼,然后通過某種機制去執(zhí)行這些java代碼,最終返回給我們想要生成的HTML頁面?

在系統(tǒng)的某個路徑下,你可以找到被tomcat解析成java類的jsp頁面。而且一個是.class文件,另一個是java文件。
這不正是我們所熟悉的java類和它被編譯成.class字節(jié)碼文件嗎?


QQ截圖20170608001706.png

打開test_jsp文件看一下,發(fā)現(xiàn)關鍵的部分:

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的執(zhí)行流程:

QQ截圖20170608003052.png

注意,只有jsp是新創(chuàng)建或是修改后第一次訪問時,jsp parser才會將其編譯成servlet程序。之后調(diào)用JSDK將對應的servlet程序編譯成servlet字節(jié)碼。
而且,它并非是將頁面本身發(fā)送給客戶端,而是把頁面執(zhí)行的結果發(fā)送給客戶端。
客戶端收到這個文件后,就可以正常顯示在客戶端了。

比如我要要訪問test.jsp,然后利用Tomcat的解析器,他會將jsp文件轉(zhuǎn)化為java文件,這個java文件就是servlet,
所以jsp本質(zhì)上就是servlet。
jsp能實現(xiàn)的,servlet也能實現(xiàn)。不管你最終寫的是一個多么復雜的jsp文件,它最后總能轉(zhuǎn)化為一個html文件。

jsp的9個內(nèi)置對象和4個作用域:

request           請求對象             類型 javax.servlet.ServletRequest        作用域 Request
response          響應對象              類型 javax.servlet.SrvletResponse        作用域 Page
pageContext       頁面上下文對象        類型 javax.servlet.jsp.PageContext       作用域 Page
session           會話對象              類型 javax.servlet.http.HttpSession      作用域 Session
application       應用程序?qū)ο?         類型 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 標簽表示 創(chuàng)建一個由class屬性指定的類的實例,然后把它綁定到其名字由id屬性給出的變量上。
那這里我創(chuàng)建了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內(nèi)置對象作用域</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內(nèi)置對象作用域</title>
</head>
<body>
這里是page02,是從page1轉(zhuǎn)來的<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 標簽表示 當走到這里的時候,頁面會跳轉(zhuǎn)到page02.jsp。 這剛好就是一個會話的場景,

QQ截圖20170608082156.png
QQ截圖20170608082208.png

現(xiàn)在我們刷新一下頁面,可以看到,page作用域變量的輸出的值為page02,原本它的page01已經(jīng)不見了。
request作用域的變量只在當前請求的中有效,當前的請求就是從page01到page02的一次跳轉(zhuǎn)。
所以它的值把page01和page02都顯示出來了。

session作用域的變量為當前會話,也就是只要瀏覽器不關閉,page02能一直疊加到上去。
application 對所有應用有效,也就是只要這個應用啟動著,都要疊加。

今天的分享就到這里啦,歡迎大家點贊、轉(zhuǎn)發(fā)、留言、拍磚~
下期預告:什么是session?如何在n個tomcat中實現(xiàn)session共享。


技能樹.IT修真院
“我們相信人人都可以成為一個工程師,現(xiàn)在開始,找個師兄,帶你入門,掌控自己學習的節(jié)奏,學習的路上不再迷?!?。


這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導。快來與我一起學習吧~
我的邀請碼:11081435,或者你可以直接點擊此鏈接:http://www.jnshu.com/login/1/11081435

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 1.學習內(nèi)容 JSP技術入門和常用指令 JSP的內(nèi)置對象&標簽介紹 EL表達式&EL的內(nèi)置對象 2.JSP技術入門...
    WendyVIV閱讀 2,172評論 1 18
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 1.什么是JSP (1)jsp全稱是Java Server Pages,它和Servlet技術一樣都是sun公司定...
    yjaal閱讀 3,686評論 5 99
  • 從三月份找實習到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,366評論 11 349
  • 哭與笑 你一會兒哭 一會兒笑 你哭時是甜的 笑時卻是苦的
    lily李老師閱讀 397評論 0 0