1. 程式人生 > >JAVA遇見HTML--JSP篇

JAVA遇見HTML--JSP篇

1.Javaweb

    ①Web應用程式是一種可以通過Web訪問的應用程式。

    ②JavaWeb簡介:

            靜態網頁:

                    表現形式:網頁中的內容是固定的、不會更新。

                            不一定沒有動態元素。

                    所需技術:HTML、CSS。

            動態網頁:

                    表現形式:網頁中的內容通過程式動態顯示、自動更新(從資料庫讀出的)。

                            動態網頁的動態指的是能與使用者進行互動,比如登入時輸入正確的使用者名稱和密碼,系統會提示登入成功。

                    所需技術:HTML、CSS、資料庫、高階語言(Java、PHP)、JS、XML等。


2.Tomcat

    ①tomcat伺服器,常見的web伺服器。可以解析常見的標籤語言。

            是當今最流行的Servlet/JSP容器,免費、成熟、開源。

    

     ②WEB-INF是Java的WEB應用的安全目錄。客戶端無法訪問此目錄裡的網頁檔案,只有伺服器端才能訪問。

         index.jsp:預設被第一個訪問的頁面(在一個專案中),也可通過左下圖方式修改。使用localhost:埠號訪問。

        

        Sources:可以管理專案的目錄結構,並且能通過不同的顏色標識資料夾的用途!(有時候class類執行不起來,用之解決問題)

    ③修改虛擬路徑(即本地訪問網頁的URL):Run--Edit Configurations--Deployment...然後修改Application context修改即可。

    ④一個Tomcat伺服器上可以執行多個例項應用,但是每個例項應用之間要用不同的埠。

        預設情況下,Tomcat的埠號為8080。

        與其他伺服器埠造成衝突,可修改預設埠號,在Tomcat--conf--server.xml檔案中,將其中的8080更改成其他的埠號。

    <Connector port="8080"

        ......

    />

3.JSP頁面組成

    JSP:全名為Java Server Pages,是一個簡化的Servlet設計,JSP和Servlet都是在服務端執行的。

            它實現了在Java當中使用HTML標籤。

            JSP是一種動態網頁技術標準,也是JavaEE的標準。

    

 

其中:

    ①指令

            page指令:通常位於JSP頁面的頂端,同一個頁面可以有多個page指令。

                    <%@page 屬性1="屬性值1" 屬性2="屬性值1,屬性值2"...%>

                            language:指定JSP頁面使用的指令碼語言,預設值是java。

                            import:通過該屬性來引用指令碼語言中使用到的類檔案,預設值無。(即匯入包)

                            contentType:用來指定JSP檔案生成的頁面所採用的編碼方式,預設值是text/html,ISO-8859-1。

                                    ISO-8859-1預設是英文,頁面中不能出現中文。若是輸入中文,會出現亂碼。

                                    contentType的charset是指伺服器發給客戶端時的輸出內容編碼,更常用。

                            pageEncoding是jsp檔案本身的編碼。

            include指令:將一個外部檔案嵌入到當前Jsp檔案中,同時解析這個頁面中的JSP語句。

            taglib指令:使用標籤庫定義新的自定義標籤,在JSP頁面中啟用定製行為。

    ②註釋

            HTML的註釋

                    <!-- 我是註釋,客戶端在原始碼裡可以看見我。 -->

                    HTML註釋註釋不了JSP程式碼。

            JSP的註釋

                    <%-- 我是JSP(服務端)註釋.客戶端啥都看不見哦。 --%>

                    ps:這是服務端註釋,在客戶端檢視原始碼時可以看見空行(註釋的痕跡)。

            JSP指令碼中的註釋

                    <%

                            // 一行Java註釋。

                            /*多行Java註釋*/

                    %>

                    指令碼註釋也可以看到1行註釋的痕跡(檢視原始碼時)。

    ③宣告

            在JSP頁面中定義變數或者方法。

            <%! Java程式碼%>

    ④指令碼指令碼中只能寫Java程式碼表達。

            <%

                    out.println("keep studying");

             %>

            在指令碼中只能用Java註釋/JSP註釋。

    ⑤表示式

            在JSP頁面中執行的表示式。

            <%= 表示式 %>// 表示式不以分號結束。

    <%@ page contentType="text/html;charset=gbk" language="java" %>
    <html>
    <head>
        <title>配置wuwu</title>
    </head>

    <body>
        <h>啦啦啦,堅持下去。</h>
        <!-- 我是HTML註釋。 -->
        <%-- 我是JSP註釋。 --%>
        <%
          // 我是java單行註釋。
          /*
          *我是Java多行註釋。
          */
        %>// 指令碼註釋。
        <%!
          String today = "learn it by heart and use it greatly";
        %>
        今天,我學到了<%= today %>;
        2+3= <%= 2+3 %>
    </body>
    </html>

        

        JSP最終是編譯成Servlet來執行的,在編譯前會生成一個Java類:Servlet本質也是一個java類。

        -- JSP宣告<%! ... %>會被用來生成Java類的成員變數,如int i=i+1; String str="張三"; 

        -- JSP指令碼<% ... %>會被用來生成JSP Service方法裡面的方法程式碼,包括區域性變數宣告,指令碼中帶分號。

        -- JSP表示式<%= 表示式 %>也會被用來生成輸出的方法程式碼,例如out.print("你好"+str);

    ⑥JSP的頁面週期:

          

         第一次請求jsp頁面時,首先被執行的方法是構造方法。第一次請求時,JSP引擎會把這個JSP檔案轉換成為一個Servlet。                 Servlet是一個類,建立它的例項,就會呼叫Servlet的構造方法。

    基礎總結:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>

    <body>
        <h1>九九乘法表</h1>
        <%!
            // 返回99乘法表對應的HTML程式碼,並且通過表示式呼叫。
            // 方法1:
            String print() {
                String s ="";
                for(int i=1;i<=9;i++) {
                    int k=0;
                    for(int j=1;j<=i;j++) {
                        k=i*j;
                        s += i+"*"+j+"="+k+"&nbsp;&nbsp;";
                    }// 完成一次內層for迴圈,打印出一行。
                    s += "<br>";
                }
                return s;
            }
            // 方法2:
            void print0(JspWriter out) throws IOException {
                for(int i=1;i<=9;i++) {
                    int k=0;
                    for(int j=1;j<=i;j++) {
                        k=i*j;
                        out.println(i+"*"+j+"="+k+"&nbsp;&nbsp;");
                    }
                    out.println("");
                }
            }
            // JSP內建物件OUT,使用指令碼方式列印乘法表。
        %>
        <%= print() %<!-- 有返回值的函式。 -->
        <% print0(out); %><!-- 直接呼叫函式列印。 -->
    </body>
    </html>


4.內建物件簡介:

    JSP內建物件是Web容器建立的1組物件,不使用new關鍵字就可以使用。     

 <%
     int[] value = {60,70,80};
     for(int i:value) {
         out.println(i);
     }
 %>

    JSP的9大內建物件:

    Web程式的請求響應模式:使用者傳送請求(request)、伺服器給使用者響應(response)。

            如登入頁面:點選登入向伺服器傳送請求,在請求物件中封裝了使用者名稱和密碼。

                                伺服器端接收使用者的請求,判斷使用者名稱和密碼後,給客戶端傳送響應頁面。

    緩衝區:Buffer,即記憶體的一塊區域用來儲存臨時資料。

    

①out物件:是JspWriter類的例項,向客戶端輸出內容常用的物件。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>out內建物件</title>
    </head>
    
    <body>
        <%
            out.println("<h1>終南別業</h1>");
            out.println("行到水窮處、坐看雲起時。");
            out.getBufferSize();// 返回快取區總大小。
            out.getRemaining();// 返回緩衝區剩餘多少。
            out.isAutoFlush();// 返回緩衝區滿時,是自動清空還是丟擲異常。
            // out.clear();// 清除快取區的內容,在flush之後呼叫會丟擲異常。
            // 在輸出前若清除快取區資料,則得不到輸出內容。
            out.flush();// 將快取區的內容輸出到客戶端。
            out.clearBuffer();// 清除快取區的記憶體,在flush之後呼叫不會丟擲異常。
            int remain = out.getRemaining();
        %>
            緩衝區大小:<%= out.getBufferSize() %>
            緩衝區剩餘大小:<%= out.getRemaining() %>
            是否自動清除緩衝區:<%= out.isAutoFlush() %>
            清除後緩衝區剩餘大小:<%=remain%>
        <%
            out.close();// 關閉輸出流。
        %>
    </body>
    </html>

    

 

 ①②③:

            get與post:表單提交的兩種方式。

    <form name="表單名" action="動作" method="(提交方式)post/get">。

            action:表示這個表單提供給哪個動作(後端內容)去處理。

            get:以明文的方式通過URL提交資料,資料在URL中可以看到。提交的資料<=2KB。安全性較低但是效率比post方式高。

                  適合提交資料量不大,安全性不高的資料。比如:搜尋、查詢等功能。

            post:將使用者提交的資訊封裝在HTML HEADER內。適合提交資料量大,安全性高的使用者資訊。(比如:註冊、修改、上傳)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>login</title>
    </head>

    <body>
        <form  method="get" action="dologin.jsp">
            賬戶:<input  type="text"  name="usename" values="wjy"/>
            密碼:<input  type="password"  name="password"  values="123456"/>
            <input type="submit" value="登入">
    </body>
    </html>
    ......
    <head>
        <title>dologin</title>
    </head>
    <body>
        <h>登入成功</h>   
    </body>
    </html>

    

    

②request物件

            客戶端請求資訊被封裝在request物件中,通過它能瞭解到客戶的需求,然後做出響應,它是HttpServletRequest類的例項。

            request物件具有請求域,即完成客戶端的請求之前,該物件一直有效。常用方法:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>表單</title>
    </head>

    <body>
        <form action="②request內建物件.jsp" method="post" />
        使用者:
        <input type="text" name="usename">
        愛好:
        <input type="checkbox" value="看書" name="like">看書
        <input type="checkbox" value="旅遊" name="like">旅遊
        <input type="checkbox" value="運動" name="like">運動
        <input type="checkbox" value="購物" name="like">購物
        <input type="submit" value="提交">
        <br>
        <a href="②request內建物件.jsp?usename=測試URL傳引數">測試URL傳引數</a>
        <!-- 沒傳愛好資訊,丟擲空指標異常。 -->
        <!-- url傳參預設字符集為utf-8,傳遞中文不會出現異常 -->
    </body>
    </html>

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>request內建物件</title>
    </head>

    <body>
        <!-- 提交表單時,預設使用ISO...字符集,要想改變: -->
        <%
            request.setCharacterEncoding("utf-8");
                // 用來確保發往伺服器的引數以漢字的編碼來提取,設定從request中取得的值或從資料庫中取出的值。
                // 將設定的請求字元編碼設定為utf-8。
                // 指定後可以通過request.getParameter()獲取自己想要的字串。
                // 如果沒有提前指定,則會按照伺服器端預設的"iso-8859-1"來進行編碼。
                // 該方法只對post請求有效,對get請求無效。
                // 對於get請求,應該在server.xml中指定:URIEncoding=utf-8。
                // 注意:在執行request.setCharacterEncoding()之前不能執行request.getParameter()方法。
                // 原因:應該是在執行第一個getParameter()的時候,java將會按照編碼分析所有的提交內容。
                // 而後續的getParameter()不再進行分析,所以setCharacterEncoding()無效。
                // 而對於GET方法提交表單是,提交的內容在URL中,一開始就已經按照編碼分析提交內容,setCharacterEncoding()自然就無效。
            request.setAttribute("password","123456");
        %>
        使用者名稱:<%= request.getParameter("usename") %>
        獲得密碼屬性的值:<%= request.getAttribute("password") %>
        請求體的MIME型別:<%= request.getContentType() %>
        請求檔案的長度:<%= request.getContentLength() %>
        請求的上下文路徑:<%= request.getContextPath() %>
        請求的真實路徑:<%= request.getRealPath("request.jsp") %>
        協議型別及版本號:<%= request.getProtocol() %>
        伺服器主機名:<%= request.getServerName() %>
        伺服器埠號:<%= request.getServerPort() %>
        請求客戶端的IP地址:<%= request.getRemoteAddr() %>
        返回請求的字元編碼方式:<%= request.getCharacterEncoding() %>
        愛好:
        <%
            String[] s2 = request.getParameterValues("like");
            if(s2!=null) {
                for (String s0 : s2) {
                    out.println(s0);
                }
            }
        %>
    </body>
    </html>

    

    

③response物件:包含了響應客戶請求的有關資訊,很少被直接使用,是HttpServletResponse類的例項。

         此物件具有頁面作用域,即訪問一個頁面時,該頁面內的response物件只能對這次訪問有效,其他頁面的response物件對當前頁面無效。

        

        請求重定向和請求轉發區別

                請求轉發:伺服器行為,request.getRequestDispatcher("...").forward(request,response);

                        是一次請求,轉發後請求物件會儲存,位址列的URL地址不會改變。

                請求重定向:客戶端行為,response.sendRedirect("...");

                        等同於兩次請求,前一次的請求物件不會儲存,位址列的URL地址會改變。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>response內建物件</title>
    </head>

    <body>
        <%
            // 設定響應的MIMI型別。
            response.setContentType("text/html;charset=UTF-8");
                // 設定響應給客戶端的內容的編碼。
                // 一般使用response.setContentType()方法來設定HTTP響應的編碼,
                // 同時指定了瀏覽器顯示的編碼,因為他在執行該方法通知伺服器端以指定編碼進行編碼後,
                // 會自動呼叫response.setCharacterEncoding()方法來通知瀏覽器以指定編碼來解碼,
                // 使用此方法要在response.getWriter()執行之前或response提交之前。

            response.setCharacterEncoding("utf-8");
            
            PrintWriter outer = response.getWriter();
            out.println("Where is zbw?");
            outer.println("He is ...");// 總是提前於內建的out物件輸出。
            // 想要內建out物件出現在前面,就強制快取輸出。
            out.println("Where is zbw?");
            out.flush();
            outer.print("He is ...");
            // 請求重定向,讓客戶端發一個新請求,跳轉。
            // 用時要先註釋掉out.flush();
            response.sendRedirect("get.jsp");
        %>
    </body>
    </html>

    

④session物件

        JSP的一個內建物件,是HttpSession類的例項。

        session表示客戶端與伺服器的一次會話,會話儲存在伺服器的記憶體裡。

               一個會話指從一個客戶開啟瀏覽器並連線到伺服器開始,到客戶關閉瀏覽器離開這個伺服器結束。

        session是一個特定的時間概念。            

                session物件在第一個JSP頁面被裝載時自動建立,完成會話期管理。

                當一個客戶訪問一個伺服器時,可能會在伺服器的幾個頁面之間切換,伺服器應當通過某種方法知道這是一個客戶,就需要session物件。

                在每次會話中,有一個伺服器建立的sessionid,每次客戶端向服務端傳送請求時,都會將此sessionid攜帶過去,服務端會對此進行校驗。

                除非本次會話的所有頁面都關閉後,再重新訪問某個Jsp或Servlet將會建立新的會話。

                        原有會話還存在,舊的sessionid存在於伺服器端,等待銷燬。

        在伺服器的記憶體中儲存著不同使用者的session,與使用者一一對應。

    <%@ page import="java.text.SimpleDateFormat" %>
    <%@ page import="java.util.Date" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>session物件</title>
    </head>

    <body>
        <h1>session物件的使用</h1>
        <%
            SimpleDateFormat s = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            Date d = new Date(session.getCreationTime());
            session.setAttribute("usename","wjy");
            // 使用指定名稱將物件繫結到此會話。
            session.setAttribute("password","you guess");
            session.setAttribute("age",19);
            session.setMaxInactiveInterval(12);
            // 設定會話最長時間為12s。
        %>
        獲取session建立時間:<%= s.format(d) %>
        獲取session的ID編號:<%= session.getId() %>    
        <% --返回建立時,JSP引擎為它設的唯一編號。 --%>
        獲取從session中獲取使用者名稱:<%= session.getAttribute("username") %>    
        <%--如果沒有物件繫結在該名稱下,則返回null。--%>
        獲取session中儲存的屬性:
        <%
            String[] ss = session.getValueNames();
            for(String sss : ss) {
                out.println(sss+"&nbsp;&nbsp;");
            }
        %>    
        <%-- 返回一個包含此session的所有可用屬性的陣列。 --%>
        獲取會話的最長時間:<%= session.getMaxInactiveInterval() %>
    </body>
    </html>

    

      12秒後編號改變:

       session的銷燬方式

           ①呼叫session.invalidate()方法。

           ②session過期(超時)。

           ③伺服器重新啟動。

           若在末尾呼叫第一個方法,即頁面一執行完,會話就被銷燬。

       控制session物件的超時時間

           ①session.setMaxInactiveInterval(時間);// 單位是秒。

           ②在web.xml中配置:

   <session-config>
       <session-timeout>
           10// 單位是分鐘。
       </session-timeout>
   </session-config>

 

⑤application物件:是ServletContext例項。

        實現了使用者間的資料共享,可存放全域性變數。

        開始於伺服器的啟動、終止於伺服器的關閉。

        在使用者的前後連線或不同使用者之間的連線中,可以對application物件的同一屬性進行操作。

                在任何地方對application物件屬性的操作,都將影響其他使用者對此的訪問,它屬於整個伺服器。

    類比靜態類。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
         <title>application內建物件</title>
    </head>

    <body>
        <%
            application.setAttribute("usename","wjy");
            // 使用指定名稱將物件繫結到此會話。
            application.setAttribute("password","you guess");
            application.setAttribute("age","19");
        %>
        使用者名稱是:<%= application.getAttribute("usename") %>
        <!-- 執行完session頁面後,這裡就會得到使用者名稱、密碼、年齡等。 -->
        密碼是:<%= application.getAttribute("password") %>
        <%-- 返回與此會話中指定名稱繫結在一起的物件,如果沒有物件繫結在該名稱下,則返回null。 --%>
        application中的屬性有:
        <%
            Enumeration<String> e = application.getAttributeNames();
            while(e.hasMoreElements()) {
                out.println(e.nextElement());
                out.println("<br>");
            }// 返回所有可用屬性名的列舉
        %>
        JSP&Servlet引擎及版本號:<%= application.getServerInfo() %>
    </body>
    </html>

⑥page物件

        page物件就是指向當前JSP頁面本身,有點像類中的this指標,它是Java.lang.object類的例項。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>page內建物件</title>
    </head>
    
    <body>
        返回此Object的類:
        <%= page.getClass() %>
        返回Object的hash碼:
        <%= page.hashCode() %>
        把Object物件轉換成String類的物件:
        <%= page.toString()+"&nbsp;&nbsp;" %>
        <!-- 打印出:檔案儲存路徑+類名+hascode。 -->
        判斷此Object是否與指定的Object物件相等:
        <%= page.equals(page) %>
    </body>
    </html>

  

⑦pageContext物件

        提供了對JSP頁面內所有的物件及名字空間的訪問。

        可以訪問到本頁所在的session,也可以取本頁面所在的application的某一條屬性、相當於頁面中所有功能的集大成者。

        此物件的本類名也叫pageContext。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>pageContext內建物件</title>
    </head>

    <body>
        返回當前頁中的 Httpsession物件(session)的使用者名稱/密碼/年齡:
        在當前位置包含①out內建物件.jsp檔案:
        <% pageContext.include("①out內建物件.jsp"); %>
        <!-- 用時要註釋掉out.close();!! -->
        <%= pageContext.getSession().getAttribute("usename") %><br>
        <%= pageContext.getSession().getAttribute("password") %><br>
        <%= pageContext.getSession().getAttribute("age") %><br>
        返回當前頁的 ServletRequest物件 (request):
        <%= pageContext.getRequest() %>
        返回當前頁的 ServletResponse物件(response):
        <%= pageContext.getResponse() %>
        返回當前頁的Object物件(page):
        <% Object p = pageContext.getPage(); %>
        <%= p %>
        <!-- 設定time屬性及屬性值: -->
        <% pageContext.setAttribute("time",50); %>
        在指定範圍內取time屬性的值:
        <%= pageContext.getAttribute("time") %>// 50。
        返回time屬性的作用範圍:
        <%= pageContext.getAttributesScope("time") %>// 1。
    </body>
    </html>
    ......

    <head>
        <title>pageContext內建物件</title>
    </head>

    <body>
        使當前頁面重導到④session內建物件.jsp頁面:
        <% pageContext.forward("④session內建物件.jsp"); %>
    </body>
    </html>

    

⑧config物件:     

         a.config物件是在一個Servlet初始化時,JSP引擎向它傳遞資訊用的。

         b.在Servlet的配置檔案中,可以用一個或多個<init-param>標籤為servlet配置一些初始化引數。

             當servlet配置初始化引數之後,web容器在建立servlet例項物件時,自動將這些初始化引數封裝到ServletConfig物件中。

             並在呼叫servlet的init方法時,將ServletConfig物件傳遞給Servlet,即可通過該物件得到當前servlet的初始化引數資訊。

             此資訊包括Servlet初始化時所要用到的引數(通過屬性名和屬性值構成)以及伺服器的有關資訊(通過傳遞一個ServletContext物件)。

         c.如果希望jsp頁面可以獲得為自己本頁面設定的配置資訊,則必須通過為該jsp配置的路徑來訪問該頁面,因為只有這樣訪問jsp頁面才會讓配置引數起作用。

         d.config物件是ServletConfig的例項。

             返回含有伺服器相關資訊的ServletContext物件:ServletContext getServletContext();

             獲取配置引數的方法:String getInitParameter(String name);

             返回Servlet初始化所需所有引數的列舉:Enumeration getInitParameterNames();

        e.例項(獲得初始化引數)

            在web.xml中配置Servlet時,可以配置一些初始化引數。

    <servlet-mapping>
        <servlet-name>Hello4</servlet-name>
        <url-pattern>Servlet.initParam</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>Hello4</servlet-name>
        <servlet-class>Servlet.initParam</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>wjy</param-value>
        </init-param>
        <init-param>
            <param-name>passowrd</param-name>
            <param-value>123456</param-value>
        </init-param>
    </servlet>

            JSP程式碼:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>init param</title>
    </head>
    <body>
        <a href="../Servlet/initParam">get方法提交引數</a>
    </body>
    </html>

            Servlet程式碼(獲取初始化引數):

                在Servlet中可以通過ServletConfig介面提供的方法來取得這些引數。

        package Servlet;
        import javax.servlet.ServletException;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import java.io.IOException;
        import java.io.PrintWriter;
        /**
        * @Auther: wjy
        * @Date: 2018/10/14 20:19
        * @Description: 獲得初始化引數。
        */
        public class initParam extends HttpServlet {

            private String username;
            private String password;

            @Override
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                doGet(request,response);
            }

            @Override
            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                response.setContentType("text/html;charset=utf-8");
                PrintWriter out = response.getWriter();
                out.print("使用者名稱:"+this.getUsername());
                out.print("密碼:"+this.getPassword());
            }

            @Override
            public void init() throws ServletException {
                // 獲得初始化引數,並將值賦給username、password。
                this.setUsername(this.getInitParameter("username"));
                this.setPassword(this.getInitParameter("password"));
            }

            public String getUsername() {
                return username;
            }
            public void setUsername(String username) {
                this.username = username;
            }
            public String getPassword() {
                return password;
            }
            public void setPassword(String password) {
                this.password = password;
            }
        }

⑨exception物件

        exception物件是一個異常物件,當一個頁面在執行過程中發生了異常,就會產生這個物件。

        如果一個JSP頁面要應用此物件,就必須把isErrorPage設為true(即只有異常處理頁面才可以執行該物件),否則無法編譯。

        它實際上是java.lang.Throwable的物件。

        web無法直接訪問處理異常的頁面!!

    <%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="⑨exception內建物件.jsp"%>
    <html><!-- 若發生異常,交給此頁面處理。 -->
    <head>
        <title>Title</title>
    </head>
    
    <body>
        <!-- 配置算術異常,即執行時異常 -->
        <% System.out.println(100/0); %>
    </body>
    </html>

    <%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
    <html><!-- 有is...="true"才能使用exception物件 -->
    <head>
        <title>exception內建物件</title>
    </head>
    <body>
        異常訊息:<%= exception.getMessage() %><br>
        異常簡要描述:<%= exception.toString() %><br>
        異常軌跡:<%= exception.getStackTrace() %><br>
    </body>
    </html>

5.Cookie詳解

    ①http是超文字傳輸協議,也是無狀態協議

        http協議具有無狀態性,即伺服器不記得你,不管你訪問多少次

            當瀏覽器傳送請求給伺服器的時候,伺服器響應客戶端請求。

            但是當同一個瀏覽器再次傳送請求給伺服器的時候,伺服器並不知道它剛才訪問過。

    ②儲存使用者狀態的兩大機制:

            Session、Cookie

            所謂Cookie(小甜餅),是Web伺服器儲存在客戶端的一系列文字資訊。

    ③Cookie的常見用途:

            a.可以記錄瀏覽記錄。

            b.可以儲存登入記錄(如n時間內自動登入)。

            c."購物車"的處理,詳情見 輕量級Java EE......之JSP/Servlet

    ④Cookie的作用:

            a.對特定物件的追蹤

            b.儲存使用者網頁瀏覽記錄與習慣

            c.簡化登入。

    ⑤使用Cookie:

            建立Cookie物件:Cookie newCookie = new Cookie(String key, Object value);

            寫入Cookie物件:response.addCookie(newCookie);

            讀取Cookie物件:Cookie[] cookies = request.getCookies();

            JSP中建立與使用Cookie:

                    void setMaxAge(int expiry):設定cookie的有效期,以秒為單位。

                    int getMaxAge():獲取cookie的有效時間,以秒為單位。

                    void setValue(String value):建立cookie後,對cookie進行賦值。

                    String getName():獲取cookie的名稱。

                    String getValue():獲取cookie的值。(名稱對應值!!!)

     ⑥