Java EE基礎之JSP

來源:互聯網
上載者:User

標籤:config   編碼   except   地址   工作   成員   text   資訊   js for   

軟體152唐偉

一、JSP的基本原理以及和servlet的關係

     在沒有出現 JSP之前,我們訪問網站都是訪問的Servlet,通過它返回html代碼。就像下面這樣:

      out.write("\n");      out.write("\n");      out.write("<html>\n");      out.write("  <head>\n");      out.write("    <title></title>\n");      out.write("  </head>\n");      out.write("  <body>\n");      out.write("\t");      out.print("<p>hello world</>");      out.write("\n");      out.write("  </body>\n");      out.write("</html>\n");

     所有的html代碼都是用這種方式輸出到瀏覽器的,這種將html代碼耦合在Java代碼中的方式,直接導致前端程式員沒法直接參与編碼工作,後端程式員的工作量日益增大,這是低效的,是必然要被淘汰的。
     在不甘痛苦中,我們發明了JSP,這是一種將Java代碼耦合在html代碼中的方式,類似於這樣:

<html>  <head>    <title></title>  </head>  <body>  //輸出一個字串,具體文法,下面介紹    <p><%="hello,world"%></p>  </body></html>

     這是一個jsp頁面,實際上jsp就是servlet的草稿檔案,為什麼這麼說呢?每個jsp頁面都會對應一個servlet執行個體,在編譯的時候,編譯器會將這個jsp頁面讀取到servlet執行個體中。我們看看這個jsp對應的servlet執行個體的代碼:

      out.write("\n");      out.write("\n");      out.write("<html>\n");      out.write("  <head>\n");      out.write("    <title></title>\n");      out.write("  </head>\n");      out.write("  <body>\n");      out.write("\t\t<p>");     //<p>            out.print("hello,world");  //<%="hello,world"%>            out.write("</p>\n");     //</p>      out.write("  </body>\n");      out.write("</html>\n");

     對於jsp中的一般html頁面的標籤內容,直接是用字串的形式輸出,而對於jsp 文法部分,拿到servlet中執行之後將結果輸出。對於整個過程,我們只需要知道,jsp頁面中的所有內容都會在編譯器編譯階段被一個servlet全部讀取,對於其中的html代碼,以字串的形式返回,對於jsp文法,執行之後返回。本質上使用者雖然請求的是jsp頁面,為使用者返回結果的卻是servlet。
     那有人會問了,既然都是用servlet返回結果,那有了jsp和沒有的時候,效率體現在哪呢?我們需要明確的知道,沒有jsp之前,所有在servlet中的html代碼都是程式員手寫的,有了jsp頁面之後(等於有了模板了),編譯器幫我們完成了讀取jsp到servlet中的工作,我們只需要關心html元素布局即可。以上就是jsp和servlet的關係,不知道我有沒有說明白,但是為了能夠更好的理解後面的內容,建議你還是好好感受一下。

二、JSP的基本文法
     在介紹jsp的基本文法之前,我想先帶大家看看我們的Tomcat伺服器上的各個檔案夾都是什麼作用。(假設你用的Tomcat伺服器)

     這是Tomcat 9 伺服器上的基本檔案。我們挑幾個經常使用的,第一個webapps,這個目錄裡放的都是你的Web應用,也就是網站的總檔案夾。第二個是work目錄,這個目錄下存放的是對應的每個Web應用中所有使用的jsp檔案的對應servlet類,我們說過每個jsp檔案都會有一個對應的servlet類,他們就是存放在這個裡面的。包括原始碼.java和編譯後的.class檔案,其實很多人認為JSP好像和物件導向沒有什麼關係了,其實不然,因為每個servlet都是一個Java類,不然如何執行Java指令碼。(暫時先瞭解一下,後面會繼續介紹)第三個目錄是conf目錄,其中存放著一個重要的檔案web.xml,這是一個伺服器設定檔,可以定義Web應用的預設頁面(index.jsp,default.jsp等),就是你不輸任何一個頁面的地址,直接輸入欄位名時預設訪問的頁面。其他的一些目錄,等用到的時候在說吧。
     現在來介紹一下JSP的基本文法,每個servlet類中都會有三個方法,_jspinit(),_jspdestroy(),_jspservice()。第一個方法用來初始化servlet,不用我們關心,第二個方法用來銷毀servlet中方法,我們暫時也不關心。重點是第三個方法,這個就是jsp頁面中所有內容被讀取的目的地,這個方法主要用來響應使用者請求,返回html頁面回去的,記住這個方法,我們後面會使用到。第一個要介紹的jsp文法是,注釋。

<%--這是jsp注釋--%><!--這是html注釋-->

     注釋的文法和html的注釋文法很像,一個小細節,html的注釋在原始碼中是能夠看到的,而jsp注釋你在查看原始碼的時候是看不到的,也就是jsp注釋是沒有被返回給瀏覽器的。
     第二個文法,輸出運算式。<%=運算式%>

<html>  <head>    <title></title>  </head>  <body>        <%="hello,world"%>  </body></html>

     可以是常量運算式,也可以是Variant 運算式。還可以是一個函數的傳回值。

     第三個文法,jsp的聲明。<%!聲明內容%>

<html>  <head>    <title></title>  </head>  <body>        <%!            public int id;            public intshowId(){                return this.id;            }        %>  </body></html>

我們開啟servlet類看看,

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase    implements org.apache.jasper.runtime.JspSourceDependent,                 org.apache.jasper.runtime.JspSourceImports {//哪裡來的執行個體變數和執行個體方法?            public int id;            public int showId(){                return this.id;            }            //響應請求的方法public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)      throws java.io.IOException, javax.servlet.ServletException {      ........    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("\n");      out.write("\n");      out.write("<html>\n");      out.write("  <head>\n");      out.write("    <title></title>\n");      out.write("  </head>\n");      out.write("  <body>\n");      out.write("\t\t");      out.write("\n");      out.write("  </body>\n");      out.write("</html>\n");      ........    }}

     從上述servlet原始碼中,我們也可以看出來,凡是在jsp中聲明的變數或者方法都會成為servlet類對應的執行個體的成員。我們從一個執行個體來直觀的感受下。

<html>  <head>    <title></title>  </head>  <body>        <%!            public int id;        %>        <%=id++%>  </body></html>

     這一段代碼執行之後,每重新整理一次頁面輸出的數值就會加一。就是因為id是對應servlet執行個體的成員變數,這個執行個體沒有被銷毀,id的就會一直被儲存。就相當於你在_jspservice()方法中輸出了id 的值之後,將id加1一樣,只要沒有對jsp頁面修改,這個對應的執行個體就不會重新編譯產生,id的就不會因為重新整理而重設。

第四個文法是,JSP指令碼。我們可以在jsp頁面中使用java的for迴圈,if,else判斷等,只要是Java文法允許的,jsp頁面都是可以寫的。我們看一個例子:

<html>  <head>    <title></title>  </head>  <body>        <%for(int a=0;a<10;a++){%>            <p>Walker</p>        <%}%>  </body></html>

     這種文法可能在我們的實際項目中會經常的使用到,比如我要列舉資料庫中所有User的資訊,我們可以使用迴圈輸出,基本的格式前端給你了,你只要將對應的位置使用變數替換即可。像這樣:

<html>  <head>    <title></title>  </head>  <body>        <%foreach(String name in <%=returnList()%>){%>            <p>name</p>        <%}%>  </body></html>

     假設後台寫了個returnList方法返回資料庫中所有人的資訊。你會發現這樣寫會節省很多代碼,不至於有多少使用者就會有多少p標籤。

Java EE基礎之JSP

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.