JSP相關

JSP,即Java Server Page是一種Java服務器動態網頁頁面。在傳統的HTML頁面的基礎上插入Java程序段和JSP標記,從而形成JSP文件。本質上講,JSP就是servlet,當JSP被第一次請求,服務器上的JSP引擎,Tomcat等可將JSP轉換爲servlet。接着被編譯稱爲Servlet字節碼,裝載實例化後進行實現。

一.JSP註釋:
1.在Java程序段可使用普通的Java註釋
2.html註釋
JSP註釋<%–服務器端註釋,不發送回客戶端,源代碼不可見–%>

JSP語法分爲三種類型:
1.編譯器指令 例如:<%@ page import=”java.io.*”%>
2.腳本語法 例如<%Java程序段%>
3.動作語法 ,,

二.JSP聲明:
<%!聲明語句;%>
<%! int i = 3;%>
<%! int a,b;String c;%>
<%! public int count();%> 注意:每個都以分號結尾。

問題:<%! int i = 3;%>與<% int b = 3; %>的區別
實驗:在中加入:
<%=i–%>
<%=b–%>
我們每次的去刷新頁面,發現i不斷減1,b始終不變。本質上講,底層上jsp轉換爲java代碼。a被解析成類的成員變量,b被解析成局部變量。servlet是單例模式,一次加載,多次使用。

<!--這是HTML註釋,會發送回客戶端,頁面源代碼可見-->
    <!--<%= new java.util.Date() %> -->

    <%--這是JSP註釋 ,不會發送回客戶端,頁面源代碼不可見--%>
    <%--new java.util.Date(); --%>

    <%--File file = new File("test.txt") --%>



    <%! int i = 3; %><br> <%--Jsp聲明,i被解析成類的成員變量 --%>
    <% int b = 3; %>  <%--Jsp腳本段,b被解析成局部變量 --%>


    The current date and time are 
    <%@ include file="Test_1.jsp" %> 

三.JSP動作元素
1.動作用於轉向頁面,在該指令後面的所有代碼都沒有機會執行了,因爲該頁面的流程已經轉向了另外一個頁面。
2.動作與指令存在着很大差別,page中的Include指令用於在JSP頁面轉換爲Servlet時就將被包含頁面嵌入,這也意味着Include指令包含頁面時,被包含文件的任何一部分發生變化,所有包含該文件的jsp文件需要被重新編譯。而使用include動作文件的變化總會被檢查到,不需要重新編譯。

四.JSP內置對象
JSP內置了九個對象,重點介紹以下三個request對象,session對象,application對象。
1.request對象
String getParameter(String name)
獲取客戶端傳送給服務器的指定參數的值
String[] gerParameterNames()
獲取客戶端傳送給服務器的所有參數名稱的枚舉

Enumeration e = request.getParameterNames();

            while(e.hasMoreElements())
                System.out.println(e.nextElement());

            String[] values = request.getParameterValues("age");

            for(String value:values){
                System.out.println(value);
            }
                    }

注意:getParameter方法是getParameterValues方法的特例,表示請求的參數值只有一個,如果請求參數值有多個,請使用getParameterValues方法。在多選框的情況下,需要使用getParameterValues方法來獲取用戶所選擇的多個複選框的值。

注意:
1.Request對象中的setAttribute與getAttribute方法一般都是成對出現的,首先通過setAtribute方法設置屬性和屬性值,然後通過getAttribute方法根據屬性獲取到與該屬性對應的對象值(獲取到之後一般進行向下類型轉換)。setAttribute與getAttribute方法都是在服務器端內部執行的,客戶端不知道服務器端是否執行過兩個方法。
2.request的getParameter方法的作用是獲取到客戶端 通過表單或url請求參數所發送過來的參數值,是客戶端與服務器端之間的交互,服務器端要想獲取到客戶端發送過來的數據,就需要使用getParameter來獲取。沒有setParameter方法。
3.request對象內數據的存活範圍就是在request對象的存活範圍內,當客戶端向服務器端發送一個請求,服務器向客戶端返回一個響應之後,該請求對象就被銷燬了;之後再向服務器端發送新的請求時,服務器會創建新的request對象,該request對象與之前的request對象沒有任何關係,因此在無法獲得之前request對象所存放的任何數據。
4.session對象內數據的存活範圍也就是session對象的存活範圍(只要瀏覽器不關閉,session對象就會一直存在),因此在同一個瀏覽器窗口,無論向服務器發送多少個請求,session對象只有一個。

2.application(應用對象):存活範圍最大的對象,只要服務器沒有關閉,application對象中的數據就會一直存在。**在整個服務器運行過程中,application對象只有一個。**
if(session.getAttribute("counter") == null){
            session.setAttribute("counter", "1");
        }
        else{
            String strnum = null;
            strnum = session.getAttribute("counter").toString();
            int icount = 0;
            icount =Integer.valueOf(strnum).intValue();
            icount++;
            session.setAttribute("counter", Integer.toString(icount));
        }       

以上爲application.jsp的代碼
1.當我們使用application對象,很好的實現了網頁的訪問計數器。因爲在服務器運行階段,始終都只有一個application對象,所以即使是多個瀏覽器客戶端訪問網頁,計數器始終增加。
2.當我們使用session對象代替,這也能大致實現了網頁訪問計數器,但是session會針對每個客戶端分配一個session,所以針對每個特定的客戶端都有訪問計數,但是不同客戶端互相不影響。
3.當我們使用request對象,這並不能實現網頁訪問計數器,因爲在我們每一個訪問網頁,都會向服務器發送請求,每一次請求都分配一個新的request的對象,因此上述語句只是在if代碼塊中運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章