2013年4月25日 星期四

SCWCD重點整理-8.不含Script的JSP

8.不含Script的Jsp
  1. Jsp的生命週期: 到第五項僅會執行一次,之後每次接收到request會直接執行_jspService()
    1. Jsp轉譯(translate)成Servlet,此時為java檔
    2. 將.java編譯為.class
    3. 載入此servlet的class
    4. 產生此class的instance
    5. 呼叫jspInit():
    6. 呼叫_jspService()
    7. 呼叫jspDestory()
  2. Jsp語法元素
    元素




  3. Jsp的隱含物件
         API                             隱含物件
  4.     JspWriter                      out
        HttpServletRequest       request
        HttpServletResponse    response
        HttpSession                  session
        ServletContext              application
        ServletConfig                config
        Throwable                    exception
        PageContext                 pageContext
        Object                          page

9.EL (Expression Language)
  1. EL的隱含變數
    作用隱含變數使用範例
    對應於各作用域屬性的MappageScope ${pageScope.參數名稱}
    requestScope${requestScope.參數名稱}
    sessionScope${sessionScope.參數名稱}
    applicationScope${applicationScope.參數名稱}
    對應於請求參數的Mapparam${param.參數名稱}
    paramValues${paramValues.參數名稱[N]}, N由0開始
    對應於請求標頭的Mapheader${header["User-Agent"]} ,不能寫成 ${header.User-Agent}, 因"-"在EL為特殊自元
    headerValues${headerValues[參數名稱][0]}
    含cookie的Mapcookiecookie.參數名稱
    對應於Context初始參數的Map(not Servet的初始)initParam${initParam.參數名稱}(在web.xml中的context-param
    在EL中唯一非Map的隱含物件,指向pageContext的實際參考pageContext${pageContext.request.method}:取得發出的請求是用get還是post
  2. EL自定方法:利用EL呼叫java方法並傳回結果
    1. 在一個類別中,寫一個內涵公用且靜態方法的method,public and static,假設方法為 public static roll() {  }
    2. 撰寫TLD(Tag Library Descriptor) :須放置在WEB-INF底下或其子目錄下
      http://com.element.el 
      
          random
          com.element.el.DiceRoller
           
             java.lang.String roll()
          
      
      
    3. 在jsp中加上taglib ,ex: <%@ taglib prefix="test"  uri="http://com.element.el" %>,與tld的uri必須相同
    4. 在jsp即可透過 ${test : random()} 呼叫EL函式

10.在JSP中使用標準動作標籤

利用 標準動作(standard action)將Scripting程式碼取代掉
使用Scripting...
    <html><body>
       <% example.Employee emp= (example.Employee) request.getAttribute("employee");
        Person is: <%=emp.getName() %>
       </body></html>
利用usebean與 getproperty拿掉
      
    <html><body>
   
          Person is:
   
   </body></html>

當 <jsp:userBean>無法在指定的作用域找到名為employee的屬性時,自行建立一個新的bean,並且執行<jsp:useBean>主體內的動作,將值設定給employee的name
      
    <html><body>
   
          
   
   </body></html>

若想利用多型的方式使用bean,像是宣告的參考型別為Person,而實際產生的物件為employee時,達到像右邊程式的宣告效果  Person emp=new Employee() ,就必須使用type
      
    <html><body>
         
    </body></html>
type就是可以放抽像類別、介面等可當成參考型別;而class正是實體化時必須使用的真正物件型別

若在useBean只有 使用type,而沒有使用class,則useBean的主體永遠不會執行,因為只有當新建一個bean時,才會去執行useBean的主體
      
    <html><body>
   
          
   
   </body></html>

透過param,可將 request送出的請求參數值設定給指定的bean特性,此例是將 html form中欄位名稱為userName的值assingn給 employee的 name特性
      
    <html><body>
   
           
   
   </body></html>

若能遵守 html表單的欄位 name皆與 bean的name相同,則無須指定param與property的對映,<jsp:setProperty>會自動找出與bean特性相符的請求參數並將它們的值設定給名稱相符的bean特性
    <html><body>
   
           
   
   </body></html>

沒有留言:

張貼留言