天天看點

javaWeb_JSP,EL及JSTL的使用

JSP:
    什麼是JSP:Java Server Pages (Java伺服器端頁面.)
    為什麼出現JSP:拟補Servlet自身的缺陷.
        JSP = HTML + Java + 自身的指令 标簽...`
    JSP的執行原理:
        JSP也會被翻譯成Servlet 解析執行.
    JSP的運作腳本:
        <%!   %>    :定義 變量 方法 和 類.   翻譯成全局變量、全局方法、内部類. 很少使用.
        <%=   %>    :表達式.不需要寫;       翻譯成out.println(  );中的内容.
        <%    %>    :定義 變量 不能定義方法. 翻譯成service方法内部的代碼.

        下面的JSP的代碼,在JSP中運作會輸出(  C  )
        <%=x %>
        <% x=; %>
        <% int x = ; %>
        <% this.x = ; %>
        <%=x %>
        <%! int x = ; %> 

        A.編譯錯誤   B.10  0   C.0  10   D.0  20

        <%! int x = ; %>       ---- 定義一個全局變量x = 0; 優先翻譯.
        <%=x %>                 ---- 輸出x  全局變量x   輸出0
        <% x=; %>              ---- 将全局變量指派為 x = 5;
        <% int x = ; %>       ---- 定義局部變量 x = 10;
        <% this.x = ; %>      ---- 全局變量x的值修改為了20;
        <%=x %>                 ---- 輸出x是局部變量 

    JSP的注釋:
        支援HTML文法:
            * HTML的注釋: <!--  注釋  -->

        支援Java代碼 :
            * Java的注釋:
                //          單行注釋
                /*  */      多行注釋
                /** */      文檔注釋

        本身JSP注釋:
            * JSP注釋:
                <%--  JSP注釋 --%>

        注釋的差別:
            JSP注釋:  隻會存在于源代碼階段(JSP階段).翻譯成Servlet執行的時候  注釋消失了.
            Java注釋: 會存在于源代碼及Servlet代碼接到 當由Servlet生成HTML輸出的時候 注釋消失了.
            HTML注釋: 會存在源代碼 及 Servlet的代碼 及 生成的HTML頁面 都會存在.

    JSP的指令:JSP指令用于提供整個JSP頁面的相關資訊以及用于JSP頁面與容器之間的通信。
        指令:page include taglib.
        文法:<%@ 指令名稱 屬性名稱="屬性值" %>

        page指令:
            language:   用于指定在JSP頁面中可以使用的語言.目前來講隻能是java. 
            extends:    用于指定JSP最終翻譯成Servlet 繼承的類.
                * 預設繼承:org.apache.jasper.runtime.HttpJspBase 可以修改 但是這個類必須是Servlet
            session:    用于指定JSP是否可以在頁面中直接使用session對象. 
                * session預設為true在頁面中預設可以直接使用session對象
                生成的servlet中 可以看到有一下兩句:
                    HttpSession session = null;
                    session = pageContext.getSession();
                * session值改為false  在頁面中不能直接使用session.
            import:     用于指定JSP中 導入的Java類的包.(import屬性 在page指令中 可以出現多次的.)
                * 預設導入的包:
                    import java.lang.*;
                    import javax.servlet.*;
                    import javax.servlet.http.*;
                    import javax.servlet.jsp.*;
            buffer和autoFlush: buffer用于指定JSP向頁面輸出的時候緩沖區的大小.預設 8kb.  
                autoFlush:用于指定超出緩沖區 預設是true 正常輸出  如果值改為了false 出現異常
            errorPage和isErrorPage:errorPage:用于指定JSP頁面出錯了.轉向到一個錯誤提示頁面.
                isErrorPage:在錯誤頁面中 檢視錯誤資訊. 預設值是false  将其值改為true.将在代碼中生成以下代碼:
                    Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
                    if (exception != null) {
                      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                    }
                在頁面中可以直接使用exception對象.

                企業中配置全局錯誤頁面:(*****)
                    在項目的web.xml中
                    <error-page>
                        <error-code>404</error-code>
                        <location>/404.jsp</location>
                    </error-page>

                    <error-page>
                        <error-code>500</error-code>
                        <location>/500.jsp</location>
                    </error-page>
            contentType和pageEncoding:contentType:用于指定JSP 浏覽器預設采用的編碼.
                pageEncoding:檔案儲存的時候 檔案被翻譯成Servlet的時候采用的字元集編碼
            isELIgnored:用于指定JSP頁面是否忽略EL表達式.  預設:false  預設不忽略.
                如果将該值改為true 。 不能在頁面中使用EL了.

            重點:import contentType和pageEncoding

        include指令:用于頁面的包含.(靜态包含.)
            <%@ include file=""%>
                file:被包含的頁面的路徑.
            在包含的時候 被包含的頁面 不需要寫html的結構.
            file:代表是被包含頁面的路徑
                * file的值不能是變量.
                * file的值不能傳遞參數.

            原理:
                相當于代碼的拷貝.最後翻譯成一個servlet 由該Servlet執行.

        taglib指令: 用于頁面引入标簽庫. 标簽庫 主要用于替換頁面中<%%>
            <%@ taglib uri="" prefix=""%>
                uri:标簽庫路徑.
                prefix:标簽庫的小名.

        JSP的三大指令:page include taglib.

        (*****)JSP的内置對象:(面試:JSP中内置對象有哪些?常用方法有什麼?對象代表的含義?)
            内置對象:在JSP中直接可以使用的對象.
            九個内置對象:
                pageContext、request、response、session、application、out、page、exception、config

                request:HttpServletRequest  代表客戶的請求
                response:HttpServletResponse    代表伺服器的響應
                session:HttpSession         代表一次回話
                application:ServletContext  針對一個web項目、伺服器的一個對象
                exception:Throwable     異常資訊
                config:ServletConfig    獲得Servlet配置資訊   getInitParameter();  getServletName();
                page:Object     代表jsp翻譯成Servlet類的對象
                pageContext:PageContext 代表一個域對象,隻能在目前頁面使用
                out:jspWrite    輸出對象

                ***** out對象  和  response.getWriter();  是不是一個對象?
                    肯定不是.out是JspWriter 而response.getWriter()獲得PrintWriter.

        JSP的四個作用範圍:
                pageContext:page範圍.
                request:請求範圍.
                session:會話範圍.
                application:應用範圍.

                ***** page指令  page對象  page範圍.

    JSP的标簽:(JSP的動作) JSP Action
        文法:
            <jsp:forward>       :轉發.
            <jsp:include>       :包含.(動态包含)
                * 動态包含 和 靜态包含的差別?
                    動态包含:包含運作結果、編譯多次
                    靜态包含:相當于直接代碼拷貝、編譯一次
            <jsp:param>         :傳遞參數.  (一般不用.)


            以下3個标簽與JavaBean有關.
            <jsp:useBean>       :
            <jsp:setProperty>   
            <jsp:getProperty>

            什麼叫做JavaBean: 作用封裝資料.  JavaBean:就是一個滿足了某種特定格式的Java類.
                格式:
                    這個Java類必須具有一個無參的構造函數
                    屬性必須私有化。
                    私有化的屬性必須通過public類型的方法暴露給其它程式,并且方法的命名也必須遵守一定的命名規範。
                        setXxxx   getXxxx
            JavaBean的屬性:
                * JavaBean的屬性是由誰決定的? 由get 或 set方法決定.

            <jsp:useBean>
                id:對目前類 取的唯一辨別 .
                class:JavaBean類的全路徑 。
                scope:page request session application 建立一個對象 對象放在某個域中.

            <jsp:useBean id="p" class="cn.itcast.bean.Person" scope="page"></jsp:useBean> 翻譯後 生成以下的代碼.
            cn.itcast.bean.Person p = null;
            synchronized (_jspx_page_context) {
                p = (cn.itcast.bean.Person) _jspx_page_context.getAttribute("p", PageContext.PAGE_SCOPE);
                if (p == null){
                  p = new cn.itcast.bean.Person();
                  _jspx_page_context.setAttribute("p", p, PageContext.PAGE_SCOPE);
                }
            }

            <jsp:setProperty property="id" name="p"/>
            <jsp:setProperty property="name" name="p"/>
            <jsp:setProperty property="sex" name="p"/>
            簡寫:
            <jsp:setProperty property="*" name="p"/>
                前提:表單中的name的值 于 JavaBean的setXxx滿足一緻.

            内省:獲得JavaBean的屬性.及對應屬性的讀和寫的方法.(了解.)
                沒有反射底層.

                java.beans.Introspector
                    * static BeanInfo getBeanInfo(Class<?> beanClass)  --- 獲得類的資訊.
                java.beans.BeanInfo 
                    * PropertyDescriptor[] getPropertyDescriptors() --- 獲得類的屬性描述.
                java.beans.PropertyDescriptor   
                    * String getName();
                    * Method getReadMethod() 
                    * Method getWriteMethod() 

            BeanUtils:Apache下的一個開源免費的類庫. *****會用.
                完成JavaBean的封裝.
                核心類:
                BeanUtils 
                    static void populate(Object bean, Map properties) 

                ConvertUtils 
                    static void register(Converter converter, Class clazz) 


EL:結合JSTL的标簽庫 替換 頁面中的<%%>
        文法:${ EL表達式. }

        * 獲得域對象值.
            * 傳統方式取值.
                <%=pageContext.getAttribute("name") %>
                <%=request.getAttribute("name") %>
                <%=session.getAttribute("name") %>
                <%=application.getAttribute("name") %>
            * 使用EL取值
                ${ pageScope.name }
                ${ requestScope.name }
                ${ sessionScope.name }
                ${ applicationScope.name }
            * EL的簡寫
                ${name}  :預設從小的範圍中找name的值 有沒有. 

                EL比傳統方式好:如果名稱寫錯了  EL 傳回一個 "" 空的字元串  而 傳統方式 傳回null.

            * 獲得域對象中存的數組的值.
                ${ 數組名稱[下标] }
            * 獲得域對象的List集合的值 .
                ${ list名稱[下标]}
            * 獲得域對象的Map集合的值 .
                ${ map的名稱.key }
            * 獲得域對象的對象屬性的值 .
                ${ 對象名稱.屬性名}

                [] 和 . 索引值 使用[]  . 一般是帶有屬性.(對象中的屬性.) 
                    如果map集合的key中有特殊符号 不能使用. 必須是用[] 如 ${ map["ddd.eee"] }

        * 執行運算.
            算數運算:
                ${ n1 + n2 }
            邏輯運作:

            關系運算:

        * 操作web開發常用的對象.
            個.
                param           :相當于request.getParameter();
                paramValues     :相當于request.getParameterValues();
                    * 這兩個用來接收參數的.

                header          :獲得請求的頭資訊  request.getHeader("");
                headerValues    :獲得一個key對應多個value的情況.
                    * 這兩個用來獲得請求的頭資訊.
                cookie          :獲得Cookie的資訊.
                    * 之前擷取Cookie  request.getCookies();  傳回一個Cookie的數組.在數組中查找指定名稱的Cookie.

                    ${ cookie.history.value } // 獲得了名稱是history的Cookie的value的值.
                initParam       :獲得全局初始化參數.

                pageContext     :就是PageContext内置對象.
        * 調用Java的方法

總結:
    JSP的腳本
        可以寫入java代碼<% %> <%! %> <%= %>
    JSP的注釋
        jsp注釋:<%-- --%>:隻存在就jsp中
        java注釋:<%// /* */ /** */>%:能存到編譯後的servlet中,倒也html頁面上就沒了
        html注釋:<!-- -->:一直都會存在
    JSP的指令
        <%@ 指令名稱   %>
        三大指令:page include taglib
    JSP的内置對象
        九大内置對象:pageContext request response session application out exception page config
    JSP的動作标簽
        <jsp:标簽 >
            forward
            include
            param
            userBean
            setProperty
            getProperty

            **** 動态包含與靜态包含
                靜态包含代碼  動态包含結果
    JSP的四個作用範圍
        pageContext
        request
        session
        application

JavaBean:java類
    BeanUtils
        導包    
        自定義類型轉換器
        BeanUtils.populate(Object obj, Map map);


    EL表達式:
        擷取值
            擷取四個域對象的值
            **** 擷取域對象村的值   數組List Map
        執行運算
            *算術運算
            *關系運算
            *邏輯運算
                *三元運算
        EL中操作web常用的對象
            pageScope
            requestScope
            sessionScope
            applicationScope

            param
            paramValues

            header
            headerValues

            cookie
            initParam

            pageContext