1. 程式人生 > >JavaWeb系列之九(jsp,javabean,el表示式)

JavaWeb系列之九(jsp,javabean,el表示式)

 1.jsp:java server pages,java伺服器端的頁面
    sun公司提供開發動態網站的技術servlet jsp
    jsp會編譯成servlet,會放到tomcata的work目錄
    jsp的包含:html+java程式碼+jsp自身指令
    有三種方式:
    <%! %>
    <% %>
    <%= %>
    題目
    <%=x %>//把成員變數x的值輸出
    <% x=5; %>//把成員x變數賦值為5
    <% int x = 10; %>//在service方法裡面定義一個x值為10;
    <% this.x = 20; %>//把成員變數x的值賦值20
    <%=x %>//把方法裡面定義的變數x輸出
    <%! int x = 0; %> //定義一個成員變數x值是0
    A.0 10  B.10 20  C.0 20  D.20 0
    最終的結果是 0 10
2.jsp的註釋
    jsp:java server pages,java伺服器端的頁面
    在jsp裡面可以寫html註釋,可以寫java註釋,可以寫jsp自身的註釋
    三類註釋在jsp執行過程中,都會有  
    <!-- --><%-- jsp的註釋--%>java的三隻註釋
    jsp編譯成seervlet之後,html存在,java註釋存在,但是jsp註釋就不存在
    servlet顯示在頁面上,html註釋存在,java註釋和jsp註釋都沒有了
    <!-- html註釋 -->
    <!-- java的註釋 -->
    <%
    //單行註釋
    /*多行註釋
    */
    /**文件註釋
    */
    %>
    <!-- jsp的註釋 -->
    <%--jsp的註釋 --%>
3.jsp的指令
    語法:<%@ 指令的名稱 屬性="屬性值" %>
    jsp的質量包含三個指令:
    page:設定jsp頁面的資訊,<%@ page 屬性="屬性值" %>
        page指令裡面的屬性:
        language:支援的語言型別,現在只有java,
        extends:jsp編譯成的servlet會繼承哪個類:預設HttpJspBase
        session:在jsp裡面是否可以直接使用session物件,session屬性值true | false
        import:倒入一個包,可以寫在一起用逗號隔開
        可以分開匯入包
        <%@ page import="java.util.Date"%>
        <%@ page import="java.util.ArrayList"%>
        <%@ page import="java.util.List"%>
        可以寫在一起
        <%@ page import="java.util.List,java.util.ArrayList"%>
        buffer:輸出的緩衝區大小 8kb;
        autoFulsh:超出緩衝區是否正常使用
        erroPage:如果當前的jsp頁面出現異常,到錯誤頁        errorPage="錯誤頁面"
        isErroPage:在錯誤頁面中,是否可以顯示錯誤資訊。這個屬性一般是程式設計師除錯程式時候使用,把程式給客戶時候,
                    這個屬性一定設定成false
                    值 true和false,預設值是false,不會生成下面的程式碼
                    當在錯誤頁面中,設定這個屬性的值true之後,生成的servlet裡面,多出幾行程式碼
            java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
            if (exception != null) {
           response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
         }
        contentType:jsp最終編譯成servlet,最終使用瀏覽器編碼
        pageEncoding:jsp編譯成servlet,設定使用的編碼
        isElIgnored:jsp裡面死否忽略el表示式,改成true,寫el表示式,把它當成表示式
    include:jsp包含其他的jsp頁面,
        jsp包含其他的jsp頁面寫法:<%@ include file="包含的頁面">被包含的頁面不需要寫其他的內容,只要寫包含的內容,最終只編譯成一個servlet
        靜態包含的過程,相當於程式碼複製:
       
        包含不能傳遞引數,不能是變數,只需要寫檔案內容  
    taglib:引入標籤庫
        替代掉<%%>寫法:<%@ tagilb="標籤庫" prefix="標籤名稱"%>
 4.jsp的內建物件
    在jsp裡面的可以直接使用的物件
    resquest:HttpServletRequest裡面代表請求,獲取提交的引數,是一個域物件,設定值和取值
    response:相當於HttpServletResponse,代表響應,向頁面輸出內容
    session:相當於servlet裡面的HttpSession,也是域物件,範圍會話
    congfig:相當於ServletConfig,獲取servlet名稱,獲取初始化引數
    application:相當於 servlet裡面servletContext,域物件,範圍整個web專案,獲取全域性初始化引數
    exception:獲取異常欣喜,getMessage方法,需要把isErrorPage設定成true
    page:當成執行的servlet物件
    out:向頁面輸出內容,out.write()程式碼,out使用的是Jspwrite物件,使用reaponse.getwrite()使用printWrite物件,也可以向頁面輸出
    輸出機制:首先產生兩個緩衝區,一個是out緩衝區,一個是response緩衝區,out不會直接輸出,首先把內容放到out緩衝區,然後再放到response的緩衝區,最終通過緩衝區想頁面輸出
     
    pageContext:
        父類 JspContext
        pageContext:只能在jsp裡面使用,servlet裡面沒有頁面的概念
                        作用範圍:當前的jsp頁面
                        設定值 setAttribute(java.lang.String name, java.lang.Object value)
                        獲取值 getAttribute(java.lang.String name)
        程式碼
        <!-- 向pageContext域裡面設定值 -->
         <%
        pageContext.setAttribute("page1", "itcastpage1");
        %>
        <!-- 使用傳統方式獲取 -->
        <%=pageContext.getAttribute("page1") %>
        <hr/>
        <!-- 使用el表示式獲取 -->
        ${page1 }
            pageContext:可以向其他域物件裡面設定值
            setAttribute(name,value,scope)第一個引數:名稱 第二個引數:值 第三個引數:域名稱
            pageContext:可以向其他域物件裡面獲取值 1.${名稱}就可以獲取值 2.兩個引數:第一個引數是域物件的名稱,第二個引數是哪個域物件
            findAttribute():表示得到域物件裡面最小的值
            pageContext:可以獲取其他的八個內建物件  :pageContext.getSeesion
    四個域物件
        pageContext : 範圍是jsp頁面,這個物件只能在jsp裡面使用
        request :範圍一次請求,經常和轉發一起使用
        session  :範圍一次會話
        application:範圍整個web專案
    四個域物件都使用setAttribute設定值,使用getAttribute獲取值
5.jsp的動作標籤
    在jsp裡面有6個動作標籤:
    <jsp:動態標籤名稱 屬性="屬性值"></jsp:動態標籤名>
     <jsp:forward>:表示轉發的操作
     - jsp:forward page="轉發到路徑 不要帶專案名稱"></jsp:forward>
     - <!-- 使用jsp裡面的forward的動作標籤 -->
    <jsp:forward page="/jsp/hello.jsp"></jsp:forward>
   
    <jsp:include>:表示包含
           
    <jsp:param>:表示頁面傳遞引數
    * 程式碼   <!-- 使用jsp裡面的forward的動作標籤 -->
     <!-- 相當於在hello.jsp?id11=itcast200 -->
     <jsp:forward page="/jsp/hello.jsp">
    <jsp:param value="itcast200" name="id11"/>
     </jsp:forward>
  第二個類:操作javabean的動作標籤
    <jsp:useBean>:操作哪個javabean
    <jsp:setProperty>設定javabean的屬性
    <jsp:getProperty>得到javabean的屬性
6.JavaBean的簡介
    javabean就是一個java類,但是要遵循一定的書寫規範。
    遵循的規範:必須有一個公開的沒有引數的構造方法。javabean裡面私有的,屬性必須是通過公共方法暴露出來
    javabean的作用:存值和取值,封裝資料
    使用傳統方式來存取資料,
    使用jsp動作標籤封裝資料時候,表單輸入項的name值要一樣
7.javabean的內省(完成javabean的封裝)
    完成javabean資料的封裝
    使用到類
    Introspector:
    方法
    BeanInfo getBeanInfo(Class<?> beanClass) :得到javabean裡面的內容
    引數 Class類,javabean位元組碼檔案,
    三種方式可以得到Class類 類名.class   物件.getClass()  Class.forName("包類路徑")
    BeanInfo
    PropertyDescriptor[] getPropertyDescriptors()  :得到屬性描述,返回陣列
    PropertyDescriptor
    Method getReadMethod()  :表示讀的方法,javabean裡面的getXX方法
    Method getWriteMethod()  :表示寫的方法,javabean裡面的setXX方法
    Method
    invoke(Object obj, Object... args) :讓方法去執行
8.BeanUtil框架的使用
    作用:封裝資料到javabean
    是apache組織開發的一個小型操作javabean的api
     如果想要使用beanUtils,必須要匯入支援的jar包(匯入兩個jar包)
     web專案裡面如何匯入jar包
    把需要匯入的jar包,複製到webroot--WEB-INF--lib目錄下面,自動把jar包匯入到專案中
    注意:表單輸入項name的值必須要和javabean裡面的屬性名稱要相同
    使用到的類 org.apache.commons.beanutils 下面
    BeanUtils
    populate(Object bean, Map properties):完成資料的封裝
    兩個引數:第一個引數是javabean物件,第二個引數表單輸入的值和輸入的值,map集合
    建立jsp頁面,寫提交表單,表單提交到servlet裡面,在servlet裡面使用框架實現封裝資料到                javabean操作
    程式碼
    //得到表單提交的資料
    //建立javabe物件
    //使用框架實現封裝
    Person p12 = new Person();
    try {
        BeanUtils.populate(p12, request.getParameterMap());
    } catch (Exception e) {
        e.printStackTrace();  
    }
    使用框架,如果屬性的型別是基本資料型別和String型別完成封裝,但是如果不是這些型別出現轉換的異常
    ConvertUtils
        register(Converter converter, Class clazz)
        兩個引數:第一個引數是轉換器,第二個引數是轉換型別Class
        String d1 = (String) o;
    //把字串的日期型別轉換成Date型別
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    Date date = null;
    try {
    date = format.parse(d1);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    return date;
 9.el表示式
    用途:獲取域物件裡面的值
    語法: ${域物件的名稱}
    (1)使用el表示式獲取域物件的值
    程式碼
    <!-- 向四個域物件裡面設定值 -->
    <%
    pageContext.setAttribute("itcast", "pagevalue");
    request.setAttribute("itcast", "requestvalue");
    session.setAttribute("itcast", "sessionvalue");
    application.setAttribute("itcast", "applicationvalue");
     %>
     <!-- 使用el表示式獲取值 -->
     ${pageScope.itcast }
     ${requestScope.itcast }
     ${sessionScope.itcast }
     ${applicationScope.itcast }
    (2)使用el表示式獲取域物件裡面的陣列的值
    使用陣列的下標獲取,如果陣列的下標不存在,返回空字串""
    程式碼
    <!-- 使用el表示式獲取域物件裡面的陣列的值 -->
    <%
    String[] arr = {"tom","jack","lucy"};
    //把這個陣列放到域物件裡面
    request.setAttribute("arr", arr);
    %>
    <!-- 使用el表示式獲取數組裡面的值 -->
    ${arr[1] }
    (3)使用el表示式獲取域物件裡面集合裡面的值
    向域物件裡面放list集合
    使用集合下標獲取值
    程式碼
    <!-- 使用el表示式獲取域物件裡面list的值 -->
    <%
    List list = new ArrayList();
    list.add("AAAA");
    list.add("TTTT");
    list.add("wwww");
    request.setAttribute("list", list);
     %>
     ${list[10] }
    向域物件裡面map集合   
     <%
    Map map = new HashMap();
    map.put("aaa", "AAAA");
    map.put("bbb", "BBBB");
    map.put("ccc", "CCCC");
    request.setAttribute("map", map);
    %>
    ${map.aaa }
    (4)使用el表示式獲取域物件裡面的物件的屬性的值
    程式碼
    <!--  使用el表示式獲取域物件裡面物件的屬性的值-->
    <%
    Person1 p11 = new Person1();
    p11.setId("404");
    p11.setUsername("mary");
    p11.setAge("500");
    request.setAttribute("p11", p11);
     %>
    ${p11.id }
    ${p11.username }
    ${p11.age }
    (5)執行運算
    算數運算 + -
    程式碼
    <!-- 執行算術的操作 -->
    <%
    pageContext.setAttribute("aa", "11");
    pageContext.setAttribute("bb", "22");
    %>
    ${aa+bb }
    關係運算 > < <= >=
    邏輯運算 &&  ||
    三元運算子(三目運算)
    ${ user != null ? user.name : "" }
    ${ empty user ? user.name : "" }: empty表示空
    ${not empty user  ? user.name : "" }: not empty不是空
10、使用EL表示式操作web開發常用的物件
    el表示式裡面提供了11個隱含物件
    param:得到提交的引數,相當於request.getParameter();
    paramValues: 得到多個值,相當於request.getParameterValues();
    header: 得到頭資訊,相當於request.getHeader();
    initParam: 得到全域性的初始化引數
    pageContext:得到內建物件
     <!-- pageContext物件 -->
      ${pageContext.request }
      ${pageContext.response }